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

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

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

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

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에 두는 이유.

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 인증

SW Occlusion Culling 정리

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

Voxel Horizon 게임서버에 NPC를 넣었다.

NPC를 넣었다. Voxel Horizon에서는 기본적인 충돌처리를 ‘타원체 vs 삼각형’ , ‘타원체 vs 타원체’로 충돌처리를 해서 미끄러짐 벡터를 구하는 방식으로 처리하고 있다. 이런 방식에선 NPC가 복셀 사이에 걸려서 제대로 움직이지 못할 가능성이 높다. 그래서 처음부터 NPC는 넣지 않을 생각이었다. 그러나 나 혼자 이 게임을 서비스한다면 분명 서버에 동시접속자 수가 10명도 안될것이다. 혹은 로컬서버로 플레이하고 있다면 틀림 … More Voxel Horizon 게임서버에 NPC를 넣었다.

SSAO적용.

SSAO적용. 아직 손볼곳이 많지만 대충 구현은 완료. 현재 directional라이트만 적용했더니 복셀이 너무 밋밋해 보여서 SSAO를 넣었다. 확실히 복셀 오브젝트에선 SSAO가 있는 편이 나은것 같다. 캐릭터에선 빼는게 좋겠고. Compute Shader로 구현했는데 덕택에 UWP on XBOX버전엔 당장은 적용 못한다. UWP on XBOX에선 DX Feature Level 10까지만 지원하니까 Compute Shader를 쓸 수 없다. Pixel Shader버전으로 다시 짜줘야하는데 귀찮네. … More SSAO적용.

Hi-Z Occlusion Culling vs D3DQuery Occlusion Culling

HW Occlusion Culling을 써야할 상황이라면…명백하게 D3DQuery보다 Hi-Z Occlusion Culling이 빠르다. 다만 Hi-Z Occlusion Culling보다는 D3DQuery쪽이 더 정밀하게 culling할 수 있다. 일반적으로 카메라가 변경되거나 오브젝트의 배치가 변경될때만 Occlusion Culling을 한다. 당연히 카메라가 고정된 상태에선 Hi-Z는 D3DQuery든 쓸 수 있는 culling은 다 쓰는게 프레임 레이트가 잘 나온다. 문제는 주인공 캐릭터가 움직이거나 해서 카메라가 변경될때인데 이 경우 Hi-Z … More Hi-Z Occlusion Culling vs D3DQuery Occlusion Culling

가려진 오브젝트 culling 아이디어

예전에 BSP Tree + ROOM/PORTAL방식으로 만들었던 게임에 전용 맵툴 없이 자동화된 방법으로 culling을 적용할 방법을 생각해봤다. Occlusion Culling은 GPU로 하는게 무조건 빠르지만 무조건 HW Occlusion Culling에 의존하면 occluder와 occludee를 그릴때 오브젝트 개수를 컨트롤할수가 없다.일단 GPU로 넘어가면야 빠르겠지만 그 과정도 상당히 길다. 그래서 CPU단에서 어느 정도는 컬링이 된 상태로 HW Occlusion culling을 시도해야한다. 그런 차원에서 트리를 … More 가려진 오브젝트 culling 아이디어