Mengidentifikasi aset dalam mesin game?

12

Saya ingin mengidentifikasi aset saya yang dimuat, tetapi saya tidak tahu mana yang harus saya pilih. Ada 2 opsi:

  • Nama (string)

    • Ini adalah yang termudah dan juga cepat dengan unordered_map (O (1)), tetapi caranya lebih lambat daripada menggunakan integer.
    • Mudah dimengerti dalam kode.
  • Integer

    • Tercepat.
    • Tidak dapat dipahami dalam kode.

Saya tahu bahwa string tidak begitu aman atau cepat, tetapi apakah itu buruk, atau apakah itu hanya dihitung sebagai buruk dalam judul AAA? Saya bisa membuat enum, menggunakan integer, tetapi jika saya memuat adegan, aset, dll dari file saat runtime, saya tidak bisa menggunakan enum. Apakah ada cara untuk membuat bilangan bulat ini dapat dibaca jika dihasilkan saat runtime?

Saya tahu bahwa masalah ini memiliki beberapa utas di internet, tetapi saya tidak dapat mengetahui seberapa penting hal ini.

Tudvari
sumber
10
Kenapa bukan implementasi dari keduanya? Versi string terhubung ke Kamus <string, int> yang pada gilirannya memanggil Kamus <int, Aset>. Anda dapat menghindari lapisan berbasis string dalam kode, tetapi menggunakan lapisan berbasis string untuk interaksi pengguna.
Krythic
2
Saya akan kedua titik @ Krythic. Jika kode Anda suka bilangan bulat untuk kecepatan, biarkan kode Anda menggunakan bilangan bulat. Jika pengguna Anda menyukai string untuk keterbacaan, biarkan pengguna Anda menggunakan string. Keduanya dapat hidup berdampingan dengan sangat bahagia (dan Anda dapat secara selektif mengkompilasi versi string ke dalam pengembangan saja, jika Anda ingin melewatkan overhead sepenuhnya dalam rilis)
DMGregory
Masalah yang sama dalam konteks yang sedikit berbeda: Metode implementasi item yang berbeda - apa perbedaannya?
Philipp

Jawaban:

19

Anda dapat mendukung keduanya.

Meskipun sering kali lebih efisien saat runtime untuk mereferensi aset dengan integer atau kunci serupa yang cepat dibandingkan, sering kali lebih efisien pada waktu desain untuk merujuknya dengan nama, karena manusia jauh lebih baik dalam bekerja dengan nama seperti enemy_bullet_casing_sounddaripada 72910613.

Gunakan kunci integer untuk mencari sumber daya secara langsung, dan gunakan integer ini dalam kode jika memungkinkan (di mana Anda dapat menempatkan nilai aktual integer dalam variabel dan karenanya bekerja dengannya dengan lebih mudah). Berikan pemetaan dari nama ke kunci integer itu (bukan ke sumber daya secara langsung), dan gunakan pemetaan itu setiap kali Anda menemukan referensi bernama untuk aset untuk menyelesaikan kunci integer yang sebenarnya dan temukan aset.

Menggunakan pencarian berbasis nama akan membuat file data Anda jauh lebih mudah untuk dikerjakan, dan memetakan nama menjadi kunci yang lebih cepat akan mempertahankan semua manfaat penting dari kunci tipe integer yang lebih cepat di mana saja dibutuhkan.


sumber
Kasus saya: Saya ingin mengubah materi Obyek, jadi saya mengirim permintaan dengan nama materi baru. (string) Kemudian dalam sistem grafis ada pencarian di <string, pointer> peta tanpa urutan, dan pointer material objek akan digantikan oleh pointer baru. Jadi dalam kasus saya, saya tidak perlu mengubahnya ke integer? (karena saya mengonversinya menjadi pointer dan dalam algoritme yang sering saya gunakan pointer, saya hanya menggunakan string untuk hal-hal yang sesekali.)
Tudvari
Atau haruskah saya menggunakan integer ID-s alih-alih pointer di mana saja itu mungkin? (Jadi saya tidak harus memasukkan file header misalnya bahan.) Misalnya komponen penyaji sekarang menyimpan pointer dari bahan yang digunakan, yang dapat digunakan langsung oleh mesin grafis, tetapi saya harus memasukkan Material.h . Tetapi ketika saya menyimpan hanya integer di komponen renderer, saya tidak harus menyertakan Material.h, tapi saya harus membuat pencarian berbasis integer dalam array pointer. Saya pikir yang terakhir lebih baik. Apakah itu? Haruskah saya memperbaiki ini?
Tudvari
1

Dalam proyek saya, saya menggunakan string hash, yang diubah, pada waktu kompilasi dalam angka unik (saya berharap!). Jadi, ketika saya membutuhkan sumber daya, misalnya tekstur yang saya sebut

MngTexture->get(hash("my_texture"))

Dan karena saya membuat kerangka kerja sistem entitas sederhana dan saya perlu memuat komponen data dari file, saya membuat bahasa sederhana seperti json untuk menyimpan data, tetapi dapat dikompilasi (mengubah kata dan karakter dari angka ke angka dan dari string ke nilai hash) . Jadi, misalnya, jika saya ingin menautkan tekstur dengan ID hash ("my_texture") ke "ball.PNG" di file data saya, saya harus

|my_texture| = "ball.PNG"

Dimana || adalah operator yang memberitahu kompiler untuk hash kata di dalam.

Jadi pada dasarnya saya menggunakan string yang dipetakan ke int pada waktu kompilasi (sehingga mereka tidak memiliki overhead), baik dalam kode aktual dan dalam file yang merupakan aliran untuk memuat komponen. Untuk menghitung hash waktu kompilasi cukup google saja, itu fungsi sederhana 5-10 baris kode.

Tentu saja Anda dapat memuat string dari file Anda dan hash pada saat dijalankan, dalam hal ini Anda tidak harus menulis kamus sendiri karena algoritma akan melakukannya untuk Anda (membuat bilangan bulat dari string) dan saya berpikir hasing setidaknya secepat pencarian di peta, karena lokalitas memori (Anda hanya perulangan melalui string yang panjangnya beberapa byte).

Semoga ini bisa membantu.

Liuka
sumber
0

Mengidentifikasi objek dengan string tidak optimal, int jauh lebih efisien. Untuk kenyamanan Anda dapat mempertahankan tabel string (atau kamus) string ke int untuk membantu pada waktu desain dan selama debugging.

Namun, saya akan menganjurkan bahwa dalam kode permainan inti Anda, Anda hanya merujuk objek dengan ID integer mereka (atau enum untuk keterbacaan). Melakukan hal ini membuatnya lebih mudah untuk memecahkan tabel string sebagai aset terpisah. Jika kode permainan inti Anda tidak bergantung pada tabel string ini, maka Anda dapat menjatuhkannya dari game yang dirilis berpotensi menghemat sejumlah besar memori - pertimbangan penting jika Anda mengerjakan game mobile dan ingin menjaga ukuran unduhan sekecil bisa jadi.

steeveeet
sumber