Game Dev – 패킷 전송을 위한 복셀 데이터 압축

패킷으로 전송하기 위한 복셀 오브젝트의 복셀 데이터 압축. 2월말에서 3월 초까지 작업내용이다. 나중에 블로그에 포스팅 하려고 페이스북 타임라인에 대충 메모를 해놨었다. 잊고 있었는데 오늘에서야 정리해서 포스팅한다. Voxel Horizon에서 플레이어가 게임에 접속하면 현재 위치 기준으로 주변의 복셀 오브젝트들을 긁어다가 네트워크를 통해 플레이어의 디바이스에 전달한다. 복셀 데이터는 일단 컬러값(인덱스)를 빼고 순수 지오메트리 데이터는 복셀 한칸당 1bit다. 8x8x8짜리 … More Game Dev – 패킷 전송을 위한 복셀 데이터 압축

CUDA측 Tree자료구조 메모리 줄이기.

맨날 테스트하는 복셀 1500만개짜리 맵에서 tree구조의 메모리를 71MB 소모했었다. 정확히는 node의 메모리는 얼마 안되고 말단 node(leaf)에서 들고있는 삼각형 데이터의 메모리가 대부분이다. 교차 테스트를 위해서 leaf마다 삼각형배열을 가지고 있는데 이게 메모리를 제법 차지한다. 외장 그래픽 카드를 장착한 데스크탑이나 게이밍 노트북에선 이 정도 메모리 소모는 별 문제가 아니다. 하지만 내 테스트머신중 하나인 Surface book 1은 GPU메모리가 1GB밖에 … More CUDA측 Tree자료구조 메모리 줄이기.

기능 지원 안되는 디바이스 지원에 대한 잡설

코룸 온라인 개발하던 시절에… 베타테스트 직전에 운영팀에서 pc방을 돌면서 게임을 테스트했다. 그리고 버그 리포트라는게 전달이 됐는데 그중에 RIVA TNT에서 크래시한다는 내용이 있었다. 당시 RIVA TNT에서 압축 테스처를 지원하지 않기 때문에 생긴 문제였다. 아마 2003년 즈음이었을텐데 그때 많이 쓰던 그래픽 카드는 GeForce 2/4 MX, 고급군으로는 GeForce 3/4 TI 였다. 코룸온라인은 최소사양이 RIVA TNT였다. 나한텐 안물어보고 정했던것 … More 기능 지원 안되는 디바이스 지원에 대한 잡설

Voxel Horizon프로젝트에 CUDA를 적용하고 있는 이유

1. 코딩/디버깅환경이 거지같은 Compute Shader를 작성하기 전에 성능을 가늠해볼수 있다. 보수적으로 잡았을때 Compute Shader가 CUDA의 50% – 80%정도 나온다고 예측해보면 CUDA코드가 CPU코드보가 3-4배 빠르면 충분히 GPU코드를 추가 작성할 가치가 있다. 2. Compute Shader를 추가작성하기로 결심했더라도 CPU코드 -> Compute Shader로 바로 가기는 어렵다. 디버깅 환경이 거지같으니 코드 짜놓고도 이게 맞는건지 틀린건지 확인하기 어렵다. CPU -> Compute … More Voxel Horizon프로젝트에 CUDA를 적용하고 있는 이유

CUDA에서의 stack 구현

KD-Tree를 순회할땐 stack이 필요하다. stack을 구현한다는게 CPU코드에선 아무 문제도 아니지만 CUDA에선 고민이 좀 필요하다. CUDA에서 자유롭게 쓸 수 있는 메모리는 Global Memory이다. 그런데 겁나 느리다. 시스템 메모리보단 엄청 빠르지만 GPU보단 한참 느리다. stack을 global memory에 올려놓으면 아무래도 억세스할때마나 stall이 걸린다. CUDA에서 사용할 수 있는 고속 메모리는 shared memory가 있다. 여기다 stack을 올려놓으면 물론 빠르다. 그런데 … More CUDA에서의 stack 구현

CUDA를 이용한 복셀 월드의 라이트맵 계산 – 성능개선

엊그제 포스팅했던 CUDA를 이용한 라이트맵 베이킹의 성능향상에 대한 얘기다. 좀더 GPU를 빡시게 사용하려고 cuda Stream + 멀티스레드 까지 적용했는데 생각보단 성능이 많이 오르지 않는다. 프로파일링 해보니 Occupancy가 이론상 50% 달성할 수 있는데 실제로는 29.3%만 달성한 것으로 나온다. Occupancy가 영 만족스럽지 못하다. 그래서 이런저런 튜닝을 좀 했다. 오랫만에 Occupancy Calculator를 실행해서 SM 5.2와 6.1기준으로 숫자를 넣어 … More CUDA를 이용한 복셀 월드의 라이트맵 계산 – 성능개선

CUDA를 이용한 복셀 월드의 라이트맵 계산

복셀 월드의 라이트맵 계산을 CUDA로 하도록 만들었다. 2010년에 이미 CUDA로 라이트맵을 구웠기 때문에 별로 대단한 작업은 아니다. 다만 이번엔 CUDA 6부터 추가된 Unified Memory 체계를 사용했다는 점이 다르다. 우선 기본적으로 라이트맵 계산을 하는 원리를 보자. 복셀 오브젝트마다 공간상의 점과 텍스처 좌표를 연결시킬 patch배열을 가지고 있다. 각 patch들로부터 라이트까지 ray를 쏴서 거리과 각도에 따라 라이트값을 구한다. … More CUDA를 이용한 복셀 월드의 라이트맵 계산