소스 파일: Src 하위에 둔다.
헤더 파일: 내가 만들어서 exe 파일로 빌드할거라면 Src 하위에 둔다. lib 파일로 내보낼거라면 Inc 하위에 둔다.
lib, dll 파일: 라이브러리가 배포의 단위이다. build 파일에 둔다. 실제 배포 시 사용을 위해서는 헤더 파일이 함께 있어야 하기에, Inc 파일도 함께 배포한다.
PhysX 오픈소스를 나의 서버에 import 하기 위한 고군분투기..!
PhysX SDK를 빌드해서 include 디렉터리와 .lib 파일들을 ExternalLibrary 폴더에 복사했다.
dll 파일은 project와 동일한 경로에 옮겼으나, 이렇게 옮기지 않고 ExternalLibrary 폴더의 dll 파일을 참조할 수 있으면 좋겠다.
→ 확인해보니 오픈소스도 실행파일과 dll 파일을 같은 디렉터리에 두었다. 이렇게 하지 않으려면 LoadLibrary() 메서드를 통해 동적으로 읽으면 된다고 한다. 나도 실행 프로젝트와 같이 두자!
Test code에 있는 동작에서 에러가 발생한다.
D:\Code\Library\PhysX-106.5-physx-5.5.1-cy\physx\source\foundation\FdFoundation.cpp (180) : invalid operation : Foundation destruction failed due to pending module references. Close/release all depending modules first.
이상한 점 2가지
테스트 코드 복붙했는데 왜 release 단계에서 에러가…
→ 문제의 코드에서 release()가 누락된 코드를 발견하여 추가해 해결
// PhysX 정리 함수
void CleanupPhysX()
{
gScene->release();
gDispatcher->release();
gPhysics->release();
PxCloseExtensions(); // <- error 해결을 위해 추가.
gFoundation->release();
}
어떻게 error log 출력으로 cpp 경로가 표시되는 걸까??
library를 빌드한 뒤 lib 파일만 프로젝트로 복사해왔다. 그런데 라이브러리를 빌드할 때의 cpp 파일의 경로가 표시된다. 빌드할 때부터 어디서 경로를 저장하고 있다는 걸까? 일단 Debug 모드라 그런 것이라 생각하고, 언젠가 문제가 될 때 해결해보자.
프로젝트 서버에서 physX 엔진 동작 완료~!
간단하게 구동하기 위해 필요했던 정보들
아래 코드에 의해 서버에서 물리 엔진이 동작하고 있다. 그런데 디버거로 물체의 움직임을 확인해보면 60FPS로 동작하도록 구현한 것치고 대략 10FPS 밖에 안되는 것처럼 프레임이 업데이트 된다. 무슨 일일까?? 네트워킹을 포함한 다른 서버의 구현부에 의해 영향을 받고 있는 걸까? 스레드로 분리 필요한 걸까?
while (engineInstance.isRunning) {
engineInstance.stepPhysics(true);
// ...
}
코드를 개선하고자 Engine
class 일부를 수정했는데, NetworkManagerServer
class도 재컴파일 되었다. Engine과 NetworkManager는 서로 별개의 동작일텐데 흠 왜지? 하고 보니, 게임의 종료를 확인하기 위해 Engine의 isRunning
값을 참조하고 있었다.
Engine& engine = Engine::GetInstance();
// ...
while (engine.isRunning) {
// ...
}
개선하려면? 통보센터 같은 게 필요하다. 옵저버 패턴? Engine은 isRunning 종료 이벤트를 통보하고.