Bagaimana kita mengatasi kebutuhan memori video besar dalam game 2D?
Kami sedang mengembangkan game 2D (Factorio) di allegro C / C ++, dan kami menghadapi masalah dengan meningkatnya kebutuhan memori video saat konten game meningkat.
Kami saat ini mengumpulkan semua info tentang gambar yang akan digunakan pertama, memotong semua gambar ini sebanyak mungkin dan mengaturnya menjadi atlas besar sekencang mungkin. Atlas ini disimpan dalam memori video, yang ukurannya tergantung pada keterbatasan sistem; saat ini biasanya 2 gambar hingga 8192x8192, sehingga mereka membutuhkan memori video 256Mb hingga 512Mb.
Sistem ini bekerja sangat baik bagi kami, karena dengan beberapa optimasi kustom dan memisahkan render dan memperbarui utas kami dapat menggambar puluhan ribu gambar di layar dalam 60 fps; kami memiliki banyak objek di layar, dan memungkinkan zoom-out besar adalah persyaratan penting. Karena kami ingin menambahkan lebih banyak, akan ada beberapa masalah dengan persyaratan memori video, sehingga sistem ini tidak mungkin dapat menampung.
Salah satu hal yang ingin kami coba adalah memiliki satu atlas dengan gambar yang paling umum, dan yang kedua sebagai cache. Gambar akan dipindahkan ke sana dari bitmap memori, sesuai permintaan. Ada dua masalah dengan pendekatan ini:
- Gambar dari bitmap memori ke bitmap video sangat lambat, allegro.
- Tidak mungkin untuk bekerja dengan bitmap video selain dari utas utama, di allegro, sehingga secara praktis tidak dapat digunakan.
Berikut adalah beberapa persyaratan tambahan yang kami miliki:
- Gim harus bersifat tekad, sehingga masalah kinerja / waktu pemuatan tidak pernah dapat mengubah status gim.
- Gim ini real-time, dan akan segera menjadi multipemain. Kita perlu menghindari bahkan gagap terkecil di semua biaya.
- Sebagian besar permainan adalah satu dunia terbuka yang berkelanjutan.
Tes terdiri dari menggambar 10.000 sprite dalam satu batch untuk ukuran dari 1x1 hingga 300x300, beberapa kali untuk setiap konfigurasi. Saya melakukan tes pada Nvidia Geforce GTX 760.
- Bitmap video ke gambar bitmap video mengambil 0,1us per sprite, ketika bitmap sumber tidak berubah di antara bitmap individu (varian atlas); ukurannya tidak masalah
- Bitmap video ke gambar bitmap video, sedangkan bitmap sumber dialihkan di antara gambar (varian non atlas), mengambil 0,56us per sprite; ukurannya juga tidak masalah.
- Memori bitmap ke gambar bitmap video benar-benar mencurigakan. Ukuran dari 1x1 hingga 200x200 mengambil 0,3us per bitmap, jadi tidak terlalu lambat. Untuk ukuran yang lebih besar, waktu mulai meningkat secara dramatis, pada 9us untuk 201x201 hingga 3116us untuk 291x291.
Menggunakan atlas meningkatkan kinerja dengan faktor lebih besar dari 5. Jika saya memiliki 10ms untuk rendering, dengan atlas saya dibatasi hingga 100.000 sprite per frame, dan tanpa itu, batas 20.000 sprite. Ini akan bermasalah.
Saya juga mencoba menemukan cara untuk menguji kompresi bitmap dan format bitmap 1bpp untuk bayangan, tetapi saya tidak dapat menemukan cara untuk melakukan ini di allegro.