BerickCook fikri doğru ifade etti. Şimdi düzgün çalışıyorlarsa hesaplamaları olduğu yerde bırakın.
Hesaplamayı daha önce yapabilirseniz ve oyunun ortasında onlara ihtiyacınız olmayacağından eminseniz, daha önce yapın. Yükledikten sonra başka yapın. Oyun sırasında hesaplama farkedilmezse, orada yapabilirsiniz. Bir noktada karmaşıklık gelişir ve hesaplamalar çok ağırlaşırsa optimizasyona başlayın.
Ama bir şey: eğer hesaplarınız oyunun ortasında oynanacak şekilde uygulanmışsa, bunları her zaman yükleme sırasında gerçekleştirilmeye zorlayabilirsiniz.
Çok sayıda çözüm var:
- seviye oluşturma / yükleme sırasında yolları hesaplama / yükleme
- yolları hesaplamak için ikinci bir iş parçacığı kullanma
- algoritmalarınızı optimize edin
- diş açmaya erişiminiz yoksa, kesilebilir bir sistem kullanın.
Bir kitlesel pazar oyununda son seçeneği gördüm ve kullandım. Hesaplamanın devam etmesi için gereken tüm verileri düzgün bir şekilde kaydettiğinizden emin olun ve hesaplama sırasında kalan süreyi / işlemleri düzenli olarak kontrol edin.
Durumunuza bağlı olarak, kesilebilir sistem hesaplama sona ermeden önce kullanılabilecek ön ve kısmi çözümler verebilir.
Düzenleme : Cevaplama @Keeper
"Kesilebilir algoritma" yalnızca sahip olduğumuz kısıtlamalar nedeniyle kullanışlıdır. Temelde çok iş parçacıklığından yoksun kaldık.
Bir noktada, yapay zekanın çoklu sözlüklere dayalı büyük miktarlarda hareket hesaplaması gereken bir oyunumuz vardı. Bu hesaplama sırasında, tüm animasyonlar duracaktır çünkü sözlükler daha fazla veriyle genişletildi ve oyun çok oyunculu (AI'nın oyuncunun hamleleri için bile etkileşimde bulunması gerektiğinde) uyarlandığında verileri tutan veri seti değiştirildi ve daha az verimli oldu. Oyun döngüsü için yalnızca bir iş parçacığımız vardı (zorunlu olan çoklu platform kodunun tüm desteklenen platformlarda çalışması gerekir). Bu noktada, hesaplama algoritmasını kırmaya karar verdik, böylece onu kesebildik. Bu nedenle, değişkenler kaydedilemediği için yürürlükteki özyinelemeli sistemi kullanamadık. İşlevler, üst ve alt nesnelere gerekli tüm değişkenleri ve işaretçileri tutan nesnelerle değiştirildi. Yapmıyorum
- mevcut hesaplamalarının durumunu kaydet
- bir döngünün sonunda ya da bir döngü sırasında kesme (bir alt nesne kesildiğinde)
- zaman dolduğunda çık
- sağ dizinde bir döngüyü yeniden başlatmayı ya da şu anda alt kümesinin en üstünde bulunan alt nesneyi çağırmayı durdurduğu yerden devam edin.
- hesaplama kesilirse her şeyi temizle
- en iyi kısmi sonucu verir.
Sadece en pahalı operasyonlar ayrı nesnelere bölündü ve hesaplamaları durdurabileceğimiz doğru yerleri bulmak biraz zaman aldı, ama sonunda çok iyi çalışıyor.
Performansı kaybettik, ancak animasyonlar tüm platformlarda sorunsuz bir şekilde çalıştığından, algılanan performans kullanıcı için çok daha iyiydi, daha sonra tüm platformlar dalgalı animasyonlardan veya donmalardan muzdarip olmadan daha büyük sözlükleri kullanabilir. Ayrıca bu, daha sonra ihtiyaç duyduğumuzda birden fazla örneği paralel olarak çalıştırmamızı sağladı.
Tabii ki şimdi iPhone ve iPad'de oyunun buna ihtiyacı yok, ikinci bir iplik kullanmak ideal olacaktır. Ama kodun hala orada olduğundan şüpheleniyorum.