Kendi Minecraft klonumu yazıyorum (ayrıca Java'da yazılmıştır). Şu anda harika çalışıyor. 40 metrelik görüş mesafesiyle MacBook Pro 8,1'imde 60 FPS'ye kolayca vurabilirim. (Intel i5 + Intel HD Grafik 3000). Ancak görüntüleme mesafesini 70 metreye koyarsam, sadece 15-25 FPS'ye ulaşırım. Gerçek Minecraft'ta görüş mesafesini çok fazla (= 256m) uzağa koyabilirim. Öyleyse sorum şu: oyunumu daha iyi hale getirmek için ne yapmalıyım?
Uyguladığım optimizasyonlar:
- Yerel parçaları yalnızca bellekte tutun (müzikçaların görüntüleme mesafesine bağlı olarak)
- Frustum culling (Önce topaklarda, sonra bloklarda)
- Sadece blokların gerçekten görünen yüzlerini çizerek
- Görünür blokları içeren yığın başına listeleri kullanma. Görünen topaklar kendini bu listeye ekleyecektir. Görünmez hale gelirlerse, otomatik olarak bu listeden kaldırılırlar. Bloklar, bir komşu blok inşa ederek veya yok ederek görünürde olur.
- Güncelleme bloklarını içeren yığın başına listeleri kullanma. Görünür blok listeleriyle aynı mekanizma.
new
Oyun döngüsünün içinde neredeyse hiç ifade kullanmayın. (Oyunum Çöp Toplayıcı çağrılıncaya kadar yaklaşık 20 saniye sürüyor)- Şu anda OpenGL çağrı listelerini kullanıyorum. (
glNewList()
,glEndList()
,glCallList()
) Bloğun bir tür her bir tarafı için.
Şu anda bile herhangi bir aydınlatma sistemini kullanmıyorum. VBO'ları çoktan duydum. Ama tam olarak ne olduğunu bilmiyorum. Ancak, onlar hakkında biraz araştırma yapacağım. Performansı artıracak mı? VBO'ları uygulamadan önce glCallLists()
, çağrı listelerinin bir listesini kullanmayı ve iletmeyi denemek istiyorum . Binlerce kez kullanmak yerine glCallList()
. (Bunu denemek istiyorum çünkü gerçek MineCraft'ın VBO'ları kullanmadığını düşünüyorum.) Doğru mu?
Performansı arttırmak için başka püf noktaları var mı?
VisualVM profillemesi bana bunu gösterdi (70 metrelik bir görüş mesafesine sahip sadece 33 kare için profil oluşturma):
40 metrelik profil (246 kare):
Not: Başka bir iş parçasında topakları oluşturduğum için birçok yöntemi ve kod bloğunu senkronize ediyorum. Bir nesne için bir kilit elde etmenin bir oyun döngüsünde bu kadarını yaparken bir performans sorunu olduğunu düşünüyorum (tabii ki, sadece oyun döngüsünün olduğu ve yeni parçaların üretilmediği zamandan bahsediyorum). Bu doğru mu?
Düzenleme: Bazı synchronised
blokları ve diğer bazı küçük iyileştirmeleri yaptıktan sonra . Performans zaten çok daha iyi. İşte 70 metrelik yeni profil sonuçlarım:
Bence selectVisibleBlocks
burada mesele oldukça açık .
Şimdiden teşekkürler!
Martijn
Güncelleme : Bazı ekstra geliştirmelerden sonra (her biri yerine döngüler için kullanmak, döngüler dışında değişkenleri tamponlamak vb ...), şimdi 60 görüntüleme mesafesini oldukça iyi çalıştırabilirim.
Sanırım en kısa zamanda VBO'ları uygulayacağım.
Not: Tüm kaynak kodları GitHub'da mevcuttur:
https://github.com/mcourteaux/CraftMania