Sistem Acara luar biasa, mereka membuat kode sangat jinak dan benar-benar memungkinkan terciptanya permainan yang dinamis melalui komunikasi objek dan loop game yang mudah. Saya mengalami kesulitan dengan efisiensi implementasi saya saat ini. Saat ini sedikit optimisasi saya memisahkan daftar objek ke dalam peristiwa yang mereka respon telah melakukan keajaiban, tetapi harus ada lebih banyak yang bisa saya lakukan.
Saat ini saya memiliki dua metode:
Sederhana: semua objek ditambahkan ke vektor ketika suatu peristiwa dikirim semua objek dikirimi peristiwa melalui metode handle_event ()
Lebih kompleks: Saya memiliki peta dengan string sebagai kunci dan int sebagai nilainya. Ketika suatu jenis peristiwa ditambahkan, itu ditambahkan ke peta ini, dengan int hanya ditambahkan (harus ada cara yang lebih baik)
vektor vektor objek kemudian mendorong kembali vektor baru untuk menangani jenis peristiwa tersebut.
Ketika suatu peristiwa dipanggil, panggil saja int yang terkait dalam map eventTypes ke jenis di dalam vektor vektor objek dan kirimkan peristiwa itu ke setiap objek yang menangani jenis peristiwa itu.
Metode pertama ini cukup lambat (jelas) untuk banyak objek, tetapi cukup cepat untuk sangat sedikit objek. Sedangkan metode kedua cukup cepat dengan objek besar yang ingin menangani berbagai jenis peristiwa, tetapi lebih lambat dari metode pertama per objek dengan objek yang menangani jenis peristiwa yang sama.
Apakah ada cara yang lebih cepat (lebih hemat waktu)? Apakah ada cara yang lebih cepat untuk mencari int dari tipe string? (Awalnya saya punya enum, tetapi tidak mengizinkan jenis kustom, yang diperlukan karena tingkat dinamisme yang diinginkan.)
sumber
Jawaban:
Sepertinya Anda mengatakan bottleneck kinerja besar mencari ID peristiwa (bilangan bulat) dari nama string mereka. Anda bisa memproses data game Anda untuk mengonversi semua nama acara menjadi bilangan bulat sebelum menjalankan game, atau mungkin saat memuat level; maka Anda tidak perlu melakukan konversi apa pun selama bermain game.
Jika objek sering dibuat dan dihancurkan, mungkin ada banyak churn di vektor objek. Dalam hal ini Anda bisa mendapat manfaat dengan menggunakan daftar tertaut alih-alih vektor; mereka lebih cepat untuk penyisipan dan penghapusan.
sumber
EventType takeDamageEvent = EventSystem::CacheEventType("takeDamageEvent");
. Jadikan anggota kelas statis dan Anda hanya akan memiliki satu salinan yang beredar di setiap kelas yang membutuhkannya.Baiklah, mari kita dapatkan hal-hal sederhana terlebih dahulu. Anda memiliki ini di
map
antara string (nama acara, mungkin) dan bilangan bulat (indeks pendengar acara terdaftar).Waktu pencarian dalam
map
didasarkan pada dua hal: jumlah item di peta, dan waktu yang diperlukan untuk melakukan perbandingan antara dua kunci (mengabaikan masalah cache). Jika waktu pencarian adalah masalah, salah satu cara untuk mengatasinya adalah mengubah fungsi perbandingan dengan mengubah tipe string.Mari kita asumsikan Anda menggunakan
std::string
danoperator<
untuk perbandingan. Ini sangat tidak efisien; itu perbandingan byte-bijaksana. Anda tidak peduli dengan string asli yang kurang dibandingkan; Anda hanya perlu semacam perbandingan yang memberikan urutan ketat-lemah (karenamap
tidak berfungsi sebaliknya).Jadi Anda harus menggunakan string dengan panjang tetap 32 byte
std::string
. Saya menggunakan ini untuk pengidentifikasi. Tes perbandingan untuk string tetap ini tidak melakukan perbandingan byte-bijaksana; mereka melakukan perbandingan 32-bit (atau 64-bit) sebagai gantinya. Dibutuhkan setiap 4 byte sebagai integer yang tidak ditandatangani dan membandingkannya dengan 4 byte yang sesuai dari string lainnya. Dengan begitu, perbandingan hanya membutuhkan paling banyak 8 perbandingan. Ini memastikan pemesanan yang sangat lemah, meskipun pemesanan tidak ada hubungannya dengan data sebagai karakter.Menyimpan string yang lebih panjang dari 31 byte (perlu karakter NULL) memotong string (tetapi dari tengah, bukan dari ujung. Saya menemukan bahwa entropi cenderung lebih besar di awal dan akhir). Dan string lebih pendek dari pad dengan karakter yang tersisa
\0
.Sekarang, Anda bisa membuang
map
seluruhnya dan menggunakan tabel hash. Jika Anda benar-benar memiliki lebih dari 100.000 jenis acara, ini bisa menjadi ide yang bagus. Tapi saya tidak tahu permainan di mana itu akan menjadi hal yang masuk akal.sumber
Untuk menjawab pertanyaan umum:
Tidak ada. Yang dapat Anda lakukan adalah mengidentifikasi kebutuhan spesifik yang Anda miliki untuk sistem acara Anda (mungkin ada beberapa yang berbeda) dan kemudian menggunakan alat yang tepat untuk pekerjaan yang tepat.
Saya telah menerapkan dan mencoba menyamaratakan banyak sistem acara dan saya sampai pada kesimpulan ini. Karena pengorbanan sangat berbeda jika Anda membuatnya waktu kompilasi atau waktu berjalan, jika Anda menggunakan hierarki objek atau papan tulis dll.
Cara terbaik adalah mempelajari berbagai jenis sistem acara dan kemudian Anda akan memiliki petunjuk tentang yang mana yang akan digunakan dalam hal ini.
Sekarang, jika Anda menginginkan sistem yang benar-benar paling fleksibel, terapkan sistem papan tulis (runtime) dengan properti acara yang dinamis dan Anda akan memiliki sesuatu yang sangat fleksibel tetapi mungkin sangat lambat.
sumber