Voxel Horizon – 복셀 오브젝트에 변형이 일어날 경우 Light-map 갱신 이전의 깜빡임 방지하기

1. 복셀 오브젝트가 로켓을 맞고 뽀개지면 삼각형 데이터를 다시구성. 라이트맵 계산을 위한 패치데이터도 다시 구성. 2. 새로운 패치 데이터에 라이트맵을 다시 계산해서 써넣어야함. 3. 그런데 라이트맵 계산은 멀티스레드로 일괄적으로 처리함. 4. 유휴시간에 처리하므로 적어도 1프레임동안 라이트맵이 갱신되지 않고 어떤 라이트값이 들어가게 될지 모름. 5. 그래서 깜빡임 발생. [해결책] 변형된 오브젝트에 대해 즉시 라이트맵을 다시 계산. … More Voxel Horizon – 복셀 오브젝트에 변형이 일어날 경우 Light-map 갱신 이전의 깜빡임 방지하기

stack을 heap대신 stack에 올려서 얻은 성능 이득

제목을 말장난처럼 지어봤다. 다시 풀어서 쓰면 ‘stack(자료구조)를 heap대신 stack(stack memory per thread)에 올려서 얻은 성능 이득’ 이다. 64비트로 넘어오기 전에 32비트로만 개발하던 시절엔 stack자료구조가 필요한 경우 클래스나 함수형태의 stack 자료구조를 만들지 않았다. 그냥 함수 안에서 인라인 어셈블리로 push,pop명령어를 써넣었다. 그걸로 가변인자 함수도 만들고 그랬다. 64비트로 넘어오면서 인라인 어셈블리를 사용할 수 없게 됐다. 할수 없이 이후로는 … More stack을 heap대신 stack에 올려서 얻은 성능 이득

재귀호출 vs 루프문

재귀호출을하나 루프로 바꾸나 요새 cpu에선 성능 차이 별로 안난다고 생각했었다. 틀렸다. 그렇지 않다. 재귀호출이 훨씬 느리다. 재귀호출을 해도 전체적으로 보면 크게 성능이 떨어지지 않는거지 루프문만큼 빠른것은 아니다. 예의 8x8x8복셀에서 한 면에서 출발해서 x,y,z축에 대해 반대편 면까지 뚫린 구멍이 있는지 탐색하는 코드가 있다. 어떤 복셀 오브젝트의 인접한 오브젝트에 의해 가려질 수 있는가를 체크하기 위한 코드이다. 나는 … More 재귀호출 vs 루프문

D3D12예제에서 Constant Buffer를 System Memory에 두는 이유.

D3D12 예제를 보면 Constant Buffer를 system memory에 만들어 사용하고 있다. (CPU write, GPU read). D3D11에선 Constant Buffer를 GPU메모리에 두느냐, 시스템 메모리에 두느냐에 따라 성능차이가 꽤 난다. 20-30%정도는 차이가 나는것 같다. D3D12에서 테스트해보면 대략 10%정도 성능 차이가 난다. 당연히 GPU메모리에 두는 쪽이 빠르다. 크다면 크고 작다면 작은 수치다. 그럼 왜 D3D12예제에선 시스템 메모리에 Constant Buffer를 잡았을까. … More D3D12예제에서 Constant Buffer를 System Memory에 두는 이유.

C++ exception의 내부 구현에 대한 잡설

예전에 포프님 방송에서 잠깐 exception 얘기가 나왔는데 어떤 인간이 SEH와 C++익셉션은 다르다면서 날 막 깠다. 싸우기 싫어서 그냥 피했는데 오늘 다른 지인분과 대화중에 익셉션 얘기가 나와서 생각난김에 좀 따라가봄. 일단 try절을 시작하기 전에 함수 도입부를 보면 SEH와 똑같다.   그리고 throw를 호출했을때 코드를 따라가보면 다음과 같이 _NtRaiseException을 호출하는데 보다시피 시스템 서비스다. 사실상 인터럽트 일으키는거 맞잖아. … More C++ exception의 내부 구현에 대한 잡설

