Jak silnie silnik jednego gracza powinien odrzucić nieprawidłowe dane?

11

W grze dla jednego gracza, gdy próbujesz zbudować byt ze składników określonych w zewnętrznych skryptach, co według ciebie bardziej pożądane jest, gdy jeden z tych elementów jest źle sformułowany:

  • Czy silnik powinien pominąć ten komponent i pozwolić istocie żyć w świecie gry tylko z dobrze napisanymi komponentami?
  • Czy też nie powinien w ogóle dodawać bytu do świata, jeśli tylko jeden ze składników jest źle uformowany?

Uwaga: nie mówię o rejestrowaniu błędów - które powinny przyjść bez słowa - tylko o tym, co powinno się stać z bytem.

Paul Manta
źródło
Czy mówimy o jednym lub wielu graczach?
o0 ”.
@Lohoris Single player.
Paul Manta
2
Jak wspomniano już w większości odpowiedzi, kto jest twoją publicznością? Czy tworzysz grę z możliwością modyfikacji, czy mówisz o wewnętrznych celach programistycznych?
Tetrad
@Tetrad Chciałbym, aby gra była jak najbardziej przyjazna dla modderów.
Paul Manta,

Odpowiedzi:

11

Jeśli mówisz o grze z możliwością modyfikacji, możesz zastosować jedną z powyższych sugestii. Ale jeśli martwisz się przewracaniem własnych błędów, powiedziałbym, że nie rób tego. Zostałem zwolennikiem Fail-Fast . Jeśli jest to błąd, który utworzyłeś i który musisz rozwiązać przed jego wydaniem, powinieneś uczynić go oczywistym. Artykuł, do którego prowadzi link na dole strony wiki, jest dobrym materiałem do przeczytania na ten temat, dlaczego brak szybkiego postu jest dobry, a kiedy powinien i nie powinien być używany.

John McDonald
źródło
2
Myślę, że to świetna dychotomia, rozróżniająca błędy użytkowników i błędy programistów. Ma to sens z dokładnie tego samego powodu, dla którego błędy kompilatora są ogólnie dość łatwe do naprawienia, ale błędy w czasie wykonywania / semantyczne są diabłem.
jhocking
Jeśli silnik zawiera sposób modyfikacji bytów po uruchomieniu gry, powinieneś przynajmniej dać sobie szansę na naprawienie błędu, zanim zawiedziesz.
Blecki
7

Różnica między użytkownikiem a deweloperem nie zawsze jest wyraźna w rozwoju gier. Standardowe techniki programowania, takie jak „szybki błąd”, nie zawsze są korzystne, szczególnie w miarę powiększania się zespołu.

Na przykład, być może twój artysta techniczny spieprzył moduł cieniujący dla konturu targetowania - załamał się, powiedzmy, więc ładuje się tylko w systemach SM4, i nie zauważył, ponieważ ma najwyższy system liniowy. Powoduje to, że niektóre animacje nie ładują się. Do tych animacji odwołuje się określone zaklęcie napisane przez projektanta walki. W końcu twoja projektantka poziomów próbuje ustawić spawn na swoim miejscu, a te wszystkie spawn są w stanie rzucić to zaklęcie - ale teraz nie może umieścić żadnego z nich na świecie, ponieważ ich zaklęcia nie są ważne, ponieważ efekty nie są ważne, ponieważ shadery się nie ładują, ponieważ projektanci zawsze mają najgorsze komputery.

Twoje demo nie jest gotowe do 2PM, a twoi inwestorzy zastanawiają się, dlaczego nie możesz zdobyć nawet jednego wroga w grze, a twój projekt zostaje zamknięty.

Lub wybierasz opcję, w której rejestrujesz awarię, ale próbujesz dalej, a gra gra dobrze, z wyjątkiem, że niektóre efekty zaklęć wrogów nie pojawiają się - ale inwestorzy i tak nie wiedzą, jak mają wyglądać, więc nie ogłoszenie.

Z tego powodu prawie zawsze opowiadam się za pierwszą opcją - odrodzenie jak największej ilości bytu. Zdarzają się przypadki awarii w trybie awaryjnym - na przykład jeśli dane nigdy nie powinny być edytowane, z wyjątkiem osób zdolnych do tworzenia kompilacji (tj. Programistów i producentów technicznych) i zawsze są sprawdzane w 100% przy ładowaniu lub jeśli masz absolutną pewność, że osoba odpowiedzialna za problemem jest osoba korzystająca z edytora - ale nie są to zwykłe przypadki i wymagają dużej infrastruktury technicznej jako takiej, w którą możesz nie być gotowy zainwestować.

