2014-07-12 13 views
7

Chcę przechwycić ekran. Libgdx udostępnia niektóre funkcje zdefiniowane w klasie ScreenUtils.Libgdx używa asynchronicznie ScreenUtils i nie przerywa pętli gry

Na przykład final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);

Moim problemem jest to, że trwa około 1-3 sekund, aby uzyskać te informacje. W tym czasie pętla gry jest blokowana, a użytkownik definiuje ją jako opóźnienie.

Wewnętrznie klasa ScreenUtils, używa Gdx.gl.glReadPixels. Jeśli uruchomię metodę ScreenUtils.getFrameBufferPixmap w wątku, nie ma opóźnień, ale przechwytuje ona ekran w niewłaściwą metodę, co jest logiczne, ponieważ pętla gry działa i zmienia rzeczy.

Czy można w jakiś sposób skopiować kontekst GL lub zapisać go i wygenerować Pixmap w późniejszym czasie za pomocą wątku? Oczywiście operacja kopiowania/zapisywania powinna być wykonana natychmiast, w przeciwnym razie niczego nie oszczędzę.

Używam ShapeRenderer do renderowania moich rzeczy na ekranie.

Odpowiedz

2

Po trochę badań znalazłem szybszą alternatywę glReadPixels - obiektów Pixel Buffer który jest dostępny od Androida 4.3 - https://vec.io/posts/faster-alternatives-to-glreadpixels-and-glteximage2d-in-opengl-es

Nie jest możliwe wywołanie glReadPixels na innym wątku niż czynią wątek - https://stackoverflow.com/a/19975386/2158970

+0

Cóż, może to zadziałać, ale muszę użyć rzeczy OpenGL dostarczonych przez LibGDX i nie jestem do końca pewien, jak je podłączyć. – Niklas

1

Znalazłem rozwiązanie, które działa w moim przypadku, ponieważ mam tylko niewielkie grafiki/kształty. Zasadniczo kopiuję wszystkie obiekty, które są rysowane do widoku, as described here. W wątku tła I generate a Bitmap programmatically i wykorzystuję informacje przechowywane w moich obiektach, aby narysować do bitmapy.