2013-01-09 16 views
7

Uczę się Libgdx i mam kilka pytań dotyczących aktualizacji logiki gry podczas renderowania.Logika gry Libgdx w Renderowanie?

Idealnie chciałbym, aby moja logika gry i moje renderowanie były oddzielne. Powodem tego jest to, że mam wysoki FPS w systemie, moja pętla gry "szybciej" biec.

co szukam jest utrzymanie experance stała i possibily Ogranicz moją updates..if ktoś może mi punkt w kierunku tutorial jak a) ograniczyć moje czynią aktualizacji poprzez DeltaTime b) ograniczenia moją logikę gry aktualizacje za pośrednictwem Deltatime.

Dziękuję :)

+2

Oto wspaniały artykuł: http://www.koonsolo.com/news/dewitters-gameloop/ – nullpotent

Odpowiedz

3

Odpowiedź dotychczas nie wykorzystuje równoległe wątki - Miałem to pytanie sobie w przeszłości i byłem odradzane nim - link. Dobrym pomysłem byłoby najpierw uruchomić aktualizację światową, a następnie pominąć renderowanie, jeśli w ramce nie ma wystarczająco dużo czasu. Należy jednak stosować czasy delta, aby wszystko działało gładko i zapobiegać opóźnieniom.

Jeśli korzystasz z tej metody, rozsądnie byłoby zapobiec przekroczeniu X kolejnych pominięć ramek, ponieważ w (mało prawdopodobnym, ale możliwym, w zależności od tego, jak dużo logika aktualizacji jest porównywana do renderowania) należy uwzględnić logikę aktualizacji trwa dłużej niż całkowity czas przydzielony na klatkę, może to oznaczać, że renderowanie nigdy się nie wydarzy - i nie jest to coś, co chcesz. Ograniczając liczbę klatek, które pomijasz, zapewniasz płynne działanie aktualizacji, ale jednocześnie gwarantujesz, że gra nie zawiesza się, gdy jest za dużo logiki do obsługi.

+0

Dlaczego uważasz, że posiadanie nici do paralerek nie jest możliwe? Metoda 'render()' jest wywoływana przez moduł graficzny, więc posiadanie oddzielnych wątków byłoby korzystne. – jellyfication

+0

Cóż, szczerze mówiąc, założyłem, że libgdx będzie głównie używany do gier na Androida. I nie ma jeszcze wielu platform mobilnych z procesorami wielordzeniowymi. –

+0

Nie wiem, ile urządzeń wielordzeniowych z systemem Android jest, ale słyszałem, że program szeregujący android nie może wydajnie obsłużyć wielu rdzeni. Bez względu na to, wątpię, żeby wszystko oddać. Prawdopodobnie muszę to przetestować osobiście, co jest najlepsze. Może harmonogram jest lepszy, pytanie, które zadałeś, ma ponad rok. – jellyfication

7

Po ponownym przeczytaniu Twojego pytania, myślę, że lewę, której nam brakuje (na podstawie komentarza, że ​​działanie w systemie o wyższym poziomie odświeżania spowoduje, że logika gry będzie działała szybciej), polega na tym, że skalujesz swoje aktualizacje na podstawie w czasie "delta", który jest przekazywany do renderowania. Andrei Bârsan wspomniał o tym powyżej, ale pomyślałem, że nieco rozwinąłem kwestię wykorzystania delty.

Na przykład w renderowaniu mojej gry(), najpierw nazywam moją entityUpdate (delta), która aktualizuje i przesuwa wszystkie obiekty w mojej grze skalowane o odległość przebytą w czasie "delta" (nie renderuje one, po prostu przesuwają swoje zmienne pozycji). Następnie wywołuję entityManageCollisions (delta), która rozwiązuje wszystkie kolizje spowodowane przez aktualizację, a następnie w końcu wywołuje entityDraw (batch, delta), która używa delty, aby uzyskać odpowiednie ramki dla animacji ikonek i faktycznie rysuje wszystko na ekranie.

Używam wariantu Entity/Componet/System, więc obsługuję wszystkie moje podmioty w sposób ogólny, a te wywołania metod, o których wspomnę powyżej, są zasadniczo "systemami" działającymi na jednostkach z pewnymi kombinacjami komponentów na nich.

Wszystko, co powiem, przekazać delta (parametr przekazany do render()) do całej logiki, aby można skalować rzeczy (przenieść encje o odpowiednią odległość) w oparciu o czas, który upłynął od ostatnie połączenie. Wymaga to ustawienia prędkości w oparciu o jednostki/sekundę dla twoich jednostek, ponieważ podajesz wartość, aby je skalować, o ułamek sekundy. Gdy zrobisz to kilka razy i poeksperymentujesz z wynikami, będziesz w dobrej formie.

Uwaga: spowoduje to, że staniesz się szalony podczas interaktywnych sesji debugowania, ponieważ zegar delta gromadzi czas od ostatniego wywołania renderowania, co powoduje, że twoje jednostki latają na całym ekranie (i poza nim - sprawdzają dla ciebie te granice!), ponieważ generalnie uzyskują pod-sekundowe aktualizacje, ale mogą skończyć mijając 30 sekund (lub jak długo spędzisz patrząc na rzeczy przechodzące przez debugger), więc na samej górze mojego render(), mam linię, która mówi delta = 0.016036086f; (ten numer był detla próbki z mojej stacji roboczej dev i wydaje się dawać przyzwoite wyniki - można uchwycić typową deltę systemu wideo, zapisując ją na konsoli podczas testu, i użyć tej wartości zamiast tego, jeśli like), które komentuję, aby kompilacje zostały wdrożone, ale pozostawiają nie komentowane podczas debugowania, więc każda klatka przesuwa grę do przodu o stałą ilość, niezależnie od tego, ile czasu spędzam patrząc na rzeczy w debugerze.

Powodzenia!

+1

fajna wskazówka debugowania (delta statyczna) – Revolutionair

+0

Ustawianie delty w twoim Pętla renderowania podczas debugowania jest genialna i nie mam pojęcia, dlaczego nie pomyślałem o tym. – dustinroepsch