BerickCook telah mengungkapkan gagasan itu dengan benar. Tinggalkan perhitungan di mana mereka berada jika mereka bekerja dengan baik sekarang.
Jika Anda dapat melakukan perhitungan sebelumnya dan Anda yakin tidak akan membutuhkannya di tengah permainan, maka lakukanlah sebelumnya. Lain lakukan setelah memuat. Jika perhitungan selama pertandingan tidak terlalu mencolok, Anda bisa melakukannya di sana. Jika pada suatu titik kompleksitas berkembang dan perhitungan menjadi terlalu berat, mulailah mengoptimalkan.
Tetapi satu hal: jika perhitungan Anda diterapkan untuk menjalankan mid game, Anda selalu dapat memaksanya untuk dilakukan selama memuat.
Ada banyak solusi:
- menghitung / memuat jalur selama pembuatan / pemuatan level
- gunakan utas kedua untuk menghitung jalur
- optimalkan algoritma Anda
- gunakan sistem interruptible jika Anda tidak memiliki akses ke threading.
Saya telah melihat dan menggunakan opsi terakhir dalam permainan pasar massal. Cukup pastikan Anda menyimpan dengan benar semua data yang diperlukan untuk melanjutkan perhitungan, dan memeriksa secara teratur untuk sisa waktu / operasi selama perhitungan.
Tergantung pada kasus Anda, sistem interruptible dapat memberikan solusi awal dan parsial yang dapat digunakan acara sebelum perhitungan berakhir.
Edit : menjawab @Keeper
"Algoritma interruptible" hanya berguna karena kendala yang kami miliki. Pada dasarnya kami merenungkan kurangnya multithreading.
Pada satu titik kami memiliki permainan di mana AI harus menghitung sejumlah besar langkah berdasarkan beberapa kamus. Selama perhitungan ini semua animasi akan berhenti karena kamus diperluas dengan lebih banyak data dan dataset yang menyimpan data diubah dan kurang efisien ketika permainan diadaptasi untuk multipemain (di mana AI harus berinteraksi bahkan untuk pergerakan pemain). Kami hanya memiliki satu utas yang tersedia untuk loop game (yang penting adalah kode multi-platform harus dijalankan pada semua platform yang didukung). Pada titik ini diputuskan untuk memutus algoritma perhitungan sehingga kami dapat menginterupsinya. Oleh karena itu kami tidak bisa hanya menggunakan sistem rekursif yang ada karena variabel tidak dapat disimpan. Fungsi diganti dengan objek yang hanya menampung semua variabel dan pointer yang diperlukan untuk objek induk dan anak. Saya tidak
- menyimpan status perhitungannya saat ini
- interupsi baik pada akhir loop atau selama loop (ketika objek anak menyela)
- keluar saat waktu habis
- melanjutkan di mana ia berhenti memulai kembali loop di indeks yang tepat atau memanggil objek anak yang saat ini berada di atas tumpukan anak-anaknya.
- bersihkan semuanya jika komputasinya terganggu
- memberikan hasil parsial terbaik.
Hanya operasi yang paling mahal dipecah menjadi objek yang terpisah dan butuh beberapa waktu untuk menemukan tempat yang tepat di mana kita bisa menghentikan perhitungan, tetapi pada akhirnya itu bekerja dengan sangat baik.
Kami kehilangan kinerja, tetapi kinerja yang dirasakan jauh lebih baik bagi pengguna karena animasi berjalan lancar di semua platform, semua platform kemudian dapat menggunakan kamus yang lebih besar tanpa menderita animasi berombak atau macet. Juga ini memungkinkan kami untuk menjalankan beberapa instance secara paralel ketika kami membutuhkannya nanti.
Tentu saja sekarang di iPhone dan iPad gim tidak membutuhkan ini, menggunakan utas kedua akan ideal. Tapi saya curiga kodenya masih ada.