Architektura silnika gry MVC (Model-View-Controller) - tak czy nie? [Zamknięte]

18

Czytam jedną świetną książkę, Game Coding Complete , i ta książka zdecydowanie zaleca stosowanie podejścia MVC (Model-View-Controller) , z trzema kluczowymi warstwami:

  1. Warstwa aplikacji gry
  2. Logika gry
  3. Widok gry

Dla mnie takie podejście wygląda jak przesada w mobilnej grze komputerowej.

Jakie jest twoje zdanie? Czy warto wdrożyć tę architekturę, nawet jeśli wymaga ona dodatkowej komunikacji między modułami? Czy ten projekt może zużywać tak dużo mocy procesora, że ​​na końcu wynik byłby znacznie wolniejszy, niż gdyby nie został zaimplementowany?

Bunkai.Satori
źródło
5
-1 i głosuj, aby zamknąć. Wszystko, co warto powiedzieć o MVC w grach, zostało powiedziane na gamedev.stackexchange.com/questions/3426/… , a jak dotąd mamy tu tylko śmieci.
@Joe Wreschnig, który jest dość trudny, ale wydaje mi się, że to prawda ...
Spooks
@chaos: Właściwie głosowałem za odpowiedzią, ale tak naprawdę nie potrzebowaliśmy innej odpowiedzi, mówiąc: „użyj wzorców, jeśli pomogą, nie, jeśli nie pomogą”. A może tak zrobiliśmy, ale to wciąż bardzo smutne. Nadal jednak nie wiem, jak odwoływać się do wyrażeń takich jak „Projekty w czasie wykonywania, takie jak dziedziczenie”, innych niż śmieci.
2
@Joe: Oh, dziękuję. :) Argument, że OOP jest bezpłatny, nieco denerwuje. Podejrzewam, że według niektórych standardów nie powinniśmy powtarzać takich punktów, jak moje, ale zdarzają się nooby, a więc i dyskusyjne pytania. Służy również do tego, by spóźniali się na stronę, taką jak ja, zeskrobać trochę powtórzeń, mimo że aktywność znacznie zmalała. :) Cholera, mam 40 KB powtórzeń na SO, ale tutaj nie mogę nawet edytować wiki tagu.
chaos

Odpowiedzi:

30

W pewien sposób popieram używanie struktury MVC nawet w prostej grze mobilnej. Co więcej, pomaga to w problemie, który dręczy programistów, którzy nie ugryzli go wystarczająco często: oddzielenie kodu wyświetlanego od logiki gry.

Powiem też jednak, aby pamiętać, że MVC, podobnie jak wszystkie wzorce projektowe, istnieje, aby ułatwić Ci życie . Oznacza to, że jeśli w danym momencie przestrzeganie pewnych zasad dotyczących tego, co powinieneś robić, a czego nie powinieneś robić podczas korzystania z MVC, utrudnia ci życie, zignoruj ​​to . Stanie się jedna z dwóch rzeczy: 1) później zostaniesz ugryziony, a potem zrozumiesz, dlaczego inaczej to zrobić w rzeczywistości ułatwiłoby ci życie na dłuższą metę, lub 2) żadnych konsekwencji.

Z natury programowanie komputerowe przyciąga wielu wyznawców reguł, którzy cenią przestrzeganie eleganckiej zasady nad faktycznym osiąganiem czegokolwiek i uwielbiają propagować swój system wartości; nie pozwól im uczynić cię jednym z nich. Najważniejszą rzeczą, jaka może się przydarzyć Twojej grze, jest jej wysyłka .

chaos
źródło
Drogi Chaosie, najbardziej podoba mi się twoja odpowiedź, dlatego zaznaczam ją jako odpowiedź na moje pytanie. Podejście MVC dodaje abstrakcję do projektowania kodu. Abstrakcja zwykle dodaje dodatkowe kroki kodu, których można uniknąć dzięki prostszemu projektowaniu. Jak dobrze zrozumiałem, nie muszę się martwić kosztami wynikającymi z abstrakcji dodanej w wyniku projektu MVC.
Bunkai.Satori
1
Dobra odpowiedź, +1 w tej sprawie. Teoria jest w porządku i dobrze, ale może spowodować, że gry nie zostaną wysłane, jeśli się nie uda.
James
@ Bunkai.Satori: Dodaje abstrakcję, a IMO jest użyteczną abstrakcją, która się opłaca. Zgadzam się z ostatnim stwierdzeniem, z wyjaśnieniem, że nie jest koszt, a nie sądzę, trzeba się o to martwić.
chaos
4

Projekty czasu kompilacji nie zużywają mocy procesora, chyba że masz niesamowicie fatalny kompilator. Język lub podejście obiektowe nie różni się cechami wydajnościowymi od proceduralnych. Nie będziesz wywoływać żadnych dodatkowych kosztów związanych z używaniem MVC. Modułowość istnieje w czasie kompilacji, a nie w czasie wykonywania, gdy kod zostanie wstawiony i zoptymalizowany, nie zrobi to żadnej różnicy.

