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를 이용한 복셀 월드의 라이트맵 계산

Game Dev – Voxel Horizon – 맵간 이동

초기에는 하나의 맵, 하나의 월드만으로 구성할 생각이었다. 지금 상태에서 9km x 9km이상을 처리할 수 있도록 엔진을 고칠 자신도 없고 그럴 에너지도 남아있지 않다. 그래서 그냥 쉽게 가기로 했다. 기존처럼 포탈 타고 맵체인지 하면 된다. 클라이언트와 서버에서 추가적인 작업을 좀 해주긴 했지만 크게 어렵지는 않게 맵간 이동은 구현했다. 뭐 이전에도 늘상 하던 전형적인 mmorpg 맵 이동처리니까. … More Game Dev – Voxel Horizon – 맵간 이동

Voxel Horizon – 소유영역 처리

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

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

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