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?


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.