Wiele współczesnych gier korzysta z modeli i widoków w osobnych wątkach i zyskuje ogromne korzyści na większości platform.

Ostatecznie MVC to dobry projekt, który zapewnia większą konserwację i mniej błędów itp. Za darmo . Nie ma powodu, aby go nie używać. To tak, jakby pytać, dlaczego warto użyćfor pętli zamiast ręcznie pisanych goto. Jeśli nie masz na myśli doskonałego projektu, na pewno jest lepszy niż nic.

Edycja: Projekty w czasie kompilacji nie zużywają mocy procesora. Oczywiście projekty wykonawcze, takie jak dziedziczenie.

DeadMG
źródło
-1. MVC to decyzja dotycząca czasu projektowania. Dziedziczenie jest decyzją w czasie projektowania. Oba występują przed czasem kompilacji i uruchomieniem. Oba mają duży wpływ na wydajność. Inlining nie zawsze przyspiesza kod. Twoja propozycja wątków jest niezwykle naiwna. Nic nie jest darmowe.
Dziękuję DeadMG za odpowiedź. Zasadniczo mam na myśli to, że z każdym poziomem abstrakcji kod staje się wolniejszy, w miarę dodawania coraz większej liczby etapów pośrednich. MVC jest bardziej abstrakcyjnym projektem, który najprawdopodobniej zaowocuje większą liczbą kroków do osiągnięcia tego samego zadania. To miałoby wpływ na prędkość, imo.
Bunkai.Satori
4

Prawie zawsze występuje kompromis między przejrzystością kodu a wymaganiami technicznymi (szybkość, pamięć itp.) Programu. Języki zorientowane obiektowo mają narzut w porównaniu z językami proceduralnymi, ale wykazano, że mają wiele zalet w stosunku do języków proceduralnych, szczególnie w długoterminowej konserwacji kodu (błędów itp.), A często także w szybkości programowania.

Mając to na uwadze, proponuję, aby MVC warto wdrożyć ze względu na Ciebie jako programistę gier . Twój kod będzie lepiej przestrzegał zasad obiektowych, zwłaszcza enkapsulacji , i zapewne będziesz miał znacznie łatwiejszy czas na utrzymanie go (naprawianie błędów lub dodawanie nowych funkcji).

Z drugiej strony upewnij się, że faktycznie ukończyłeś grę i nie spędzałeś tyle czasu na pracy nad „silnikiem”, że nigdy się nie uda.

Aby uzyskać więcej informacji, przeczytaj pytanie „Dlaczego MVC i TDD nie są więcej wykorzystywane w architekturze gier?” i moja naprawdę długa odpowiedź.

Ricket
źródło
1
Języki OO wcale nie są wolniejsze niż języki proceduralne. Jeśli napiszesz jakiś kod w C ++ z przesunięciem bitów, nie będzie on wolniejszy niż w C. Język lub program nie jest wolniejszy w porównaniu do proceduralnego, tylko dlatego, że jest zorientowany obiektowo. Programy wykazują tylko pogorszenie wydajności, ponieważ są źle napisane . W związku z tym czuję potrzebę zanegowania swojej odpowiedzi.
DeadMG
Cześć Ricket, dziękuję za wyjaśnienie yoru. Brzmi bardzo logicznie. DeadMG, no cóż, z jednej strony masz rację, z drugiej strony myślę, że podejście OO dodaje więcej bitów informacji w skompilowanym kodzie niż język proceduralny. Te dodatkowe bity kodu związanego z OO spowalniają powstały kod. Czy sie zgadzasz?
Bunkai.Satori
3
Whoa teraz ... Pewnie prosta linia w C ++ jak a++będzie dokładnie taka sama jak a++w C (gdzie ajest typem prymitywnym itp.). Ale rozważmy prostą klasę C ++ z funkcją wirtualną, która coś robi, ta funkcja wirtualna wiąże się z dużym obciążeniem w porównaniu z prostą funkcją C, nawet jeśli wewnętrzny kod jest identyczny. Języki obiektowe mają narzut . Przepraszamy za wyraźne powiedzenie „prędkość”. Jeśli dodatkowe przydziały pamięci i takie nie skutkują wolniejszym programem, masz całkowitą rację.
Ricket
2
Jeśli funkcja jest wirtualna, oznacza to, że program musi wybierać między 2 różnymi wersjami tej samej funkcji w czasie wykonywania. (W przeciwnym razie nie zrobiłbyś tego wirtualnym.) W tym przypadku i tak masz dodatkowy warunek lub poziom pośredni, który musiałbyś zaimplementować w języku proceduralnym (np. Za pomocą wskaźnika funkcji lub instrukcji switch) . To nie jest narzut - to nieodłączny problem.
Kylotan 26.01.11