2D 게임에서 큰 비디오 메모리 요구 사항을 어떻게 해결합니까?
우리는 allegro C / C ++에서 2D 게임 (Factorio)을 개발하고 있으며 게임 콘텐츠가 증가함에 따라 비디오 메모리 요구 사항이 증가하는 문제에 직면하고 있습니다.
현재 사용할 이미지에 대한 모든 정보를 수집하고 가능한 한 많은 이미지를 자르고 가능한 한 큰 아틀라스로 구성합니다. 이러한지도 책은 비디오 메모리에 저장되며 크기는 시스템 제한에 따라 다릅니다. 현재 일반적으로 최대 8192x8192의 2 개 이미지이므로 256Mb ~ 512Mb 비디오 메모리가 필요합니다.
이 시스템은 일부 사용자 정의 최적화와 렌더 및 업데이트 스레드를 분할하여 60fps로 화면에 수만 개의 이미지를 그릴 수 있으므로 매우 효과적입니다. 화면에 많은 물체가 있으므로 큰 축소를 허용하는 것이 중요합니다. 더 추가하고 싶을 때 비디오 메모리 요구 사항에 문제가 생길 수 있으므로이 시스템을 유지할 수 없습니다.
우리가 시도하고 싶었던 것 중 하나는 가장 일반적인 이미지를 가진 하나의 아틀라스를, 두 번째는 캐시로 사용하는 것입니다. 필요에 따라 이미지가 메모리 비트 맵에서 이동됩니다. 이 방법에는 두 가지 문제가 있습니다.
- 알레그로에서 메모리 비트 맵에서 비디오 비트 맵으로의 드로잉은 매우 느립니다.
- allegro에서는 메인 스레드 이외의 비디오 비트 맵으로 작업 할 수 없으므로 실제로 사용할 수 없습니다.
추가 요구 사항은 다음과 같습니다.
- 게임은 결정 론적이어야하므로 성능 문제 /로드 시간은 게임 상태를 절대 변경할 수 없습니다.
- 이 게임은 실시간이며 곧 멀티 플레이어가 될 것입니다. 우리는 모든 비용에서 가장 작은 말 더미도 피해야합니다.
- 게임의 대부분은 하나의 지속적인 열린 세상입니다.
테스트는 1x1에서 300x300 크기의 배치마다 10,000 개의 스프라이트를 배치 할 때마다 모든 구성에 대해 여러 번 구성되었습니다. Nvidia Geforce GTX 760에서 테스트를 수행했습니다.
- 소스 비트 맵이 개별 비트 맵 (아틀라스 변형)간에 변경되지 않은 경우 비디오 비트 맵 대 비디오 비트 맵 드로잉은 스프라이트 당 0.1us를 소비했습니다. 크기는 중요하지 않았다
- 비디오 비트 맵을 비디오 비트 맵 드로잉으로, 소스 비트 맵이 드로잉간에 전환되었지만 (아틀라스가 아닌 변형) 스프라이트 당 0.56us가 사용되었습니다. 크기도 중요하지 않았습니다.
- 비디오 비트 맵 드로잉에 대한 메모리 비트 맵은 실제로 의심 스러웠습니다. 1x1에서 200x200까지의 크기는 비트 맵당 0.3us를 사용하므로 너무 느리지 않습니다. 더 큰 크기의 경우 시간이 201x201의 경우 9us에서 291x291의 경우 3116us로 매우 크게 증가하기 시작했습니다.
아틀라스를 사용하면 성능이 5보다 크게 증가합니다. 렌더링에 10ms가 있고 아틀라스를 사용하면 프레임 당 100 000 스프라이트로 제한되며 프레임이 없으면 20 000 스프라이트로 제한됩니다. 이것은 문제가 될 것입니다.
또한 그림자에 대한 비트 맵 압축 및 1bpp 비트 맵 형식을 테스트하는 방법을 찾으려고했지만 알레그로에서이를 수행하는 방법을 찾을 수 없었습니다.