Voxel Horizon – 소유영역 처리

한참 복셀을 편집중인데 어떤놈이 와서 내가 쌓은 복셀조각을 파괴하거나 내가 복셀을 배치하려는 영역에다 지가 복셀을 쌓거나 하면 곤란하다. 그래서 그 방지대책을 세웠다. 1. owner가 설정되지 않은 복셀 오브젝트(4m x 4m x 4m)영역에 대해 한개의 복셀이라도 추가하면 행위자의 계정 serial이 owner serial로 등록된다. 2. owner serial이 등록된 오브젝트 영역에 대해서 다른 플레이어들은 일체의 편집행위를 할수 없다. … More Voxel Horizon – 소유영역 처리

Surface book에서 나타나는 60fps 제한 현상.

Windows 10 1709(rs3)부터 서피스북1/2에서 DirectX 어플리케이션(게임등)을 실행할때 60FPS를 넘기지 못한다. 이전에 유튜브에 올렸던 참고 영상. Windows 10 1709가 릴리즈 되고나서 페이스북과 트위터에서 몇번인가 언급했었다. [현상 및 직접적인 원인] 이 성능 저하의 문제는 GPU의 성능 자체와는 상관이 없다. 순전히 swap chain의 처리방법에서 발생한다. 정확히는 최종적으로 Windows Destkop Windows Manager(이하 DWM)이 어플리케이션의 렌더타겟 버퍼를 데스크탑 윈도우에 조합(composition)할때 … More Surface book에서 나타나는 60fps 제한 현상.

DirectX Raytracing 샘플소스 5분 분석 소감.

DirectX Raytracing 샘플 소스 잠깐 보고 날림으로 분석한 소감. 1) ID3D12Device로부터 QueryInterface() 해서 ID3D12RaytracingFallbackDevice포인터 얻음. 2) ID3D12RaytracingFallbackDevice로부터 QueryRaytracingCommandList()를 호출해서 ID3D12RaytracingFallbackCommandList포인터를 얻음. 3) D3D12_RAYTRACING_GEOMETRY_DESC구조체에 지오메트리 데이터(삼각형데이터)를 채워서 블라블라 커맨드로 전달할 지오메트리 데이터들을 만듦. 4) 위에서 만든 지오메트리 데이터를 ID3D12RaytracingFallbackCommandList::BuildRaytracingAccelerationStructure()에 넣고 호출. 이것으로 레이트레이싱을 위한 d3d12 커맨드 작성임. 5) 위에서 작성한 커맨드리스트를 ID3D12CommandQueue::ExecuteCommandLists()에 넣고 호출. 6) fence걸고 … More DirectX Raytracing 샘플소스 5분 분석 소감.

UWP App에서 DLL의 Implicitly Linking 에 실패하는 경우.

UWP에서 DLL을 암시적( Implicitly)으로 link할때 다음과 같은 에러를 만날 수 있다. The program ‘[xxxx] xxxx.exe’ has exited with code -1073741515 (0xc0000135) ‘A dependent dll was not found’. 프로젝트에 실제 dll파일을 포함시키지 않아서, 정말로 해당 dll이 AppX폴더 밑에 존재하지 않아서 이 에러를 만나는 경우가 대부분이지만, 파일은 멀쩡히 존재하는데 link에 실패하는 경우도 있다. 예를 들어보자. 일부 함수를 … More UWP App에서 DLL의 Implicitly Linking 에 실패하는 경우.

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에 올려서 얻은 성능 이득

멀티코어지원을 안해서 게임이 느려…?

게임 관련 사이트나 하드웨어 사이트의 좇문가들은 멀티코어를 지원하지 않아서 게임 성능이 오르지 않는다고 주장한다. 실제로 개발사가 멀티코어를 제대로 지원하지 못하는 경우도 있다. 하지만 열심히 멀티코어를 활용하려고 노력한다해도 대부분의 경우 별로 안빨라진다. 그에 비해 버그는 100배쯤 는다. 그것도 잡기 힘든 멀티 스레드 버그가. 우선 게임에서 병렬처리할 요소라고 해봐야 픽셀단위, 버텍스 단위 억세스다. 즉 삼각형에 텍스처 입혀서 … More 멀티코어지원을 안해서 게임이 느려…?

재귀호출 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의 내부 구현에 대한 잡설