Apa manfaat menggunakan sistem ID entitas?

12

Saya saat ini membaca buku Programming Game AI By Example.

Buku ini menyebutkan pemberian nomor ID unik untuk setiap entitas dalam game. Seringkali ketika entitas A kebutuhan untuk kontak entitas B , A mendapat referensi ke B dengan mengirimkan B 'nomor ID ke EntityDatabase kelas. Kelas ini menerima nomor ID dan mengembalikan referensi ke entitas.

Nomor ID dari beberapa entitas juga dapat diambil dari file yang berisi ID dari beberapa entitas (karakter permainan utama).

Pertanyaan saya adalah: Mengapa saya melakukan ini? Mengapa saya tidak dapat bekerja secara langsung dengan referensi? Apakah kadang-kadang sulit untuk mendapatkan referensi langsung? Apakah menggunakan sistem ID pendekatan umum? Apakah ada game yang tidak menggunakan ID?

Saya baru dalam pengembangan game. Tolong jelaskan manfaat bekerja dengan sistem ID entitas. Kelebihan dan kekurangannya. Contoh nyata akan sangat bagus. Terima kasih

Aviv Cohn
sumber

Jawaban:

18

Referensi berfungsi dengan baik untuk banyak situasi. Namun, ada tiga situasi penting di mana referensi tidak akan berfungsi dengan baik:

  • Jaringan . Saat mengirim informasi tentang menyinkronkan keadaan entitas melalui jaringan, referensi tidak dapat digunakan. Anda harus mengidentifikasi entitas dengan cara tertentu sehingga mesin jarak jauh tahu siapa yang Anda bicarakan.
  • Menyimpan / memuat . Saat menyimpan kondisi gim Anda ke disk, referensi objek tidak dapat menyertainya. Itu berarti ketika Anda memuat negara, Entity A yang memiliki Entity B yang ditargetkan oleh referensi tidak lagi tahu siapa yang harus ditargetkan. Lokasi memori berbeda, objek berbeda.

  • Manajemen memori . Memiliki tempat sentral untuk menyimpan referensi berarti bahwa ketika menghapus suatu entitas, Anda tidak harus melalui semua entitas Anda dan menghapus referensi untuknya agar memori dibersihkan. Referensi hanya boleh digunakan saat dibutuhkan, lalu dihapus di entitas lain mana pun. Mengurangi jumlah referensi memastikan Anda tidak memiliki entitas zombie yang hanya direferensikan oleh hal terakhir yang berinteraksi dengan mereka atau entitas lain. Ini juga membantu untuk menghindari referensi nol dengan cara pengujian standar jika entitas masih ada.

MichaelHouse
sumber
2
paragraf terakhir harus menjadi poin utama (manajemen memori). Ada situasi di mana satu kelas membutuhkan referensi ke entitas lain untuk beberapa waktu, tetapi referensi entitas mungkin menjadi tidak valid (yaitu entitas target proyektil mati). Dengan mengembalikan NULL ketika meminta entitas dengan ID, setiap kelas bertanggung jawab untuk melakukan hal yang benar (daripada menabrak) ketika referensi entitas menjadi tidak valid.
LearnCocos2D
Terimakasih telah menjawab. Sebuah pertanyaan untuk diklarifikasi. Secara umum: Dalam situasi di mana entitas A perlu mendapatkan referensi ke entitas B (untuk menyerangnya, kirimkan pesan, periksa tabrakan dengannya, atau alasan lain sama sekali) - Haruskah saya menggunakan sistem ID untuk dapatkan, atau adakalanya tidak apa-apa untuk mendapatkan referensi secara langsung? Artinya: Haruskah entitas A selalu mendapatkan referensi dari EntityManager dengan mengirimkannya ID entitas B (yang referensi silang entitas-referensi dan nomor ID), dan hanya kemudian menghubungi entitas B menggunakan referensi dari EntityManager? Haruskah saya selalu menggunakan sistem ID?
Aviv Cohn
Atau adakalanya mendapatkan referensi secara langsung? Dengan kata lain, kapan saya entitas A harus menggunakan EntityManager untuk mendapatkan referensi yang tersimpan di dalamnya, dan kapan entitas A dapat mengambil referensi ke B dengan cara apa pun?
Aviv Cohn
Tidak ada jawaban yang benar untuk itu. Secara pribadi, saya akan merancang sistem entitas untuk menjadi independen dari logika permainan. Itu berarti logika game bahkan tidak memiliki akses ke referensi entitas langsung. Pada dasarnya, saya akan menghindari mempertahankan referensi ke entitas di luar lingkup lokal metode saat ini. Itu berarti menggunakan EntityManager setiap kali sebelum beroperasi pada komponen entitas.
MichaelHouse
Saya melihat. Biarkan saya menggunakan contoh untuk melihat apakah saya mengerti maksud Anda. Katakanlah saya menggunakan grid yang seragam untuk melakukan deteksi tabrakan. Grid adalah array 2d. Setiap entitas diperiksa untuk tabrakan hanya dengan entitas di 'sel' yang sama dalam kisi. Menggunakan pendekatan "biasa", setiap sel akan menyimpan referensi ke objek GameEntity di area yang diwakilinya. Menggunakan pendekatan "sistem ID", setiap sel akan menyimpan nomor ID entitas. Angka-angka ini akan dikirim ke EntityManager untuk menerima referensi konkret untuk melakukan deteksi tabrakan. Apakah ini pemahaman yang baik?
Aviv Cohn
2

Satu hal terakhir adalah bahwa jika Anda menggunakan pola Object Pool dan suatu entitas akan direset karena makhluk itu mati (misalnya) dan respawn di tempat lain, referensi masih akan menunjuk ke entitas yang sama (kesalahan) dan ID tidak akan lagi tetap sah.

ID 5067 menunjuk ke alamat 0x8765 makhluk mati dan satu lagi memunculkan ID makhluk baru diatur ulang ke 7073 Seseorang memeriksa ID 5067, menunjuk ke 0x8765 tetapi makhluk itu sekarang terdaftar dengan ID 7073 sehingga basis data entitas ID tahu Anda menggunakan ID usang dan memberitahu Anda, makhluk yang telah Anda coba jangkau tidak lagi aktif.

Itu dan semua alasan indah yang disebutkan Byte56 adalah mengapa ini merupakan desain yang bagus untuk menghindari penggunaan referensi secara langsung.

AturSams
sumber