GPU-Rendering
Während Skija auf der CPU außergewöhnlich gut performt, entfaltet es seine wahre Stärke bei der Nutzung von GPU-Beschleunigung über OpenGL, Metal, Vulkan oder Direct3D.
Konzepte
DirectContext
Der DirectContext repräsentiert die Verbindung zum GPU-Treiber. Er verwaltet GPU-Ressourcen, Caches und den Zustand der zugrundeliegenden Grafik-API.
BackendRenderTarget
Ein BackendRenderTarget repräsentiert einen Puffer (wie einen OpenGL-Framebuffer oder eine Metal-Textur), in den Skia zeichnen kann.
Beispiel: OpenGL mit LWJGL
So rendern Sie in ein OpenGL-Fenster mit LWJGL:
- OpenGL initialisieren: Verwenden Sie LWJGL, um ein Fenster und einen GL-Kontext zu erstellen.
- DirectContext erstellen:java
DirectContext context = DirectContext.makeGL(); - Render Target erstellen: Sie müssen Skia mitteilen, in welchen Framebuffer gezeichnet werden soll (normalerweise
0für das Standardfenster).javaBackendRenderTarget rt = BackendRenderTarget.makeGL( width, height, 0, /* samples */ 8, /* stencil */ fbId, /* GL framebuffer id */ FramebufferFormat.GR_GL_RGBA8 ); - Surface erstellen:java
Surface surface = Surface.makeFromBackendRenderTarget( context, rt, SurfaceOrigin.BOTTOM_LEFT, ColorType.RGBA_8888, ColorSpace.getSRGB() );
Die Render-Schleife
In einer GPU-beschleunigten Umgebung müssen Sie Skia manuell anweisen, Befehle an die GPU zu senden.
java
while (!window.shouldClose()) {
Canvas canvas = surface.getCanvas();
// 1. Zeichnen Sie Ihre Inhalte
canvas.clear(0xFFFFFFFF);
canvas.drawCircle(50, 50, 30, paint);
// 2. Befehle zur GPU senden
context.flush();
// 3. Puffer tauschen (grafik-API-spezifisch)
window.swapBuffers();
}Best Practices
- Kontext wiederverwenden: Das Erstellen eines
DirectContextist aufwändig. Erstellen Sie ihn einmal und verwenden Sie ihn für die gesamte Laufzeit Ihrer Anwendung. - Größenänderung behandeln: Wenn die Fenstergröße geändert wird, müssen Sie die alte
Surfaceund das alteBackendRenderTargetclose()n und neue erstellen, die den neuen Abmessungen entsprechen. - Ressourcenverwaltung: GPU-gestützte Surfaces sollten geschlossen werden, wenn sie nicht mehr benötigt werden, um VRAM freizugeben.