Podczas testowania gry, nad którą właśnie pracuję natrafiłem na dziwny błąd. Czasami, raz na 10-20 minut gra zawieszała się na moment. Najpierw zauważyłem, że silnik wypluwa w tym momencie dużą liczbę wierszy debugu:
Time: Detected gettimeofday() going backwards on Unix, workarounding. This is known to happen on some Android devices
Ograniczyłem więc debug, do jednej linijki, co znacznie skróciło czas przestoju, lecz występował on nadal. Podobnie jak Michalis założyłem, że to pewnie wada mojego telefonu. Jednak ciągle zastawiało mnie dlaczego inne gry działają płynnie.
Zegary w Androidzie
Po krótkim dochodzeniu okazało się że czas w androidzie można pobierać na kilka sposobów. Domyślny zegar zwany „ściennym”, dość często synchronizuje się z siecią co może powodować skoki do przodu i do tyłu. Tego zegara używa właśnie funkcja fpgettimeofday()
, z której korzystało CGE i silnik fizyki Kraft.
Monotoniczny zegar w Androidzie
Aby skorzystać z zegara, który gwarantuje monotoniczną ciągłość należy użyć funkcji clock_gettime(CLOCK_MONOTONIC)
z modułu Linux
. Po wprowadzeniu tych zmian gra zaczęła działać idealnie bez żadnych chwilowych zamrożeń.
Poprawki Castle Game Engine i Kraft
Jeżeli, planujesz stworzenie gry dla Androida pamiętaj, że w Castle Game Engine problem został rozwiązany 18 sierpnia 2019r.
W oficjalnym repozytorium Kraft został naprawiony 21 sierpnia 2019r.