Saya sedang mengerjakan game PC berbasis ubin / sprite kecil dengan sekelompok orang, dan kami mengalami masalah kinerja. Terakhir kali saya menggunakan OpenGL adalah sekitar tahun 2004, jadi saya telah belajar sendiri bagaimana menggunakan profil inti, dan saya agak bingung.
Saya perlu menggambar di lingkungan 250-750 48x48 ubin ke layar setiap frame, serta mungkin sekitar 50 sprite. Ubin hanya berubah ketika level baru dimuat, dan sprite berubah sepanjang waktu. Beberapa ubin terdiri dari empat potong 24x24, dan sebagian besar (tetapi tidak semua) sprite berukuran sama dengan ubin. Banyak ubin dan sprite menggunakan alpha blending.
Saat ini saya sedang melakukan semua ini dalam mode langsung, yang saya tahu adalah ide yang buruk. Semua sama, ketika salah satu anggota tim kami mencoba untuk menjalankannya, ia mendapat frame rate yang sangat buruk (~ 20-30 fps), dan jauh lebih buruk ketika ada lebih banyak ubin, terutama ketika banyak ubin itu adalah jenis yang dipotong-potong. Ini semua membuat saya berpikir bahwa masalahnya adalah jumlah panggilan yang dibuat.
Saya telah memikirkan beberapa solusi yang mungkin untuk ini, tetapi saya ingin menjalankannya oleh beberapa orang yang tahu apa yang mereka bicarakan sehingga saya tidak membuang waktu saya untuk sesuatu yang bodoh:
TILES:
- Ketika sebuah level dimuat, gambarkan semua ubin sekali ke dalam bingkai penyangga yang melekat pada tekstur klakson besar, dan cukup gambar sebuah persegi panjang besar dengan tekstur itu di setiap frame.
- Masukkan semua ubin ke dalam buffer vertex statis ketika level dimuat, dan gambarkan dengan cara itu. Saya tidak tahu apakah ada cara untuk menggambar objek dengan tekstur berbeda dengan satu panggilan ke glDrawElements, atau apakah ini bahkan sesuatu yang ingin saya lakukan. Mungkin hanya menempatkan semua ubin ke dalam tekstur raksasa besar dan menggunakan koordinat tekstur lucu di VBO?
SPRIT:
- Gambarlah setiap sprite dengan panggilan terpisah ke glDrawElements. Ini sepertinya melibatkan banyak perpindahan tekstur, yang menurut saya buruk. Apakah array tekstur mungkin berguna di sini?
- Bagaimanapun juga, gunakan VBO dinamis. Pertanyaan tekstur yang sama seperti nomor 2 di atas.
- Sprite titik? Ini mungkin konyol.
Apakah ada dari ide-ide ini yang masuk akal? Apakah ada implementasi yang baik di suatu tempat saya bisa melihat?