지금껏 내가 만든 게임엔진+기반 플랫폼은 언제나 로딩 속도가 충분히 빨랐기 때문에 지연로딩같은건 사용해본적이 없다. 뻥 안까고 캐릭터 로딩할때 아무도 캐릭터 로딩하는줄 모르는 정도로 빠르게 만들었다. 맵로딩할때도 로딩이 너무 빨라서 로딩시간에 보여주는 일러스트를 볼 수 없으니 로딩시간을 느리게 해달라는 요구도 받은적이 있다.
하지만 이번의 경우는 복셀 데이터를 서버에서 스트리밍 해야하고 데이터량이 적지 않을뿐더러 복셀데이터->삼각형데이터->(최적화된 충돌처리용 삼각형매시, D3D용 VertexBuffer)로 매시를 빌드하는 시간이 꽤 걸린다. 지연처리 외에는 방법이 없다.
그래서 지연처리 가능하도록 작업했다. 작업량이 많아서 몇 단계로 나눠서 작업했다.
로컬모드에 파일을 지연로딩하는걸로 먼저 테스트, 그리고 온라인 모드에도 적용했다. 온라인 모드에선 파일 대신 패킷으로 받는 복셀 데이터를 삼각형 매시로 변환할때 지연처리하도록 했다.
단 캐릭터 충돌처리에는 복셀의 삼각형 매시가 필요하므로 충돌처리를 할때 해당 복셀 오브젝트의 삼각형 매시가 업데이트 되어있지 않은 경우 그 즉시 복셀 데이터 -> 삼각형 데이터로 변환한다.
[작업수순]
1. Voxel 편집 API 정리 – Voxel의 Bit Table이 변경됐을때 즉시 삼각형 매쉬로 업데이트할지, 지연 업데이트를 할지
2. Voxel Object Manager 라이트 계산, 복셀 메시 업데이트를 위해 상시 대기중인 Worker Thread Pool 구현
3. 서버에서 복셀 데이터를 보낼때 Color Table과 Bit Table을 분리. Color Table은 나중에 천천히 수신해도 큰 문제는 없다. Voxel데이터를 구성하는 Bit Table은 지형을 구성하므로 우선적으로 수신해야한다.
4. 서버에서 복셀 데이터를 받으면 복셀 오브젝트는 즉시 생성하고 복셀데이터의 Bit Table도 곧바로 세팅한다. 단 이것을 바로 삼각형 매시로 변환하진 않는다. 복셀 오브젝트에 대해 업데이트가 링크에 등록해둔다.
5. 게임루프에서 업데이트 링크드 리스트에 들어있는 오브젝트들을 나눠서 업데이트 시킨다.
해서 일단은 잘 돌아간다. 스트리밍해서 복셀 지형을 새로 만들어줄때 거의 끊김을 느끼지 못한다.
로컬에서 복셀의 지연처리 테스트 – 파일로부터 로딩 , 라이트 계산.
원격 서버와 연동해서 플레이어의 위치에 따라 복셀 데이터 수신
현재는 패킷으로 받은 복셀 데이터에 대해서는 자동으로는 라이트 계산을 하지 않는다. 이것도 자동으로 라이팅 계산에 들어가도록 할 예정이다 단 비교적 느긋한 타이밍으로 처리할 생각이다.게임하는데 크게 문제되지는 않으니까.
아 빼먹었는데 복셀면당 처리하던 라이팅을 복셀 면을 NxN으로 쪼개서 라이트맵으로 처리했다. 그리고 복셀 버텍스를 4바이트 이내로 줄였다. 정확히는 27비트로 줄였다. 나름 삽질을 많이 했지만 노가다틱한 작업이라 작업후기 적기는 뭐해서 패스.
아직 갈 길이 멀지만 중요한 기술 포인트는 거의 다 짚고 넘어간것 같다.