2010-10-31 25 views
7

Jak wiem, śledzenie GC nie może uniknąć blokowania gwintów podczas kompletnego GC.Luca GC i gra w czasie rzeczywistym

Użyłem XNA + C#, a czas GC był niemożliwy do usunięcia. Więc przełączyłem się na język niższego poziomu C, ale zdałem sobie sprawę, że potrzebuję języka skryptowego. Zastanawiam się nad Lua, ale martwię się mechanizmem GC Lui. Lua używa GC z przyrostowym śledzeniem, a także powinno być blokowane wątki.

Więc jak mam sobie z tym poradzić w grze w czasie rzeczywistym?

+2

Nie piszesz gry z tak ciasnymi wymaganiami FPS w języku GC, lub nie tworzysz wystarczająco dużo śmieci do sprawić, aby cykl GC trwał dłużej niż jest to dopuszczalne. Najpierw sprawdź, czy nie ma zauważalnego trafienia. – delnan

Odpowiedz

10

Moc Lua polega na tym, że zejdzie ci to z drogi. Chcesz zajęcia? Można to zbudować za pomocą metatabeli. Chcesz sandboxing? użyj lua_setfenv.

Co do śmieciarza. Użyj go jak jest jako pierwszy. Jeśli później zauważysz problemy z wydajnością, użyj lua_gc, aby dostroić jego zachowanie.

Kilka przykładów:

  • Wyłącz śmieciarza w tamtych czasach, gdy spowolnienie byłoby problemu.

  • Pozostaw garbage collector wyłączony i wykonaj tylko krok, gdy logika gry mówi, że masz jakąś głowę na swojej liczbie FPS. Możesz wstępnie ustawić rozmiar kroku lub odkryć optymalny rozmiar kroku w czasie wykonywania.

  • Wyłączyć kolektor i wykonać pełny odbiór w punktach zatrzymania, tj. Ekranie ładowania lub przyciętej scenie lub przy zmianie zmiany w grze z gorącym siedzeniem.

Można również rozważyć alternatywny język skryptowy. Squirrel bardzo ciężko próbuje być Lua drugiego pokolenia. Stara się zachować wszystkie dobre cechy Lui, jednocześnie rezygnując ze swoich błędów w projektowaniu. Jedną z dużych różnic między nimi jest squirrel uses reference counting zamiast usuwania śmieci. Okazuje się, że liczenie odwołań może być nieco wolniejsze niż odśmiecanie, ale jest bardzo deterministyczne (AKA realtime).

+0

Dzięki za odpowiedź. Twoja sugestia "Wiewiórka" wygląda bardzo dobrze. Wkrótce go wykopię :) – Eonil

3

Prawidłowy sposób obsłużyć to:

  1. napisać mały prototyp tylko z podstawowych rzeczy, które chcesz przetestować.
  2. Zapoznaj się z wieloma szczegółami, przedstawiając różne scenariusze, które mogą się zdarzyć w twojej grze (dużo dostępnej pamięci, mało dostępnej pamięci, różne liczby wątków itp.)
  3. Jeśli nie znajdziesz widocznego wąskiego gardła , możesz użyć Lua. W przeciwnym razie będziesz musiał szukać alternatywnych rozwiązań (być może Lisp lub Javascript).
+0

To smutne, że ten problem jest niemożliwy do uniknięcia, tylko można zmniejszyć. – Eonil

2

Można załatać Lua GC, aby ograniczyć czas każdego cyklu zbierania. Np .: http://www.altdevblogaday.com/2011/07/23/predictable-garbage-collection-with-lua/

Uważam, że nadal można mieć długie czasy GC podczas zbierania bardzo dużych tabel. Dlatego musisz przyjąć styl programowania, który unika dużych tabel.

Poniższy artykuł omawia dwie strategie używania Lua do sterowania robotem w czasie rzeczywistym (1. nie generuj śmieci lub 2).za pomocą przydzielającego O (1) i dostroić, gdy uruchamiana jest kolekcja GC): https://www.osadl.org/?id=1117

+0

Pierwszy link przeszedł 404. Na szczęście był to repost, a oryginał można jeszcze znaleźć tutaj: http://kalogirou.net/2011/07/23/predictable-garbage-collection- with-lua / –

Powiązane problemy