win32 + C++/CX프로젝트에서 ConformanceMode때문에 생기는 문제

https://blogs.msdn.microsoft.com/vcblog/2017/11/15/msvc-conformance-improvements-in-visual-studio-2017-version-15-5/ Visual Studio 2017 15.5로 업데이트 하면 ConformanceMode란 놈을 디폴트로 켜버린다. C++ 표준을 준수하게 하는 모드라고 한다.(니미 난 내 제품 만드는게 중요한데 C++표준이 알게 뭐냐. 사실상 게임업계에선 MSVC가 표준이지.) 이전에 만든 프로젝트라면 상관없지만 새로 만드는 프로젝트는 ConformanceMode가 켜지게 된다. pure UWP 프로젝트는 아직 테스트 안해봤지만 Desktop App에서 C++/CX를 이용해서 UWP API를 호출하는 경우 문제가 된다. … More win32 + C++/CX프로젝트에서 ConformanceMode때문에 생기는 문제

Voxel Horizon 최근까지 진행상황.

Voxel Horizon 최근까지 진행상황.   pure UWP버전 / Desktop Bridge 버전을 똑같은 기능 수준으로 동시 진행중. 게임 컨트롤러만으로 로그인,캐릭터 생성, 기본 플레이 가능. XBOX ONE에서 플레이 가능. 아직은 Windows Phone에서도 플레이 가능. MS Live Account로 로그인 가능. 최소한의 꼭 필요한 UI는 일단 다 맞춰넣었다. 두가지 버전 모두 AppX로 패키징 후 Windows App Certification Kit 테스트 … More Voxel Horizon 최근까지 진행상황.

Desktop App + UWP App + UWP App Service를 이용한 MS live account 인증

Desktop App + UWP App + UWP App Service를 이용해서 기본적인 MS Account 로그인을 구현했다. 이번 프로젝트에선 회원가입을 받지 않을 생각이다. 회원 가입용 웹사이트도 만들지 않는다. 이전에는 두 가지 방식을 사용했다. 웹사이트에서 회원가입을 받으면 웹사이트에서 Game DB에 연결하여 계정 생성 steam로그인일 경우 클라이언트에서 steam API를 통해 steam id를 얻는다. 게임서버로 steam id를 전송하고 게임서버는 서버용 … More Desktop App + UWP App + UWP App Service를 이용한 MS live account 인증

Windows Application Packaging Project를 이용해서 만든 Destktop Bridge app에서 UWP App과 interop하기.

최근 Visual Studio 15.4.1에 Windows Application Packaging Project 템플릿이 추가됐다. 이 템플릿을 이용하면 손쉽게 데스크탑 어플리케이션을 AppX로 패키징할 수 있다. 그 방법이 너무나 쉬우므로 자세한 설명은 달지 않는다. 링크 참조. https://blogs.windows.com/buildingapps/2017/10/18/visual-studio-2017-update-4-makes-easy-modernize-desktop-application-make-store-ready/ 그런데 github의 MS샘플도 그렇고 어디에도 이 템플릿을 사용했을때 uwp app과 interop하는 예제는 없다. 내가 원하는 샘플과 자료는 아래 링크의 내용이다. https://docs.microsoft.com/en-us/windows/uwp/porting/desktop-to-uwp-extend 그런데 빌어먹을….이건 VS2017에 … More Windows Application Packaging Project를 이용해서 만든 Destktop Bridge app에서 UWP App과 interop하기.

SW Occlusion Culling 정리

요 근래 계속 붙잡고 있던 SW Occlusion Culling을 거의 마무리 지었다. 물론 오래전에 HW Hierarchical Occlusion Culling을 구현해서 지금까지도 잘 사용하고 있다. SW Occlusion Culling을 만든 이유는 HW Occlusion Culling을 대체하기 위함이 아니다. 전혀 아니다. 이것은 완전히 용도가 다르다. 현재 복셀 월드는 KD-Tree로 공간이 분할되어있다. 그리고 보여지는 오브젝트를 찾아내기 위해 트리를 탐색한다. 이 탐색 과정에서 … More SW Occlusion Culling 정리