Memiliki daftar lokal untuk setiap sistem akan meningkatkan penggunaan memori untuk kelas.
Ini adalah pertukaran ruang-waktu tradisional .
Sementara iterasi melalui semua entitas dan memeriksa tanda tangan mereka langsung ke kode, itu mungkin menjadi tidak efisien ketika jumlah sistem Anda tumbuh - bayangkan sistem khusus (biarkan input) yang mencari entitas tunggal yang mungkin menarik di antara ribuan entitas yang tidak terkait .
Yang mengatakan, pendekatan ini mungkin masih cukup baik tergantung pada tujuan Anda.
Meskipun, jika Anda khawatir tentang kecepatan, tentu saja ada solusi lain untuk dipertimbangkan.
Haruskah setiap sistem memiliki daftar entitas lokal yang mereka minati?
Persis. Ini adalah pendekatan standar yang harus memberi Anda kinerja yang layak dan cukup mudah untuk diterapkan. Overhead memori dapat diabaikan menurut pendapat saya - kita berbicara tentang menyimpan pointer.
Sekarang bagaimana mempertahankan "daftar minat" ini mungkin tidak terlalu jelas. Adapun wadah data, std::vector<entity*> targets
kelas sistem di dalam cukup sempurna. Sekarang yang saya lakukan adalah ini:
Menghapus entitas sepenuhnya analog, dengan satu-satunya perbedaan yang kami hapus jika suatu sistem cocok dengan tanda tangan kami saat ini (yang berarti bahwa entitas itu ada di sana) dan tidak cocok dengan tanda tangan baru (yang berarti entitas seharusnya tidak lagi berada di sana ).
Sekarang Anda mungkin mempertimbangkan penggunaan std :: list karena menghapus dari vektor adalah O (n), tidak menyebutkan bahwa Anda harus menggeser sebagian besar data setiap kali Anda menghapus dari tengah. Sebenarnya, Anda tidak harus - karena kami tidak peduli tentang pemrosesan pesanan pada tingkat ini, kami hanya dapat memanggil std :: remove dan hidup dengan kenyataan bahwa pada setiap penghapusan kami hanya perlu melakukan O (n) mencari kami entitas yang akan dihapus.
std :: list akan memberi Anda O (1) hapus tetapi di sisi lain Anda memiliki sedikit overhead memori tambahan. Juga ingat bahwa sebagian besar waktu Anda akan memproses entitas dan tidak menghapusnya - dan ini pasti dilakukan lebih cepat menggunakan std :: vector.
Jika Anda sangat kritis terhadap kinerja, Anda dapat mempertimbangkan pola pengaksesan data lain , tetapi bagaimanapun Anda mempertahankan semacam "daftar minat". Ingat juga bahwa jika Anda menjaga abstrak Entity System API Anda seharusnya tidak menjadi masalah untuk meningkatkan metode pemrosesan entitas sistem jika framerate Anda turun karena mereka - jadi untuk sekarang, pilih metode yang paling mudah bagi Anda untuk membuat kode - hanya kemudian profil dan tingkatkan jika perlu.