Czy narzędzia potoku treści powinny być osadzone w silniku?

10

Jak minimalny powinien być silnik gry? Jaką część potoku treści należy osadzić w silniku?

Niektóre przypadki użycia, w których super silnik może być użyteczny:

  • Podczas ładowania treści użytkownika użytkownik nie musi pakować swoich tekstur, silnik zrobi to w czasie ładowania.

  • Skrypt żąda czcionki o znacznie większym rozmiarze niż został wcześniej wygenerowany, silnik może przeanalizować reklamę pliku ttf i zbudować nowy atlas tekstur.

  • Kuźnia Halo .

Oczywiście nic z tego nie jest darmowe. Wymaga to narzędzi potoku treści do pisania w C ++. Biblioteki obsługi używane w potoku muszą zostać skompilowane do użycia na urządzeniu. Wymaga to, aby generowanie treści nie było wadliwe. I ogólnie sprawia, że ​​silnik jest większy i nieporęczny.
Jakie są inne zalety i wady?
Czy zalety przewyższają wady?

Niektóre szczegółowe pytania:

  • Czy silnik powinien być w stanie ładować różne formaty obrazów? Program ładujący tylko TGA jest dość łatwy w obsłudze.

  • Co z formatami audio? Czy jest możliwe obsługiwanie tylko ładowania plików wav? Co z plikami muzycznymi otoczenia, które często są ogromne.

  • Czy silnik powinien być zdolny do dynamicznego analizowania TTF i generowania atlasu?

  • Pakowanie tekstur.

deft_code
źródło

Odpowiedzi:

11

Blog Noel Llopis Games from Within wspomniał o tym niedawno w poście „Remote Game Editing” . Pierwszy akapit:

Od dawna jestem fanem minimalnych czasów wykonywania gier. Wszystko, co można zrobić w trybie offline lub w oddzielnym narzędziu, powinno być poza środowiskiem uruchomieniowym. Dzięki temu architektura i kod gry są bardzo uproszczone i proste .

(Artykuł jest wysoce zalecany, podobnie jak w przypadku większości materiałów Noela, niezależnie od tego, czy zgadzasz się w 100%, czy nie).

Uważam, że kluczem tutaj jest utrzymanie złożoności poza silnikiem. Nadal możesz mieć elastyczność, ale jest to elastyczność w potoku treści. Zyskujesz lepszą wydajność, nie tracąc czasu na konwersję i przenoszenie danych.

Co dziwniejsze, lepsza wydajność może przełożyć się na krótszy czas iteracji, pomimo utraty niektórych umiejętności edycji w silniku: łatwiej jest wypróbować coś, jeśli można załadować grę w ciągu sekundy.

Przyjęcie niektórych założeń „ filozofii unixowej ” pomoże ci zachować elastyczność łańcucha narzędzi: niewielki modułowy potok.

Moja osobista filozofia: upiec jak najwięcej danych w jak największym stopniu offline, ale zapewnij wsparcie silnika, aby otrzymywać nowe wypalone dane w dowolnym momencie. (Pamiętaj, że te nowe dane nie muszą wchodzić w grę, dopóki nie jest to wygodne: naciśnięcie przycisku „Odśwież”, rozpoczęcie następnego poziomu, przejście do nowego obszaru, cokolwiek. Kluczem jest znalezienie optymalnego punktu, który minimalizuje czas iteracji przy minimalnej złożoności kodu i nakładzie pracy związanej z kodowaniem).

W naszej firmie większość narzędzi dla artystów / projektantów koncentruje się na kwestiach związanych z interfejsem użytkownika: łatwość manipulowania pojedynczymi zasobami lub ich partiami itp. Czasami są to tylko narzędzia innych firm, takie jak Photoshop lub 3DS Max. Narzędzia te eksportują do formatu pośredniego (często xml, który odwołuje się do źródłowych danych binarnych, ale nie zawsze). Format pośredni jest wybierany przez backendowe narzędzie do tworzenia danych, które przekształca go w coś użytecznego i szybkie ładowanie dla platformy docelowej.

