Renderizado por GPU
Si bien Skija tiene un rendimiento excepcional en la CPU, su verdadero poder se despliega al utilizar aceleración por GPU mediante OpenGL, Metal, Vulkan o Direct3D.
Conceptos
DirectContext
El DirectContext representa la conexión con el controlador de la GPU. Gestiona los recursos de la GPU, las cachés y el estado de la API gráfica subyacente.
BackendRenderTarget
Un BackendRenderTarget representa un búfer (como un Framebuffer de OpenGL o una Textura de Metal) en el que Skia puede dibujar.
Ejemplo: OpenGL con LWJGL
Para renderizar en una ventana OpenGL usando LWJGL:
- Inicializar OpenGL: Usa LWJGL para crear una ventana y un contexto GL.
- Crear DirectContext:java
DirectContext context = DirectContext.makeGL(); - Crear Render Target: Debes indicarle a Skia en qué framebuffer dibujar (normalmente
0para la ventana por defecto).javaBackendRenderTarget rt = BackendRenderTarget.makeGL( width, height, 0, /* muestras */ 8, /* stencil */ fbId, /* id del framebuffer GL */ FramebufferFormat.GR_GL_RGBA8 ); - Crear Surface:java
Surface surface = Surface.makeFromBackendRenderTarget( context, rt, SurfaceOrigin.BOTTOM_LEFT, ColorType.RGBA_8888, ColorSpace.getSRGB() );
El Bucle de Renderizado
En un entorno acelerado por GPU, debes indicar manualmente a Skia que envíe los comandos a la GPU.
java
while (!window.shouldClose()) {
Canvas canvas = surface.getCanvas();
// 1. Dibuja tu contenido
canvas.clear(0xFFFFFFFF);
canvas.drawCircle(50, 50, 30, paint);
// 2. Envía los comandos a la GPU
context.flush();
// 3. Intercambia los búferes (específico de la API gráfica)
window.swapBuffers();
}Mejores Prácticas
- Reutiliza el Contexto: Crear un
DirectContextes costoso. Créalo una vez y úsalo durante toda la vida útil de tu aplicación. - Maneja el Cambio de Tamaño: Cuando se redimensiona la ventana, debes
close()elSurfaceyBackendRenderTargetantiguos y crear otros nuevos que coincidan con las nuevas dimensiones. - Gestión de Recursos: Las superficies respaldadas por GPU deben cerrarse cuando ya no sean necesarias para liberar VRAM.