Quiero identificar mis activos cargados, pero no sé cuál debo elegir. Hay 2 opciones:
Nombre (cadena)
- Esto es lo más fácil y también rápido con unordered_map (O (1)), pero mucho más lento que usar números enteros.
- Fácilmente comprensible en el código.
Enteros
- Lo más rápido.
- No son entendibles en el código.
Sé que las cuerdas no son tan seguras o rápidas, pero ¿son tan malas o solo cuentan como malas en un título AAA? Podría hacer enumeraciones, para usar números enteros, pero si cargo la escena, los activos, etc. de un archivo en tiempo de ejecución, no puedo usar enumeraciones. ¿Hay alguna manera de hacer que estos enteros sean legibles si se generan en tiempo de ejecución?
Sé que este problema tiene algunos hilos en todo Internet, pero no pude averiguar qué tan importante es en qué casos es esto.
c++
architecture
assets
asset-management
Tudvari
fuente
fuente
Respuestas:
Puedes apoyar a ambos.
Si bien a menudo es más eficiente en tiempo de ejecución a los activos de referencia por un entero o alguna clave similares compare-rápido-a, a menudo es más eficiente en tiempo de diseño para hacer referencia a ellos por su nombre, porque los seres humanos son mucho mejores para trabajar con nombres como
enemy_bullet_casing_sound
que72910613
.Use una clave de entero para buscar los recursos directamente, y use este entero en el código siempre que sea posible (donde puede poner el valor real del entero en una variable y así trabajar con él más fácilmente). Proporcione una asignación de nombre a esa clave entera (en lugar de al recurso directamente), y use esa asignación cada vez que encuentre referencias con nombre a activos para resolver la clave entera real y encontrar el activo.
El uso de la búsqueda basada en nombres hará que sea mucho más fácil trabajar con sus archivos de datos, y asignar el nombre a una clave más rápida preservará todos los beneficios importantes de una clave de tipo entero más rápida en cualquier lugar donde sea necesario.
fuente
En mi proyecto utilizo cadenas hash, que se transforman, en tiempo de compilación en números únicos (¡lo deseo!). Entonces, cuando necesito un recurso, por ejemplo, una textura que simplemente llamo
Y dado que estoy creando un marco de sistema de entidad simple y necesito cargar datos de componentes desde archivos, creé un lenguaje simple como json para almacenar datos, pero es compilable (transformando palabras y caracteres de dígitos a números y de cadenas a valores hash) . Entonces, por ejemplo, si quiero vincular la textura con hash ID ("my_texture") a "ball.PNG" en mi archivo de datos tendré
Donde || es un operador que le dice al compilador que codifique la palabra dentro.
Entonces, básicamente, uso cadenas que se asignan a ints en tiempo de compilación (para que no tengan ninguna sobrecarga), tanto en el código real como en los archivos que son las secuencias para cargar componentes. Para calcular el hash un tiempo de compilación, simplemente búscalo en google, es una función simple de 5-10 líneas de código.
Por supuesto, puede cargar la cadena de sus archivos y hacer un hash en tiempo de ejecución, en este caso no tiene que escribir el diccionario por su cuenta porque el algoritmo lo hará por usted (creando enteros a partir de cadenas) y yo piensa que el hasing es al menos tan rápido como buscar en un mapa, debido a la localidad de la memoria (solo estás recorriendo una cadena que tiene unos pocos bytes de longitud).
Espero que esto pueda ayudar.
fuente
Identificar objetos por cadenas no es óptimo, los ints son mucho más eficientes. Para mayor comodidad, puede mantener una tabla de cadenas (o diccionario) de cadenas a ints para ayudar en el momento del diseño y durante la depuración.
Sin embargo, recomendaría que dentro de su código de juego principal solo se refiera a los objetos por su ID entero (o una enumeración para facilitar la lectura). Hacer esto simplifica la división de la tabla de cadenas como un activo separado. Si el código principal de su juego no se basa en esta tabla de cadenas, puede eliminarlo del juego lanzado, lo que puede ahorrar una cantidad significativa de memoria, una consideración importante si está trabajando en un juego móvil y desea mantener los tamaños de descarga tan pequeños como posible.
fuente