Jakie pułapki napotkałeś podczas pisania gier na PC w zarządzanym języku, takim jak C #, i jak je rozwiązałeś?
Jakie pułapki napotkałeś podczas pisania gier na PC w zarządzanym języku, takim jak C #, i jak je rozwiązałeś?
Odpowiedzi:
Nie wiem dużo o Javie, więc jest to z punktu widzenia dewelopera .net.
Zdecydowanie największym jest śmieci. kolektor śmieci .NET w systemie Windows wykonuje fantastyczną robotę i możesz uciec bez dziecka w większości. Na xbox / winPhone7 to inna sprawa. Jeśli dostajesz przeciągnięcia co kilka klatek, usuwanie śmieci może powodować problemy. W tej chwili uruchamia się po każdym przydziale 1 MB.
Oto kilka wskazówek dotyczących postępowania ze śmieciami. W rzeczywistości nie powinieneś martwić się większością z nich, ale któregoś dnia mogą się przydać.
GC.GetTotalMemory()
ekranu. Daje to przybliżoną ilość przydzielonych bajtów używanych przez grę. Jeśli prawie się nie porusza, masz się dobrze. Jeśli szybko rośnie, masz problemy.GC.Collect()
każdej ramki. To może wydawać się dobrym pomysłem, utrzymywanie nadmiaru śmieci i tak dalej, ale pamiętajcie, że tylko z gorszym niż zbiórka śmieci jest ponad śmieci.StringBuilder
(uwaga, StringBuilder
nie jest to magiczna kula i wciąż może powodować alokacje! Oznacza to, że proste operacje, takie jak dodanie liczby na końcu łańcucha, mogą spowodować zaskakujące ilości śmieci) lub używanie foreach
pętli w kolekcjach korzystających z IEnumerable
interfejsu może również tworzyć śmieci bez Twojej wiedzy (na przykład foreach (EffectPass pass in effect.CurrentTechnique.Passes)
jest to powszechne)IDisposable
na klasach, które zawierają niezarządzane zasoby. Możesz ich użyć do wyczyszczenia pamięci, GC nie może się zwolnić.Inną rzeczą do przemyślenia jest wydajność zmiennoprzecinkowa. Chociaż .Net JITer wykonuje sporo optymalizacji specyficznych dla procesora, nie może używać SSE ani żadnych innych zestawów instrukcji SIMD do przyspieszenia matematyki zmiennoprzecinkowej. Może to powodować dość dużą różnicę prędkości między C ++ i C # w grach. Jeśli używasz mono, mają specjalne biblioteki matematyczne SIMD, z których możesz skorzystać.
Typowym problemem związanym z wydajnością nie jest uwzględnianie śmieciarza w projektowaniu / rozwoju gry. Wytwarzanie zbyt dużej ilości śmieci może prowadzić do „czkawek” w grze, które mają miejsce, gdy GC działa przez dość długi czas.
W przypadku języka C # użycie obiektów wartości i instrukcji „using” może złagodzić presję ze strony GC.
using
Oświadczenie nie ma nic wspólnego ze zbierania śmieci! Jest przeznaczony dla IDisposable
obiektów - które służą do zwalniania niezarządzanych zasobów (tj. Takich, które nie są obsługiwane przez moduł odśmiecania ).
Powiedziałbym, że największym problemem, jaki napotkałem podczas pisania gier w C #, był brak porządnych bibliotek. Większość, które znalazłem, to albo bezpośrednie porty, ale niekompletne, lub owijarki w bibliotece C ++, które ponoszą ciężką karę wydajności za zestawianie. (Mówię konkretnie o MOgre i Axiom w bibliotece OGRE oraz BulletSharp w bibliotece fizyki Bullet)
Języki zarządzane (w odróżnieniu od Interpretowanych - ani Java, ani C # nie są już interpretowane) mogą być tak szybkie jak języki rodzime, jeśli dobrze rozumiesz, co tak naprawdę spowalnia (zbieranie, usuwanie śmieci). Myślę, że prawdziwym problemem jest to, że twórcy bibliotek jeszcze tego nie zauważyli.
Jak mówili inni, największym problemem są przerwy w gromadzeniu GC. Korzystanie z pul obiektów jest jednym typowym rozwiązaniem.
C # i Java nie są interpretowane. Są one kompilowane do pośredniego kodu bajtowego, który po JIT staje się tak samo szybki jak kod macierzysty (lub wystarczająco blisko, aby być nieznacznym)
Największą pułapką, jaką znalazłem, jest uwolnienie zasobów, które bezpośrednio wpływają na wrażenia użytkownika. Te języki nie obsługują automatycznie deterministycznej finalizacji, podobnie jak C ++, co, jeśli nie spodziewasz się, że może prowadzić do takich rzeczy jak siatki unoszące się wokół sceny po tym, jak myślałeś, że zostały zniszczone. (C # dokonuje deterministycznej finalizacji poprzez IDisposable , nie jestem pewien, co robi Java.)
Poza tym zarządzane języki są naprawdę o wiele bardziej zdolne do radzenia sobie z wydajnością, jakiej wymagają gry, niż zdobywają uznanie. Dobrze napisany kod zarządzany jest znacznie szybszy niż źle napisany kod natywny.
IDisposable
umożliwia deterministyczne czyszczenie krytycznych czasowo i niezarządzanych zasobów, ale nie wpływa bezpośrednio na finalizację ani moduł wyrzucania elementów bezużytecznych.
Ani Java, ani C # nie są interpretowane. Oba zostaną skompilowane w natywny kod maszynowy.
Największym problemem zarówno z nimi, jak i grami jest konieczność kodowania w taki sposób, aby nigdy nie wyrzucały śmieci podczas gry. Liczba obręczy, które musisz przeskoczyć, aby to osiągnąć, prawie przewyższa zalety korzystania z nich w pierwszej kolejności. Należy unikać większości funkcji, które sprawiają, że język ten jest przyjemny w programowaniu aplikacji lub serwera podczas programowania gier, w przeciwnym razie podczas grania dostaniesz długie przerwy w grze i zbieranie śmieci.
Jedną z dużych pułapek, jakie widzę podczas tworzenia gier w takich językach (lub przy użyciu narzędzi takich jak XNA, silnik TorqueX itp.) Jest to, że trudno będzie znaleźć zespół dobrych ludzi z doświadczeniem potrzebnym do stworzenia gry równoważnej z byłoby dość łatwo znaleźć ludzi w C ++ i OpenGL / DirectX.
Branża twórców gier jest nadal bardzo mocno zanurzona w C ++, ponieważ większość narzędzi i potoków używanych do wypychania dużych lub po prostu dobrze dopracowanych małych gier została napisana w C ++ i, o ile wiem, WSZYSTKIE oficjalne zestawy deweloperów, które możesz get for XBox, PS3 i Wii są wydawane tylko z kompatybilnością z C ++ (zestaw narzędzi XBox może być obecnie bardziej zarządzany, czy ktoś wie więcej?)
Jeśli chcesz teraz tworzyć gry na konsole, prawie XNA i C # dostajesz na XBox, a potem tylko w bocznej części biblioteki gier o nazwie XBox Live Indie Games. Niektórzy, którzy wygrywają konkursy itp., Są wybierani do przeniesienia swojej gry do prawdziwej konsoli gier XBox. Poza planem stworzenia gry na PC.