Przenośność osiąga się przez dodanie dodatkowych narzędzi tworzenia danych zaplecza lub rozszerzenie istniejących narzędzi tworzenia danych zaplecza, co ma tę dodatkową zaletę, że jest niewidoczny dla twórców treści.

Teraz, przy poprawnym utworzeniu danych przyrostowych, możesz wprowadzić zmiany w zapisanym formacie w ciągu kilku sekund; Twój silnik może pająka lub narzędzie może pająka, a następnie pojawią się w systemie zasobów, gotowe do ponownego załadowania, gdy będzie to wygodne.

Narzędzia - zwłaszcza narzędzia do tworzenia danych zaplecza - są często niechlujne i zawierają więcej błędów niż kod silnika. Jest to w porządku, ponieważ łatwiej jest je refaktoryzować / przepisywać, rozszerzać i testować; masz specyfikacje dotyczące ich zachowania i dość łatwo można je przetestować w jednostce w porównaniu z niektórymi kodami silnika.

Moje opinie na twoje pytania:

Czy silnik powinien być w stanie ładować różne formaty obrazów? Program ładujący tylko TGA jest dość łatwy w obsłudze.

(Poza tym: nawet jeśli używasz wbudowanego dekodera TGA, nie koduj go ręcznie. Po prostu prosisz o kłopoty - jest wiele subtelności w większości formatów obrazów i wiele narzędzi, które nie są zgodne dokładnie do prawdopodobnie nieokreślonego formatu. Najlepiej jest znaleźć istniejący dobrze przetestowany kod biblioteki do przetwarzania obrazów).

Chciałbym, aby tutaj narzędzie przekonwertowało z TGA na dowolny wewnętrzny format tekstury plus metadane.

Co z formatami audio? Czy jest możliwe obsługiwanie tylko ładowania plików wav? Co z plikami muzycznymi otoczenia, które często są ogromne.

Używamy tutaj trzech formatów: śledzonej muzyki (.xm), ADPCM (.wav) i Speex (.spx). Wynika to głównie z tego, że korzystamy z urządzeń przenośnych, a te formaty są bardzo lekkie do odkodowania.

Czy silnik powinien być zdolny do dynamicznego analizowania TTF i generowania atlasu? Pakowanie tekstur.

Atlasing to trudny problem: zobacz odpowiedzi na ostatnie pytanie . Prawie zawsze warto robić to offline.

Dodatkowo możesz przekształcić metadane według znaków w upakowaną strukturę prawie zerowego obciążenia.

Na zakończenie możesz wyczyścić i spakować ten potok ze swoją grą, dla społeczności modów. Zawsze możesz dodać więcej formatów źródłowych. I nic nie stoi na przeszkodzie, aby w określonych przypadkach wypełnić lukę między narzędziami do tworzenia treści a silnikiem; miejmy nadzieję, że Twój kod do pieczenia danych i kod pająka / transferu mogą zostać przekształcone w biblioteki, które w niektórych przypadkach mogą być później wykorzystane bezpośrednio przez narzędzia do tworzenia treści. Ale nie uczyniłbym tego moim pierwszym celem, koniecznie ... Tylko pamiętaj, że będzie to cel ostateczny i pozwól, aby wpłynęło to trochę na twój projekt, i najpierw wybierz nisko wiszące owoce.


Jako aktualizację warto rozważyć użycie formatu plików KTX dla tekstur. Ma tę zaletę, że jest „wczytywana structi używana” w większości przypadków użycia GL (a z twoich komentarzy brzmi, jakbyś celował w GL), a jednocześnie jest elastyczny i dobrze zdefiniowany.

Narzut nagłówka KTX może być nieco wysoki dla w pełni upieczonych danych, w zależności od celu, i możesz zrezygnować z obsługi wymiany endianów, w zależności od przypadku użycia ... ale zdecydowanie jest to warte przynajmniej rozważenia ze względów projektowych.

