Come devo gestire le risorse mancanti?


13

Il tuo gioco prevede che venga caricato un determinato asset, ma non viene trovato. Come dovrebbe essere gestita la situazione? Per esempio:

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

Potrebbe essere stato accidentalmente eliminato dall'utente, danneggiato o errato durante lo sviluppo.

Alcune potenziali risposte:

  • Asserzioni (idealmente solo durante lo sviluppo)
  • Esci dal gioco con grazia
  • Lancia un'eccezione e prova a gestirla.

Qual è il modo migliore?


Un modo per farlo è verificare se i dati di gioco sono ancora intatti. In caso contrario, scaricare nuovamente automaticamente i dati mancanti. errore> chiedi all'utente di verificare i dati> download. È ovviamente necessario creare un piccolo strumento per questo.
Sidar,

@Sidar Mi piace quello che hai detto più della risposta più votata, forse puoi spiegare meglio cosa stai cercando di dire
concept3d

La bruttezza degli errori è che a volte interrompe il gioco e le persone non possono giocarlo / avviarlo. In Steam, ad esempio, se il tuo gioco non funziona correttamente puoi verificare i dati del gioco. Quando qualcosa sembra corrotto / mancante / modificato, Steam scaricherà di nuovo automaticamente quei file. Non so esattamente come lo fanno. Ma ovviamente lo controllano con alcuni dati. Forse i codici hash? Davvero non lo so. Ma dovresti sempre avere una risorsa sostitutiva standard (semplicemente una trama che dice "errore" su di essa o qualcosa del genere)
Sidar

@Sidar perché non formattarlo bene in una risposta?
concept3d

Perché non so esattamente come funziona e non voglio essere disinformato al riguardo. Quindi non potevo darti una risposta adeguata.
Sidar,

Risposte:


19

Molti giochi hanno un "materiale di errore" generico e una "maglia di errore" che è davvero ovvio da vedere. Associare questo con un avviso nei registri, ovviamente.


Completamente d'accordo con questo post. Tuttavia, potresti voler fare diverse cose in una versione distribuita / distribuita.
Jonkel,

Per le build di rilascio si potrebbe pensare a un approch per convalidare i file disponibili usando l'hash per scaricare file mancanti o non validi. Tuttavia durante lo sviluppo è sicuramente il miglior approccio per mostrare una trama a scacchiera nera e magenta per catturare la tua attenzione. Per i modelli si potrebbe usare un enorme modello ERRORE che dovrebbe essere ovvio.
Christian Ivicevic,

Questo ha senso per le trame. non tanto per i modelli 3D. E se mancasse la maggior parte dei modelli 3D? Il gioco sembrerà divertente, mentre dovrebbe essere giocabile in primo luogo. Che cosa succede se si calcola la base della struttura dei dati spaziali sulle proprietà geometriche dei modelli 3D cosa dovrebbe accadere. Sono con questo solo in circostanze semplici come la trama mancante. Ma penso che il controllo della completezza dei dati sia solo un approccio migliore per i giochi commerciali.
concept3d

1
@ concept3d - So che almeno il motore Source ha una mesh di errori evidente e grande (l'ho visto occasionalmente nel client di test Dota 2, quando aggiungevano eroi). Sono d'accordo che se mancano grandi quantità di dati di livello, probabilmente è meglio solo sbagliare, specialmente in una build di rilascio, ma per scopi di debug con un grande punto interrogativo che balla in giro non è male.
Robert Fraser,

6

Se si dispone di risorse di risoluzione diverse con la stessa trama , è possibile provare a salvare la situazione utilizzando una risoluzione diversa.

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

Se anche quello fallisce, potrebbe essere il momento di salvare.


2
Puoi aggiungere un interruttore al fermo in modo che in Dev mostri sempre la mesh / tex mancante ma quando viene pubblicato proverebbe a recuperare per primo e potrebbe avere una trama mancante meno ovvia.
DampeS8N,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.