Libgdx utiliza ScreenUtils de forma asincrónica y no detiene el bucle del juego
Quiero capturar la pantalla. Libgdx proporciona algunas funciones definidas en la clase ScreenUtils .
Por ejemplo, final Pixmap pixmap = ScreenUtils.getFrameBufferPixmap(x, y, w, h);
- Caso de interés en multithreading con int volátil
- Enrutado del reproductor multimedia de Android
- ¿Cuándo debo usar cada uno de los diferentes tipos de mensajería de Android?
- Realización de tareas de fondo - ¿alternativa a AsyncTask?
- ¿En qué hilo se ejecuta onReceive () de un BroacastReceiver registrado con LocalBroadcastManager?
Mi problema es que se tarda unos 1-3 segundos en obtener esa información. Durante ese tiempo, el bucle del juego se bloquea y el usuario lo define como un retraso.
Internamente la clase ScreenUtils
, usa Gdx.gl.glReadPixels
. Si ejecuto el método ScreenUtils.getFrameBufferPixmap
en un subproceso, no hay retraso, pero captura la pantalla en el método incorrecto, lo cual es lógico desde que se ejecuta el bucle de juego y cambia la información.
¿Es de alguna manera posible copiar el contexto GL o guardarlo y generar el Pixmap en un momento posterior del tiempo con la ayuda de un hilo? Por supuesto, la copia / guardar la operación debe hacerse de forma instantánea, de lo contrario no ahorro nada.
Yo uso ShapeRenderer
para hacer mis cosas en la pantalla.
- ¿Hilo principal haciendo demasiado trabajo debido a llamadas asincrónicas de Firebase?
- Realizando operaciones de larga duración en onDestroy
- La animación de Android reduce el tartamudeo
- Cómo crear un hilo Looper, a continuación, enviar un mensaje de inmediato?
- cómo leer el flujo de entrada de socket en Android
- Android: ¿Un nuevo hilo simplemente se detendrá después de haber terminado su ejecución?
- Pausa con handler y postDelayed en android
- Obtener No puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () con código que funcionó para Android 4
Después de poca investigación he encontrado una alternativa más rápida a glReadPixels – Pixel Buffer Object que está disponible desde Android 4.3 – https://vec.io/posts/faster-alternatives-to-glreadpixels-and-glteximage2d-in-opengl-es
No es posible llamar a glReadPixels en otro subproceso que render thread – https://stackoverflow.com/a/19975386/2158970
He encontrado una solución, que funciona en mi caso ya que sólo tengo gráficos / formas menores. Básicamente, copio todos los objetos, que son dibujados a la vista, como se describe aquí. En un subproceso de fondo genero un mapa de bits mediante programación y uso la información almacenada en mis objetos para dibujar al mapa de bits.
- Patrón de comandos para pasar los métodos de actividad de la aplicación?
- La barra de herramientas no se oculta en RecyclerView