Android TextureView / Zeichnung / Malerei-Performance

Ich bin versucht, eine Zeichnung/Malerei-app mit TextureView auf Android. Ich will eine Zeichen-Oberfläche von bis zu 4096x4096 Pixeln, das scheint vernünftig für mein Mindest-Ziel-Gerät (die ich zum testen verwenden), die ist ein Google Nexus 7 2013 hat einen schönen quad-core-CPU und 2GB Speicher.

Einer meiner Anforderungen ist, dass meiner Meinung nach muss innerhalb einer Sicht, die es erlaubt die ein-und ausgezoomt werden und verrissen, die alle benutzerdefinierten code, den ich geschrieben habe (glaube UIScrollView von iOS).

Habe ich versucht, mit einer normalen Ansicht (nicht TextureView) mit OnDraw und Leistung war absolut schrecklich - weniger als 1 frame die Sekunde. Dies passiert auch, wenn ich rief Invalidate(rect) nur mit dem rect, der geändert wurde. Ich habe versucht, das ausschalten der hardware-Beschleunigung für die Ansicht, aber nichts gerendert, ich vermute, weil 4096x4096 ist zu groß für die software.

Habe ich dann versucht, mit TextureView und die performance ist ein wenig besser - ungefähr 5-10 frames pro Sekunde (noch schrecklich, aber besser). Der Benutzer zieht in eine bitmap, die dann später gezogen, in der textur mit einem hintergrund-thread. Ich bin mit Xamarin, sondern hoffentlich auch den code sinnvoll zu Java-Menschen.

private void RunUpdateThread()
{
    try
    {
        TimeSpan sleep = TimeSpan.FromSeconds(1.0f / 60.0f);
        while (true)
        {
            lock (dirtyRect)
            {
                if (dirtyRect.Width() > 0 && dirtyRect.Height() > 0)
                {
                    Canvas c = LockCanvas(dirtyRect);
                    if (c != null)
                    {
                        c.DrawBitmap(bitmap, dirtyRect, dirtyRect, bufferPaint);
                        dirtyRect.Set(0, 0, 0, 0);
                        UnlockCanvasAndPost(c);
                    }
                }
            }
            Thread.Sleep(sleep);
        }
    }
    catch
    {
    }
}

Wenn ich lockCanvas zu übergeben Sie null anstelle von einem rect, Leistung ist Super bei 60 fps, aber der Inhalt der TextureView flimmern und beschädigt werden, was enttäuschend ist. Ich hätte gedacht, es würde einfach sein, mit einem OpenGL frame buffer /render-textur unter, oder zumindest eine option zu wahren Inhalt.

Gibt es andere Optionen kurz, tun alles in raw OpenGL in Android für high-performance-zeichnen und malen auf einer Oberfläche befindet, erhalten in zwischen den draw calls?

  • 4096x4096 ist ziemlich riesig. Ich bin nicht überrascht, Sie haben performance-Probleme. Benötigen Sie unbedingt ein Bild so groß? Sie vielleicht überprüfen Sie heraus die Grafik-Architektur: source.android.com/devices/graphics/architecture.html.
  • Ja, dass ist eine Anforderung. Ich habe gebaut eine ähnliche app auf iOS mithilfe von core graphics, UIScrollView und auf dem iPad Air, die Leistung ist einfach in Ordnung zu 4096x4096. Die 2013 Nexus 7 soll besser als das iPad Air oder zumindest vergleichbar würde ich denken.
  • Was wirklich bringt mich ist, dass die Leistung Super, wenn ich übergeben Sie null, um die lockCanvas nennen, aber dann den textur-Inhalt scheint beschädigt zu bekommen... es ist sehr seltsam, dass lockCanvas(rect) wäre langsamer als ein lockCanvas(null)...
InformationsquelleAutor jjxtra | 2015-06-25
Schreibe einen Kommentar