Gerentes de recursos: ¿son buenos?

20

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.

El pato comunista
fuente
¿Duplicado de gamedev.stackexchange.com/questions/1506/… ?
coderanger
1
No exactamente. Creo que esta es una pregunta válida.
Ricket
No del todo, pero áreas similares y pros / contras similares. Pero hay cosas que haría con el gerente que no haría con un manifiesto. Los manifiestos son cosas tontas que simplemente reúnen recursos dispares en un solo índice. Un administrador de recursos puede tener mucha más responsabilidad y una mejor interacción con el motor del juego.
MrCranky
No creo que esté preguntando lo mismo. Parece estar preguntando si debería tener algún tipo de acortador de ruta de archivo, mientras que estoy preguntando acerca de una especie de cargador de recursos / tipo de caché. Sin embargo, creo que eso no apareció en la búsqueda ya que utilicé recursos en lugar de activos.
El pato comunista el
2
@Bryan, no estoy de acuerdo, "son una buena idea los administradores de activos" es una pregunta diferente a "cómo implementan los administradores de activos". Por supuesto, algunas personas estaban tratando de responder la primera pregunta para la segunda pregunta, lo que causaría una gran superposición de respuestas.
Tetrad

Respuestas:

20

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í'.

jacmoe
fuente
1
Debo agradecerte por esta respuesta. No estaba convencido de la utilidad de un administrador de recursos dedicado antes de leer esto, y ahora implementaré uno muy pronto.
Jake McArthur
13

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 Textureobjeto, sino un Resource<Texture>objeto; se espera que la persona que llama almacene el Resource<Texture>objeto y no la textura real. El Resource<Texture>actúa como un puntero inteligente a Texture; sus operator*()devuelve el Textureobjeto 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 Filerecurso, 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!

Thomas
fuente
2

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. .

5ound
fuente
1

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!)

Kaj
fuente