2016-05-05 9 views
0

Ich aktualisiere ständig ein SurfaceView in einem dedizierten Thread mit einer engen Schleife, die mit lockCanvas beginnt und mit unlockCanvasAndPost endet.SurfaceView Bildwiederholfrequenz-Implementierung

Egal wie einfach die Zeichnung ist, ich bekomme nicht mehr als 60FPS, was sinnvoll ist, da das die Bildwiederholfrequenz für das Display ist.

Meine Frage ist: Wie wird diese maximale Rate erzwungen?

Ich würde erwarten, dass die lockCanvas Blockierung Methode sein (das heißt das Verfahren, das die entsprechende Verzögerung einfügt), aber Profilierung scheint zu zeigen, dass beide lockCanvas und unlockCanvasAndPost zu der Verzögerung beitragen, die die Geschwindigkeit begrenzt.

Antwort

1

lockCanvas() erwirbt einen Puffer zum Eintragen, unlockCanvas() übergibt den Puffer an den Systemkompositor. Wenn keine freien Puffer vorhanden sind, wird blockiert, bis eine verfügbar ist. unlockCanvas() könnte blockieren, wenn SurfaceFlinger die IPC-Nachricht nicht sofort verarbeitet, aber im Allgemeinen sollte die Entsperrung schnell zurückkehren.

Wenn Sie wissen möchten, wie das Grafiksystem funktioniert, lesen Sie den Artikel graphics architecture doc. Von besonderem Interesse ist der Abschnitt game loops; Was Sie tun, ist "Queue Stuffing", was leicht zu tun ist, aber etwas schlechtere Latenzeigenschaften als ein Choreographen-basierter Ansatz hat.