He visto muchas veces en el código fuente, cosas como esta [bueno, esta es más una idea mía pseudo C ++]
typedef shared_ptr<Resource> ResourcePtr;// for ease
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");
sound1->Play();
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");
Me preguntaba qué tan útil era una clase como esta, algo que:
- Archivos multimedia cargados
- Los almacené en la memoria
- Lo hice al comienzo de una pantalla de carga de nivel.
- Limpiado
En lugar de tener un sistema de:
- Los recursos están en manos de entidades solamente, o están sueltos.
- Responsable de la propia carga en la memoria.
El primero es un "gerente" como tal; algo que siento indica que está mal usarlo. Sin embargo, permite que se pase algo así como un vector de nombres de recursos, en lugar de tener que buscar todo lo que necesita cargarse.
architecture
assets
El pato comunista
fuente
fuente
Respuestas:
Un buen administrador de recursos es clave para cuán bien y cuán flexible será el "motor" de su juego.
No solo resuelve muchos problemas con la administración de recursos de bajo nivel, sino que también ayuda a garantizar que los recursos se carguen solo una vez y luego se reutilicen si ya están cargados.
Si el sistema de recursos se abstrae bien, los detalles subyacentes pueden ser cautelosos entre el sistema de archivos, el almacenamiento de Physfs, SQL ...
Simplemente solicita un recurso, y se le da a usted.
No hay que preocuparse por los ID de recursos y cosas así.
Manejo de conflictos de recursos duplicados, etc.
Deje que el administrador de recursos lo resuelva.
Dependiendo de cómo lo diseñe, si es C ++, haga amigos con su (s) clase (s) de gestión de escena para asegurarse de que la propiedad se maneje adecuadamente.
Fondo de recursos ?
No hay problema.
¿Olvidar liberar recursos?
No hay problema.
Misma interfaz para los recursos, sin importar dónde se encuentren: memoria, disco, archivo, red.
No hay problema.
¿Quieres streaming?
Roscado?
Deje que su centro de gestión de recursos se encargue de eso.
Y puede estar seguro de que le informará cuando los recursos estén listos para ser utilizados.
Ogre 3D tiene un sistema de gestión de recursos muy flexible, pero estoy seguro de que hay otros 'por ahí'.
fuente
Recientemente escribí un administrador de recursos que funciona bastante bien para mi caso. Principales características:
Los recursos se solicitan por ID de cadena, por ejemplo
ResourceManager::instance().getTexture("textures/player.png")
,. El ID de textura está actualmente asignado directamente a un archivo en el disco, lo cual es conveniente durante el desarrollo, pero luego será reemplazado por una búsqueda en algún archivo.El administrador de recursos mantiene un mapa de ID a recursos, por lo que no volverá a cargar un recurso que ya se ha cargado.
La llamada anterior no devuelve un
Texture
objeto, sino unResource<Texture>
objeto; se espera que la persona que llama almacene elResource<Texture>
objeto y no la textura real. ElResource<Texture>
actúa como un puntero inteligente aTexture
; susoperator*()
devuelve elTexture
objeto mismo. La ventaja es que la textura real se puede volver a cargar o descargar sin la necesidad de actualizar a todos los clientes.El administrador de recursos verifica periódicamente si los archivos en el disco han cambiado y los vuelve a cargar si es necesario. Esto me permite modificar texturas o sombreadores y ver el resultado sin siquiera reiniciar el juego.
Los recursos pueden depender unos de otros. La mayoría, si no todos, los recursos dependen de un
File
recurso, que es el archivo desde el que se cargaron. Si, por ejemplo, un modelo depende de una textura, el modelo se volverá a cargar cada vez que el archivo de la textura cambie en el disco.Cuando no se puede encontrar un recurso, o no se carga, un recurso predeterminado se sustituye silenciosamente. Esto me permite usar recursos que aún no he creado, sin bloquear el juego. (Característica planificada: indica recursos "esenciales" como sombreadores GPGPU, sin los cuales el juego no puede ejecutarse correctamente).
El conteo de referencias y la descarga de recursos no utilizados se pueden agregar fácilmente. Como mi juego es bastante pequeño, todavía no lo he necesitado.
¡Creo que esta lista de características muestra que sí, los administradores de recursos pueden ser buenos!
fuente
Una de las razones para tener un administrador de recursos es el intercambio de recursos. Por ejemplo, cuando llama
resourceManager.Get("sprite.png")
, si "sprite.png" ya está cargado, el administrador de recursos simplemente puede devolver un puntero al recurso sprite ya cargado en lugar de crear una nueva imagen y volver a cargarla desde el disco.Un administrador de recursos también puede almacenar en caché los recursos, de modo que aunque se haya eliminado la última referencia a un recurso, el administrador de recursos puede optar por mantenerlo en la memoria en caso de que se vuelva a cargar en un futuro próximo. El administrador de recursos estaría programado para manejar automáticamente toda la administración de memoria con sus recursos.
Finalmente, creo que una característica muy útil es la recarga de recursos en el juego. Dado que el administrador de recursos controla todos los recursos de los juegos, puede crear una función que haga que todos los recursos se vuelvan a cargar desde el disco y actualice el juego en tiempo real, lo cual es extremadamente útil para los artistas / diseñadores que trabajan con su juego. .
fuente
Otro beneficio es, además del almacenamiento en caché y el recuento de referencias, es que puede manejar dependencias (¿el modelo a necesita textura b? b antes de cargar el modelo!)
fuente