2012-10-01 13 views
6

Hej chłopaki pracuję na co grę z libgdx i naprawdę chcę do wątku grę więc używam pętlę farby i pętlę logiczną na osobne wątki tak jak byś dokonywania huśtawka gry proste java z pętlą paintComponent i gotowej do uruchomienia pętli wykonywaniawątki Java w libgdx

ja doświadczenie z gwintem w C, ale nie tyle Java jedyny sposób mógł dokonać nić poprzez klasę, która rozciąga się nici, a następnie tworząc przebieg zapętlałem się tam

ale celem uruchomienia pętli było umożliwienie każdemu ekranowi swobodnego obliczyć logikę, więc potrzebowałbym jakiegoś rodzaju klasy abstractscreen, która ma niestandardową wartość klasa ad realizowane

Im pytaniem, czy jest prostsze lub bardziej standardowy sposób wdrażania wątki w tej sytuacji

Odpowiedz

11

libgdx biblioteka już działa oddzielnego wątku renderowania dla aktualizacji kontekstu OpenGL. Zobacz http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

Mamy już dowiedział się, że wątek UI nie jest wykonywany w sposób ciągły, ale tylko zaplanowane przez system operacyjny, jeśli zdarzenie musi zostać wysłany (w przybliżeniu: p). Właśnie dlatego tworzymy drugi wątek, który zwykle nazywamy wątkiem renderującym. Ten wątek jest tworzony przez moduł Graphics, który sam tworzy instancję podczas uruchamiania aplikacji.

Sposób ApplicationListener.render() na głównym obiekcie gra zostanie wywołany przez tego wątku renderowania raz dla każdego odświeżania ekranu (tak powinno być około 60 Hz), więc wystarczy umieścić ciało swojej renderowania pętli w implementacji tej metody .

Można utworzyć dodatkowy wątek tła (na przykład do logiki gry) w metodzie create swój ApplicationListener (należy go oczyścić w metodzie dispose). Poza wątkiem render, nie sądzę, aby którykolwiek z wcześniej istniejących wątków był odpowiednim miejscem dla logiki gry.

do komunikacji między wątków, można użyć żadnej z istniejących metod synchronizacji Java. Użyłem Java ArrayBlockingQueue<> do wysyłania żądań do wątku w tle. I użyłem Gdx.app.postRunnable(), aby moje wątki w tle przesuwały dane do wątku renderowania (takie Runnables są uruchamiane w następnej klatce, zanim zostanie wywołana render()).

+0

Może byłem niejasny Jestem świadomy, że render jest wątkiem i ciągle się pętli.ale szukałem, czy mogę mieć oddzielny wątek dla rzeczywistej logiki gry. czy libGDX tworzy nowy wątek renderowania w jaki sposób mam uzyskać dostęp do wątku nadrzędnego lub źródłowego? – Mintybacon

+0

@Mintybacon Zaktualizowałem swoją odpowiedź, podając więcej szczegółów na temat opcji komunikacji między wątkami. Mam nadzieję że to pomoże. –

0

Nie wiem, co masz na myśli, ale to jest standard, że rysunek na ekranie (odzwierciedlać zmiany w wyświetlaczu) jest wykonywany przez dedykowany pojedynczy wątek (np zobacz framework Swing). Dzieje się tak dlatego, że wiele wątków nie jest w stanie narysować na ekranie bez bałaganu - tylko kilka implementacji to robi. W związku z tym, jeśli planujesz implementować środowisko GUI, zalecane byłoby podejście oparte na pojedynczym wątku.

Co do logiki biznesowej, to zależy od wielu rzeczy. Bardzo proste podejście może rzeczywiście stworzyć nowy wątek dla każdego działania. Te wątki mogą następnie opublikować wynik we wspomnianym wątku GUI. Problem z tym podejściem polega na tym, że wydajność może znacznie spaść, jeśli jednocześnie wykonywanych jest wiele czynności, ponieważ w Javie każdy wątek jest odwzorowywany na natywny wątek systemu operacyjnego. Możesz użyć pul wątków, aby tego uniknąć. Standardowa biblioteka Java udostępnia pule wątków jako ThreadPoolExecutor lub jeśli chcesz nieco wyższą abstrakcję, ExecutorService.

+0

Dzięki Ill zajrzeć do ThreadPoolExecutor i wrócić do Ciebie! – Mintybacon