Ich zeichne einen ziemlich großen Pfad aus meiner Sicht und ich stoße auf einige Leistungsprobleme. Der Pfad ist derzeit 32.000 Punkte lang, aber meine Anwendung sollte auf mindestens 128.000 Punkte skalieren. Ich kann nicht wirklich etwas über die Größe des Pfades tun, da die Datasets gerade so groß sind und ich den ganzen Weg sofort anzeigen und Zoom herein zulassen kann.Zeichenpfade und Hardwarebeschleunigung
Ich benutze ein Nexus 10 Android 4.2 ausführen, bei dem die Hardwarebeschleunigung standardmäßig für Anwendungen aktiviert ist, die sie nicht explizit deaktivieren.
Der Pfad mit dem folgenden Code erzeugt (weggelassen ich einige Setup und andere irrelevante Teile):
dataPath.moveTo(0, offset - (float) data[leftLimit]/ scalingFactor);
for (int i = leftLimit; i < rightLimit; ++i) {
x = (i - leftLimit) * dx;
y = offset - (float) data[i]/ scalingFactor;
dataPath.lineTo(x, y);
}
Und dann in der Methode onDraw()
gezogen:
canvas.drawColor(Color.WHITE);
canvas.drawPath(dataPath, linePaint);
ich die Zeit gemessen, nimmt, um meine Sicht mit adb shell dumpsys gfxinfo
mit und ohne Hardwarebeschleunigung zu zeichnen, und zu meiner Überraschung ist die Hardwarebeschleunigung viel langsamer:
mit Hardware-Beschleunigung:
ohne Hardware-Beschleunigung:
Die Hardware beschleunigte Version dauert etwa 200-300 ms pro Rahmen, die meisten in der Verfahrensstufe verbracht. Die nicht-beschleunigte Version dauert etwa 50 ms, mit 2/3 in der Ziehstufe und 1/3 in der Prozessstufe.
Offensichtlich ist sogar meine schnellere Version ohne Hardwarebeschleunigung immer noch zu langsam, um 60 fps zu erreichen, oder sogar kaum nutzbar, wenn ich zu größeren Datensätzen übergehe.
Die Idee, den Pfad zu einer Bitmap zu rendern und diese Bitmap dann nur an den Bildschirm anzupassen, ist in meinem Fall ebenfalls problematisch. Ich muss das Zoomen sehr weit auf den Pfad unterstützen, und um das Zoomen ohne Verschlechterung der Pfadqualität zu ermöglichen, müsste ich übergroße Bitmaps des Pfades rendern (und würde wahrscheinlich in Speichergrenzen und die Texturgrößenlimits laufen). Und wenn ich weit heranzoome, müsste ich entweder neuere Bilder von nur Teilen des Pfads erstellen oder einfach nur den Pfad direkt rendern, was wahrscheinlich zu Verzögerungen führen würde, die größer als die Framerate sind, wenn die Leistung immer noch der richtigen entspricht jetzt.
Was ich frage mich, ist jetzt
- Ist das Zeichnen von Linien/Pfade etwas nur die GPU ist schlecht und man sollte versuchen, nicht zu Hardware beschleunigen, oder bin ich wahrscheinlich etwas falsch zu machen, die die schlechte verursacht Performance?
- Gibt es etwas, was ich tun kann, um so große Pfade mit akzeptabler Leistung zu zeichnen?
Wie passt OpenGL genau dazu? –
Die Hardwarebeschleunigung verwendet OpenGL, soweit ich es verstehe. Aber ich war mir nicht sicher, welches Tag dort verwendet werden sollte. –
Wie zeichnest du das? Wenn Sie der GPU einen Punkt auf einmal ausgeben, werden Sie wahrscheinlich eine schlechtere Leistung erzielen, aber wenn Sie alles auf einmal parsen, sollten Sie zumindest theoretisch einen Anstieg sehen. – Automatico