¿Cómo debo manejar los recursos faltantes?

13

Tu juego espera que se cargue un determinado activo, pero no se encuentra. ¿Cómo se debe manejar la situación? Por ejemplo:

Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found
Mesh* car             = LoadMesh("Car.obj");      // returns NULL; 3D mesh not found

Podría haber sido borrado accidentalmente por el usuario, dañado o mal escrito durante el desarrollo.

Algunas posibles respuestas:

  • Afirmaciones (idealmente solo durante el desarrollo)
  • Sal del juego con gracia
  • Lanza una excepción e intenta manejarlo.

¿Cuál es el mejor camino?

concepto3d
fuente
Una forma de hacerlo es verificar si los datos del juego aún están intactos. Si no, vuelva a descargar automáticamente los datos que faltan. error> pedir al usuario que verifique los datos> descargar. Obviamente necesitas crear una pequeña herramienta para esto.
Sidar
@Sidar Me gusta más lo que dijiste que la respuesta más votada, tal vez puedas explicar mejor lo que intentas decir
concept3d
La fealdad de los errores es que a veces simplemente rompe el juego y la gente no puede jugarlo / iniciarlo. En Steam, por ejemplo, si su juego no funciona correctamente, puede verificar los datos del juego. Cuando algo parece corrupto / perdido / cambiado, Steam volverá a descargar automáticamente esos archivos. No sé exactamente cómo lo hacen. Pero obviamente lo comparan con algunos datos. ¿Quizás códigos hash? Realmente no lo se. Pero siempre debe tener un activo de reemplazo estándar (simplemente textura que dice "error" en él o algo así)
Sidar
@Sidar ¿por qué no formatearlo bien en una respuesta?
concept3d
Porque no sé exactamente cómo funciona y no quiero estar desinformando al respecto. Así que no pude darte una respuesta adecuada.
Sidar

Respuestas:

19

Muchos juegos tienen un "material de error" genérico y una "malla de error" que es realmente obvio de ver. Combina esto con una advertencia en los registros, por supuesto.

Robert Fraser
fuente
Completamente de acuerdo con esta publicación. Sin embargo, es posible que desee hacer cosas diferentes en una versión distribuida / distribuida.
Jonkel
Para las versiones de lanzamiento, se podría pensar en una aproximación para validar los archivos disponibles utilizando hash para descargar archivos faltantes o inválidos. Sin embargo, durante el desarrollo es definitivamente el mejor enfoque para mostrar una textura de tablero de ajedrez negro y magenta para llamar su atención. Para los modelos, se podría usar un modelo de ERROR enorme que debería ser obvio.
Christian Ivicevic
Esto tiene sentido para las texturas. No tanto para los modelos 3D. ¿Qué pasa si faltan la mayoría de los modelos 3D? El juego se verá divertido, aunque debería poder jugarse en primer lugar. ¿Qué sucede si calcula la base de su estructura de datos espaciales en las propiedades geométricas de los modelos 3D? Estoy con esto solo en circunstancias simples como la falta de textura. Pero creo que la comprobación de la integridad de los datos es un mejor enfoque para los juegos comerciales.
concept3d
1
@ concept3d: sé que al menos el motor de origen tiene una malla de error grande y obvia (lo he visto ocasionalmente en el cliente de prueba de Dota 2, cuando agregaban héroes). Estoy de acuerdo en que si faltan grandes cantidades de datos de nivel, probablemente sea mejor simplemente cometer un error, especialmente en una versión de lanzamiento, pero para fines de depuración, tener un gran signo de interrogación bailando no es tan malo.
Robert Fraser
6

Si tiene diferentes recursos de resolución de la misma textura , podría intentar salvar la situación utilizando una resolución diferente.

Texture* grassTexture;
try {
    grassTexture = LoadTexture("Grass.png");
} catch (WhateverExcaption e) {
    grassTexture = LoadTexture("Grass_512.png");
}

Si incluso eso falla, podría ser el momento de la fianza.

daniel
fuente
2
Puede agregar un conmutador a la captura para que en Dev siempre muestre la malla / tex que falta pero cuando se publique intentará recuperarse primero y tal vez tenga una textura que falta menos obvia.
DampeS8N