Saya sedang menulis klon Minecraft saya sendiri (juga ditulis di Jawa). Ini bekerja sangat baik sekarang. Dengan jarak menonton 40 meter, saya dapat dengan mudah mencapai 60 FPS di MacBook Pro 8,1 saya. (Intel i5 + Intel HD Graphics 3000). Tetapi jika saya menempatkan jarak menonton di 70 meter, saya hanya mencapai 15-25 FPS. Di Minecraft sungguhan, saya bisa menempatkan jarak menonton jauh (= 256m) tanpa masalah. Jadi pertanyaan saya adalah apa yang harus saya lakukan untuk membuat game saya lebih baik?
Optimasi yang saya terapkan:
- Hanya simpan potongan lokal di memori (tergantung pada jarak pandang pemain)
- Frustum culling (Pertama pada bagian, kemudian pada blok)
- Hanya menggambar wajah balok yang benar-benar terlihat
- Menggunakan daftar per bongkahan yang berisi blok yang terlihat. Bongkahan yang menjadi terlihat akan menambahkan dirinya ke daftar ini. Jika mereka tidak terlihat, mereka secara otomatis dihapus dari daftar ini. Blok menjadi (dalam) terlihat dengan membangun atau menghancurkan blok tetangga.
- Menggunakan daftar per chunk yang berisi blok pembaruan. Mekanisme yang sama dengan daftar blok yang terlihat.
- Gunakan hampir tidak ada
new
pernyataan di dalam loop game. (Game saya berjalan sekitar 20 detik hingga Pengumpul Sampah diminta) - Saya menggunakan daftar panggilan OpenGL saat ini. (
glNewList()
,glEndList()
,glCallList()
) Untuk setiap sisi dari jenis blok.
Saat ini saya bahkan tidak menggunakan sistem pencahayaan apa pun. Saya sudah mendengar tentang VBO. Tapi saya tidak tahu persis apa itu. Namun, saya akan melakukan riset tentang mereka. Akankah mereka meningkatkan kinerja? Sebelum menerapkan VBO, saya ingin mencoba menggunakan glCallLists()
dan meneruskan daftar daftar panggilan. Alih-alih menggunakan ribuan kali glCallList()
. (Saya ingin mencoba ini, karena saya pikir MineCraft yang asli tidak menggunakan VBO. Benar?)
Apakah ada trik lain untuk meningkatkan kinerja?
VisualVM profiling menunjukkan kepada saya ini (profil hanya 33 frame, dengan jarak pandang 70 meter):
Pembuatan profil dengan 40 meter (246 bingkai):
Catatan: Saya sedang menyinkronkan banyak metode dan blok kode, karena saya membuat potongan di utas lain. Saya berpikir bahwa mendapatkan kunci untuk suatu objek adalah masalah kinerja ketika melakukan ini dalam satu putaran game (tentu saja, saya berbicara tentang waktu ketika hanya ada loop game dan tidak ada potongan baru yang dihasilkan). Apakah ini benar?
Sunting: Setelah menghapus beberapa synchronised
blok dan beberapa perbaikan kecil lainnya. Performanya sudah jauh lebih baik. Berikut adalah hasil profil baru saya dengan 70 meter:
Saya pikir cukup jelas itulah selectVisibleBlocks
masalahnya di sini.
Terima kasih sebelumnya!
Martijn
Pembaruan : Setelah beberapa perbaikan tambahan (seperti menggunakan untuk loop menggantikan masing-masing, variabel buffering luar loop, dll ...), saya sekarang dapat menjalankan melihat jarak 60 cukup bagus.
Saya pikir saya akan mengimplementasikan VBO sesegera mungkin.
PS: Semua kode sumber tersedia di GitHub:
https://github.com/mcourteaux/CraftMania