Referencia de la API: DirectContext (Estado y Contexto GL)
La clase DirectContext es tu puente hacia la GPU. Gestiona la conexión con la API gráfica subyacente (OpenGL, Metal, Vulkan o Direct3D) y maneja el ciclo de vida de los recursos de la GPU.
Crear un Contexto
Normalmente se crea un DirectContext por aplicación y se reutiliza durante toda su vida útil.
// Para OpenGL
DirectContext context = DirectContext.makeGL();
// Para Metal (macOS/iOS)
DirectContext context = DirectContext.makeMetal(devicePtr, queuePtr);Envío de Comandos
Skia registra comandos de dibujo en un búfer interno. Debes indicar explícitamente a Skia que envíe estos comandos a la GPU.
flush(): Envía los comandos registrados al búfer del controlador de la GPU.submit(): Asegura que la GPU comience realmente a procesar los comandos.flushAndSubmit(syncCpu): La forma más común de finalizar un fotograma. SisyncCpues verdadero, se bloquea hasta que la GPU haya terminado completamente.
context.flushAndSubmit(true);Gestionar el Estado GL
Cuando Skija se usa junto con otro código OpenGL (por ejemplo, en un motor de juegos o una interfaz de usuario personalizada), el código externo podría cambiar el estado de OpenGL (como vincular un programa diferente o cambiar el viewport). Skia necesita conocer estos cambios para evitar errores de renderizado.
Restablecer el Estado
Si tú o una biblioteca que uses modifica el estado de OpenGL, debes notificar a Skia:
// Notificar a Skia que TODOS los estados de OpenGL podrían haber cambiado
context.resetGLAll();
// O ser más específico para un mejor rendimiento
context.reset(BackendState.GL_PROGRAM, BackendState.GL_TEXTURE_BINDING);Abandonar el Contexto
Si se pierde el contexto de GPU subyacente (por ejemplo, se destruyó la ventana o se bloqueó el controlador), usa abandon() para evitar que Skia realice más llamadas nativas que podrían causar un bloqueo.
context.abandon();Mejores Prácticas
- Seguridad de Hilos: Un
DirectContextno es seguro para hilos. Todas las llamadas a él, y todo el dibujo en superficies asociadas a él, deben ocurrir en el mismo hilo. - Higiene del Estado: Si mezclas Skija con llamadas OpenGL directas, llama siempre a
context.resetGLAll()antes de devolver el control a Skija. - Flush de Superficie: Si tienes múltiples superficies, puedes hacerles flush individualmente:
context.flush(surface).