Ile wątków powinna używać gra na Androida?

28

Co najmniej gra OpenGL na Androida ma wątek interfejsu użytkownika i wątek renderujący utworzony przez GLSurfaceView. Renderer.onDrawFrame()powinien wykonywać minimum pracy, aby uzyskać najwyższy FPS. Fizyka, sztuczna inteligencja itp. Nie muszą uruchamiać każdej klatki, więc możemy umieścić je w innym wątku. Teraz mamy:

  1. Wątek renderowania - Aktualizuj animacje i rysuj polisy
  2. Wątek z gry - Logika i okresowe aktualizacje, sztuczna inteligencja itp
  3. Wątek interfejsu użytkownika - tylko interakcja interfejsu użytkownika Androida

Ponieważ nigdy nie chcesz blokować wątku interfejsu użytkownika, uruchamiam jeszcze jeden wątek dla logiki gry. Może to nie jest konieczne? Czy kiedykolwiek istnieje powód, aby uruchamiać logikę gry w wątku renderera?

kvance
źródło

Odpowiedzi:

18

Chris Pruett z Google mówi o tym problemie na swoim blogu Replica Island . Ponieważ eglSwapBuffers () to wywołanie blokujące w wątku GLSurfaceView, posiadanie kodu logiki gry w innym wątku pozwala na jego uruchomienie, gdy wywołanie buforów wymiany jest blokowane. Jest to ważne, jeśli gra jest złożona i chcesz osiągnąć 60 klatek na sekundę.

Możesz pobrać kod źródłowy dla wyspy repliki i zobaczyć, jak to zrobili. Zaimplementowałem coś podobnego do mojej gry (z trzema wątkami, o których mówiłeś) i działa świetnie.

Firas Assaad
źródło
2

Android obsługuje standardowe wątki Java. Możesz użyć standardowych wątków i narzędzi z pakietu java.util.concurrent, aby umieścić działania w tle. Jedynym ograniczeniem jest to, że nie można bezpośrednio zaktualizować interfejsu użytkownika z procesu w tle.

Jeśli musisz zaktualizować interfejs użytkownika z zadania w tle, musisz użyć niektórych klas specyficznych dla Androida. Możesz użyć do tego klasy android.os.Handler lub klasy AsyncTasks.

Aby uzyskać więcej informacji, sprawdź poniższy link ....

http://mindstick.com/Articles/7a9205de-bae7-48ba-81b5-2b2ec161d672/?Thread%20in%20Android

Ratan Sharma
źródło