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.
c++
architecture
assets
asset-management
Tudvari
sumber
sumber
Jawaban:
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_sound
daripada72910613
.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
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
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
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.
sumber
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.
sumber