ashes999
źródło
1
Chciałbym myśleć, że zaproponowanemu scenariuszowi można zapobiec dzięki dobrym systemom kontroli źródła. W twoim scenariuszu artysta „zepsuł kompilację”. Każda inna osoba pracująca z uszkodzonym modułem cieniującym powinna mieć możliwość przywrócenia modułu cieniującego do poprzedniej wersji, dopóki problem nie zostanie rozwiązany.
John McDonald,
1
@John Podczas gdy dobra kontrola źródła jest koniecznością, a czasami konieczne jest przywrócenie pozostałej części projektu do stanu roboczego do czasu, gdy awaria zostanie rozwiązana lokalnie, jednak rzadko jest przydatna jako mechanizm zapobiegawczy i nie należy na niej polegać .
@John: W dużych projektach kompilacje mogą trwać kilka godzin (lub cały dzień). Tak naprawdę potrzebujesz dwuczęściowego podejścia - potrzebujesz nie tylko kontroli źródła, ale kontroli binarnej, dzięki czemu osoba niebędąca programistą może przywrócić poprzednie kompilacje. Ale oczywiście wiąże się to z własnym ryzykiem i kosztami, ponieważ teraz tworzysz nowe treści w stosunku do innych nieaktualnych treści, z plikami wykonywalnymi, które mogą mieć inne złe błędy. A nawet znalezienie odpowiedniej wersji, którą można wycofać, może potrwać ponad 30 minut - jeśli wszyscy projektanci będą musieli zatrzymać się na pół godziny i majstrować przy kompilacjach, marnuje się duże pieniądze.
@Joe Wreschnig: To ma sens. Sądzę więc, że musi istnieć moment, w którym szybkie niepowodzenie nie jest już zaletą. Albo w typach osób, które go używają, lub w projektach o określonej wielkości. Podejrzewam, że to ludzie w zespole decydują, co dla nich działa.
John McDonald
2
Nie jestem pewien, czy szybka twarda awaria, o którą tak naprawdę chodzi, jest zawsze zaletą. Nawet w „drużynie” dla jednej osoby, może nie chcę zajmować się kodem modułu cieniującego, ponieważ naprawdę muszę ukończyć ten poziom. Z pewnością napisz dobrą obsługę błędów i zapisz wszystkie błędy, ale prawie zawsze mam lepsze pojęcie o tym, co jest teraz ważne, niż kiedy napisałem kod błędu sześć miesięcy temu.
1

Użytkownik powinien mieć możliwość podglądu encji, którą zamierza zaimportować, i wcześniej wiedzieć, czy występują błędy.

Powinieneś w jakiś sposób zdecydować, które błędy powinny być śmiertelne, uniemożliwiając dodanie go do gry, a które można odrzucić jako ostrzeżenia .

Oczywiście, jeśli z jakiegokolwiek powodu importowana jednostka może w jakiś sposób nieodwracalnie zmienić dane zapisu, lepiej, aby była bezbłędna.

o0 ”.
źródło
0

Sugerowałbym, że przy opracowywaniu powinno być głośno z powodu nieprawidłowych danych. tzn. zaloguj wszystko gdzieś, co będzie czytane. Jeśli jednak silnik może to zignorować i kontynuować, powinien to zrobić. Możesz mieć logikę

void setValue(int value) {
    if (value < MIN_VALUE) {
       log(value + " is too low, using " + MIN_VALUE);
       value = MIN_VALUE;
    }
    if (value > MAX_VALUE) {
       log(value + " is too high, using " + MAX_VALUE);
       value = MAX_VALUE;
    }
}

Nawet w grze wieloosobowej jest to dopuszczalne, chyba że zakładasz, że jeden gracz próbuje oszukać system.

Po wydaniu oprogramowania prawdopodobnie zechcesz wyłączyć to logowanie domyślnie, zakładając, że gracze nie będą czytać tych dzienników.

Peter Lawrey
źródło
Zakładając, że dzienniki nie stanowią problemu z wydajnością, należy nadal logować się w kompilacjach wersji i wysyłać raporty z powrotem do zespołu programistów. (Oczywiście odpowiednie informowanie graczy.)
Powinieneś być w stanie zapisać bardziej zwięzłe dzienniki do wydania. W rozwoju możesz być bardziej gadatliwy.
Peter Lawrey,