Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - dsonyy

Strony: [1]
1
Allegro / Odp: Stała szybkość gry i nielimitowana liczba FPS
« dnia: Sierpień 13, 2017, 01:07:05 »
Cała zasada działania pętli wraz z jej nie-Allegrową implementacją opisana jest w artykule z pierwszego posta. Przedstawia on też całkiem inne podejścia do tematu.

A co do rozbudowanego opisu, może faktycznie trochę przesadziłem ;) Jednak zasada działania mocno utkwiła mi przez to w pamięci.

2
Allegro / Odp: Stała szybkość gry i nielimitowana liczba FPS
« dnia: Sierpień 13, 2017, 00:13:48 »
Jeżeli logika nie zmieni pozycji obiektów, niczego nie zmieni na scenie to po co taką scenę powtórnie renderować?
Wyjaśnię to na przykładzie. Mamy prostokąt. Funkcja render() wyświetla figurę na ekranie. Funkcja logic() za każdym razem przesuwa ów prostokąt o 10px w prawo.
Przykładowe działanie pętli, którą opisujesz, wygląda tak:
  • logic() - Przesunięcie obiektu na pozycję (100, 100),
  • render() - Wyrenderowanie prostokąta na pozycji (100, 100),
  • render() - Ponowne wyrenderowanie prostokąta na pozycji (100, 100),
  • render() - i znowu (100, 100),
  • render() - ... ,
  • logic() - O! Przesunięcie na pozycję (110, 100),
Faktycznie, funkcja renderująca jest wywoływana wiele razy, ale w praktyce nic to nie daje. Natomiast w moim przypadku funkcja render() przyjmuje dodatkowy argument zwany interpolacją. Co to ta interpolacja? Funckja logic() w mojej pętli jest zawsze wywoływana 25 razy na sekundę - czyli raz na 40 milisekund. Interpolacja to liczba milisekund, które minęły od ostatniego wywołania logic() podzielona przez częstotliwość wywołań logiki (40 milisekund). Przykład:

'i' to interpolacja obliczana funkcją inter()
  • logic() - Przesunięcie obiektu na pozycję (100, 100),
  • inter() - obliczenie interpolacji (od wywołania logic() minęło 0ms; interpolacja = 0.0),
  • render(i) - Wyrenderowanie obiektu na pozycji (100, 100),
  • inter() - obliczenie interpolacji (od wywołania logic() minęło 20ms; interpolacja = (20 / 40) = 0.5)
  • render(i) - Wyrenderowanie obiektu na pozycji (105, 100)(!) - mimo iż fizycznie znajduje się na (100,100),
  • inter() - obliczenie interpolacji (od wywołania logic() minęło 30ms; interpolacja = (30 / 40) = 0.75),
  • render(i) - Wyrenderowanie obiektu na pozycji (107, 100),
  • logic() - Faktyczne przesunięcie obiektu na pozycję (110, 100),
  • inter() - obliczenie interpolacji (od wywołania logic() minęło 0ms; interpolacja = 0.0),
  • render(i) - Wyrenderowanie obiektu na pozycji (110, 100),
Jak widać, korzystanie z tego zabiegu zaczyna mieć powoli sens.

W funkcji render() 'widoczne' współrzędne obiektu są obliczane w ten sposób:
view_position = position + (speed * interpolation);Czyli:
view_position = 100 + (10 * (20 / 40)); // view_position równe 105
view_position = 100 + (10 * (30 / 40)); // view_position równe 107
// interpolacja to (liczba milisekund od ostatniego wywołania logic()) / (częstotliwość logiki (40ms))

Mam nadzieję, że moje wypociny będą dla kogoś zrozumiałe ;) Implementacja takiej pętli wiąże się oczywiście z rozbudową funkcji render() o dodatkowe mechanizmy sprawdzające, czy ciało jest w ruchu i obliczające 'widoczne' pozycje obiektów. Efektem jest to, że logika generuje stale 25 'surowych' klatek na sekundę, natomiast render(i) rysuje dodatkowo klatki 'pośrednie' nadając grze większą płynność.
 

3
Allegro / Stała szybkość gry i nielimitowana liczba FPS
« dnia: Sierpień 12, 2017, 00:48:44 »
Witam.
Jestem po lekturze tego (deWiTTERS Game Loop) artykułu o pętlach głównych stosowanych w grach. Rozpocząłem implementację ostatniej przedstawionej pętli korzystając z dobrodziejstw Allegro 5 i napotkałem na problem.

Skrócone założenia działania pętli:
  • szybkość gry (logiki) ma być stała (np. 25/s),
  • renderowanie klatek ma następować tak szybko jak to możliwe (brak maksymalnej liczby FPS),
  • funkcja rysująca jest wywoływana częściej niż logika, więc posiada możliwość sztucznego wytwarzania 'pośrednich' klatek pomiędzy dwoma wywołaniami logiki (dokładniej opisano to w artykule).

Nie mam wielkiego doświadczenia z Allegro 5 i jedyne co przychodzi mi do głowy to korzystanie ze standardowego ALLEGRO_EVENT_QUEUE, timera i switcha na eventy (link to allegrowej wiki). Jednak w tym przypadku wywołania funkcji rysującej siłą rzeczy będą regulowane przez timery. Prosiłbym o rady dotyczące tego w jaki sposób zaimplementować omawianą pętlę.

Z góry wielkie dzięki.

Strony: [1]