API-Referenz: DirectContext (GL-Zustand & Kontext)
Die DirectContext-Klasse ist Ihre Brücke zur GPU. Sie verwaltet die Verbindung zur zugrundeliegenden Grafik-API (OpenGL, Metal, Vulkan oder Direct3D) und kümmert sich um den Lebenszyklus von GPU-Ressourcen.
Einen Kontext erstellen
Typischerweise erstellen Sie einen DirectContext pro Anwendung und verwenden ihn während ihrer gesamten Laufzeit wieder.
// Für OpenGL
DirectContext context = DirectContext.makeGL();
// Für Metal (macOS/iOS)
DirectContext context = DirectContext.makeMetal(devicePtr, queuePtr);Befehlssubmission
Skia zeichnet Zeichenbefehle in einen internen Puffer auf. Sie müssen Skia explizit anweisen, diese Befehle an die GPU zu senden.
flush(): Übermittelt aufgezeichnete Befehle an den Puffer des GPU-Treibers.submit(): Stellt sicher, dass die GPU tatsächlich mit der Verarbeitung der Befehle beginnt.flushAndSubmit(syncCpu): Die gängigste Methode, um einen Frame abzuschließen. WennsyncCputrue ist, blockiert der Aufruf, bis die GPU vollständig fertig ist.
context.flushAndSubmit(true);GL-Zustand verwalten
Wenn Skija neben anderem OpenGL-Code verwendet wird (z.B. in einer Spiel-Engine oder einer benutzerdefinierten UI), könnte der externe Code den OpenGL-Zustand ändern (z.B. ein anderes Programm binden oder den Viewport ändern). Skia muss über diese Änderungen informiert werden, um Renderfehler zu vermeiden.
Zustand zurücksetzen
Wenn Sie oder eine von Ihnen verwendete Bibliothek den OpenGL-Zustand modifiziert, müssen Sie Skia benachrichtigen:
// Skia mitteilen, dass sich ALLE OpenGL-Zustände geändert haben könnten
context.resetGLAll();
// Oder für bessere Performance spezifischer sein
context.reset(BackendState.GL_PROGRAM, BackendState.GL_TEXTURE_BINDING);Kontext aufgeben
Wenn der zugrundeliegende GPU-Kontext verloren geht (z.B. weil das Fenster zerstört wurde oder der Treiber abgestürzt ist), verwenden Sie abandon(), um zu verhindern, dass Skia weitere native Aufrufe tätigt, die einen Absturz verursachen könnten.
context.abandon();Best Practices
- Thread-Sicherheit: Ein
DirectContextist nicht thread-sicher. Alle Aufrufe darauf und alle Zeichenoperationen auf zugehörigen Surfaces müssen im selben Thread erfolgen. - Zustandshygiene: Wenn Sie Skija mit reinen OpenGL-Aufrufen mischen, rufen Sie immer
context.resetGLAll()auf, bevor Sie die Kontrolle an Skija zurückgeben. - Surface flushen: Wenn Sie mehrere Surfaces haben, können Sie sie einzeln flushen:
context.flush(surface).