Jak radzić sobie z brakującymi zasobami?

13

Twoja gra oczekuje na załadowanie określonego zasobu, ale go nie znaleziono. Jak sobie z tym poradzić? Na przykład:

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

Być może został przypadkowo usunięty przez użytkownika, uszkodzony lub napisany w trakcie opracowywania.

Niektóre potencjalne odpowiedzi:

  • Asercje (najlepiej tylko podczas programowania)
  • Opuść grę z wdziękiem
  • Rzuć wyjątek i spróbuj go obsłużyć.

Który sposób jest najlepszy?

concept3d
źródło
Jednym ze sposobów jest sprawdzenie, czy dane gry są nadal nienaruszone. Jeśli nie, automatycznie ponownie pobierz brakujące dane. błąd> poproś użytkownika o weryfikację danych> pobierz. Musisz oczywiście stworzyć do tego małe narzędzie.
Sidar,
@Sidar Podoba mi się to, co powiedziałeś, bardziej niż najczęściej głosowana odpowiedź. Być może możesz lepiej wyjaśnić, co próbujesz powiedzieć
concept3d
Brzydota błędów polega na tym, że czasami po prostu psuje grę, a ludzie nie mogą w nią grać / uruchomić. Na przykład w Steam, jeśli gra nie działa poprawnie, możesz zweryfikować dane gry. Gdy coś wydaje się uszkodzone / brakujące / zmienione, Steam automatycznie ponownie pobierze te pliki. Nie wiem dokładnie, jak to robią. Ale oczywiście porównują to z niektórymi danymi. Być może kody skrótu? Naprawdę nie wiem. Ale zawsze powinieneś mieć standardowy zasób zastępczy (po prostu teksturę z napisem „błąd” lub coś w tym stylu)
Sidar
@ Sidar, dlaczego nie sformatować go ładnie w odpowiedzi?
concept3d
Ponieważ nie wiem dokładnie, jak to działa i nie chcę o tym mylić. Więc nie mogłem dać właściwej odpowiedzi.
Sidar,

Odpowiedzi:

19

Wiele gier ma ogólny „materiał błędu” i „siatkę błędów”, co jest naprawdę oczywiste. Oczywiście połącz to z ostrzeżeniem w dziennikach.

Robert Fraser
źródło
Całkowicie zgadzam się z tym postem. Jednak możesz chcieć robić różne rzeczy w kompilacji wydania / dystrybucji.
Jonkel
W kompilacjach wersji można pomyśleć o approchu do sprawdzania dostępnych plików za pomocą haszowania w celu pobrania brakujących lub nieprawidłowych plików. Jednak podczas projektowania zdecydowanie najlepszym rozwiązaniem jest wyświetlenie czarnej i purpurowej tekstury szachownicy, aby przyciągnąć uwagę. W przypadku modeli można zastosować ogromny model ERROR, co powinno być oczywiste.
Christian Ivicevic,
Ma to sens dla tekstur. nie tyle w przypadku modeli 3D. Co jeśli brak większości modeli 3D? Gra będzie wyglądać śmiesznie, a przede wszystkim powinna być dostępna. Co się stanie, jeśli obliczysz strukturę danych przestrzennych na podstawie właściwości geometrycznych modeli 3D, co powinno się zdarzyć. Jestem z tym tylko w prostych okolicznościach, takich jak brakująca tekstura. Myślę jednak, że sprawdzanie kompletności danych jest po prostu lepszym podejściem do gier komercyjnych.
concept3d
1
@ concept3d - Wiem, że przynajmniej silnik Source ma dużą, oczywistą siatkę błędów (widziałem to czasami w kliencie testowym Dota 2, kiedy dodawali bohaterów). Zgadzam się, że jeśli brakuje dużych połaci danych poziomu, prawdopodobnie najlepiej jest po prostu pomylić się, szczególnie w kompilacji wersji, ale do celów debugowania taniec dużego znaku zapytania nie jest taki zły.
Robert Fraser,
6

Jeśli masz różne zasoby rozdzielczości o tej samej teksturze , możesz spróbować uratować sytuację, używając innej rozdzielczości.

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

Jeśli nawet to się nie powiedzie, może być czas na zwolnienie za kaucją.

Daniel
źródło
2
Możesz dodać przełącznik do haczyka, więc w Dev zawsze pokazujesz brakującą siatkę / tex, ale po opublikowaniu spróbuje odzyskać jako pierwszy i może mieć mniej oczywistą brakującą teksturę.
DampeS8N