Ressourcenverwaltung
Skija ist ein Java-Wrapper um die C++ Skia-Bibliothek. Das bedeutet, dass viele Java-Objekte von nativen C++-Ressourcen unterstützt werden. Das Verständnis, wie diese Ressourcen verwaltet werden, ist entscheidend für den Aufbau stabiler und effizienter Anwendungen.
Automatische Speicherverwaltung
Standardmäßig verwaltet Skija den Speicher automatisch. Die meisten Skija-Objekte erweitern die Klasse Managed. Wenn ein Java-Objekt vom Garbage Collector eingesammelt wird, stellt Skija sicher, dass die entsprechende native C++-Ressource ebenfalls freigegeben wird.
void drawSomething(Canvas canvas) {
Paint paint = new Paint(); // Native Ressource allokiert
canvas.drawCircle(50, 50, 20, paint);
} // paint verlässt den Gültigkeitsbereich, wird später vom GC bereinigtFür die meisten Anwendungsfälle ist dieses "standardmäßig sichere" Verhalten genau das, was Sie wollen.
Manuelle Ressourcenfreigabe
In leistungskritischen Anwendungen oder beim Umgang mit vielen kurzlebigen Objekten möchten Sie native Ressourcen möglicherweise sofort freigeben, anstatt auf den Garbage Collector zu warten.
Alle Managed-Objekte implementieren AutoCloseable, sodass Sie das try-with-resources-Muster verwenden können:
void drawCircle(Canvas canvas) {
try (Paint p = new Paint()) {
canvas.drawCircle(50, 50, 20, p);
} // Native Ressource wird HIER SOFORT freigegeben
}Warnung: Sobald ein Objekt geschlossen ist, kann es nicht mehr verwendet werden. Der Versuch, ein geschlossenes Objekt zu verwenden, führt zu einer Ausnahme oder einem Absturz.
Wiederverwendung von Objekten
Da die Erstellung nativer Objekte Overhead verursachen kann, ist es oft besser, sie wiederzuverwenden, insbesondere in einer Render-Schleife.
class MyApp {
private final Paint paint = new Paint().setColor(0xFFFF0000);
void onRender(Canvas canvas) {
canvas.drawCircle(100, 100, 50, paint); // Dasselbe Paint-Objekt wiederverwenden
}
}Kapselung und Getter
Skija verwendet eine spezielle Konvention für seine Datenklassen (wie Rect, Color4f). Sie werden oft öffentliche Felder sehen, die mit einem Unterstrich beginnen (z. B. _r, _g, _b in Color4f).
Konvention:
- Felder, die mit
_beginnen, sollten als privat/intern behandelt werden. - Verwenden Sie immer die bereitgestellten Getter (z. B.
getR(),getG()) für den Zugriff über die öffentliche API.
Color4f color = new Color4f(1f, 0f, 0f);
float r = color._r; // VERMEIDEN: Zugriff auf internes Feld
float r2 = color.getR(); // EMPFOHLEN: Verwenden des öffentlichen GettersDieser Ansatz ermöglicht es Skija, eine stabile API beizubehalten, selbst wenn sich die interne Implementierung dieser Datenklassen in zukünftigen Versionen ändert.