leander
źródło
Świetne rzeczy dzięki. Nigdy nie zastanawiałem się nad stworzeniem własnego, łatwego do załadowania formatu obrazu. Czy istnieje już wbudowana biblioteka ładowania minimalnych tekstur. Z drugiej strony jest to w zasadzie strumień bajtów o szerokości, wysokości i kodowaniu (tj. GL_RGB555).
deft_code
1
Nie buduj własnego formatu obrazu, tylko przenieś obraz do dokładnie takiego formatu, jakiego chce DirectX, GL lub cokolwiek innego. =) Jeśli chodzi o biblioteki: istnieje tona. W przypadku narzędzi zwykle używam bibliotek biblioteki ImageMagick ( imagemagick.org/script/index.php ), a nawet programów ... Kod ImageMagick jest oldschoolowy i nieco brzydki, ale dość szybki, elastyczny i szybki -przetestowany. Jestem pewien, że inni będą mieli wiele innych sugestii; jeśli używasz np. C # do swojego zestawu narzędzi, wiele z tych rzeczy będzie już wbudowanych w biblioteki .NET ...
leander
1
„Jestem pewien, że inni będą mieli wiele innych sugestii” MFC! :) A może OpenIL. Myślę, że jednym z ważnych punktów dotyczących wypierania zasobów do formatów specyficznych dla platformy jest to, że wraz z dodawaniem kolejnych formatów źródłowych i większej liczby platform liczba kombinacji eksploduje. Konwersja zasobów źródłowych na format pośredni, a następnie konwersja na formaty specyficzne dla platformy zmniejszy liczbę tras konwersji. Dodaj kolejny format źródłowy, po prostu napisz konwerter do formatu pośredniego. Dodaj kolejną platformę, dodaj piekarza do formatu docelowego tej platformy.
Chris Howe
1
Dodałbym, że utrzymanie złożoności poza silnikiem niekoniecznie oznacza, że ​​funkcjonalność nie jest dostępna dla silnika. Kluczem jest jednak oddzielenie go, aby można go było łatwo oddzielić od silnika. Nie mogę wystarczająco podkreślić, jak przydatne jest wsparcie ładowania zasobów na gorąco, tj. Przeładowywanie rzeczy w locie. To także może przynieść wiele komplikacji do twojego systemu, więc będziesz musiał upewnić się, że jest on zbudowany w taki sposób, że gra nie musi dbać o to, skąd pochodzą zasoby.
dash-tom-bang
3

Twoje pytania brzmią bardzo subiektywnie i zależą w dużej mierze od tego, kim jest twoja grupa docelowa.

Weźmy twoje pytanie dotyczące analizy czcionek / ttf. Jeśli planujesz dodawanie własnej czcionki przez modderów, prawdopodobnie chcesz zrobić proces importowania tak mało kroków, jak to możliwe. Jeśli dodajesz do gry wiele czcionek / rozmiarów czcionek, być może potrzebujesz nieco wyrafinowanego narzędzia, którego artysta może użyć przy odrobinie treningu. Jeśli będziesz to robić wewnętrznie, czas poświęcony na stworzenie odpowiedniego importera prawdopodobnie będzie krótszy niż poświęcenie czasu na napisanie narzędzi dla poprzednich przypadków.

Tak naprawdę wszystko zależy od skali. Narzędzia osadzone są warte wysiłku, gdy robisz coś dużo razy i chcesz zmniejszyć złożoność / wynikające z nich błędy. Każdy dodany przez Ciebie dodatkowy kwalifikator (tj. Tylko tekstury TGA zamiast importu, powiedzmy, PSD) powoduje, że użytkownik końcowy spędza więcej czasu.

Pamiętaj, że narzędzia treści są zwykle używane przez osoby mniej technicznie skłonne (czytaj: artyści). Osobiście bardzo podoba mi się sposób, w jaki działa Unity, w którym możesz po prostu przeciągnąć plik źródłowy (psd, 3ds, ttf, mp3, jpg, mov, cokolwiek) i automatycznie przekonwertuje go na format wewnętrzny. Format wewnętrzny jest w większości ukryty przed użytkownikiem końcowym. Automatycznie ponownie przekonwertuje, gdy wykryje zmianę pliku źródłowego. Ale to dużo pracy.

Tetrad
źródło