So versuche ich zu verstehen, wie ich die Hardwarebeschleunigung (wenn verfügbar) in einem benutzerdefinierten View
verwenden kann, das ständig animiert. Dies ist die grundlegende Prämisse meines onDraw()
:Verwenden der Hardwareebene in der benutzerdefinierten Ansicht onDraw
canvas.drawColor(mBackgroundColor);
for (Layer layer : mLayers) {
canvas.save();
canvas.translate(layer.x, layer.y);
//Draw that number of images in a grid, offset by -1
for (int i = -1; i < layer.xCount - 1; i++) {
for (int j = -1; j < layer.yCount - 1; j++) {
canvas.drawBitmap(layer.bitmap, layer.w * i, layer.h * j, null);
}
}
//If the layer's x has moved past its width, reset back to a seamless position
layer.x += ((difference * layer.xSpeed)/1000f);
float xOverlap = layer.x % layer.w;
if (xOverlap > 0) {
layer.x = xOverlap;
}
//If the layer's y has moved past its height, reset back to a seamless position
layer.y += ((difference * layer.ySpeed)/1000f);
float yOverlap = layer.y % layer.h;
if (yOverlap > 0) {
layer.y = yOverlap;
}
canvas.restore();
}
//Redraw the view
ViewCompat.postInvalidateOnAnimation(this);
Ich ermögliche Hardware-Schichten in onAttachedToWindow()
und sie in onDetachedFromWindow()
deaktivieren, aber ich versuche, ob zu verstehen oder nicht, ich bin mit ihm tatsächlich. Im Wesentlichen ändert sich die i/j
Schleife, die drawBitmap()
aufruft, nie; Die einzige Sache, die sich ändert, ist die Canvas
Übersetzung. Wird die Bitmap
automatisch als Textur hinter den Kulissen auf der GPU gespeichert, oder muss ich etwas manuell machen?
tun ich die Frage falsch verstanden haben könnte aber haben Sie 'setLayerType (View.LAYER_TYPE_HARDWARE, null);' für Ihre Ansicht? Die GPU Zwischenspeichert die Bilder nur so lange, wie der Benutzer aktiv scrollt, tut dies jedoch nicht, was einen Kompromiss darstellt, wenn weniger Ressourcen verbraucht werden. – Slartibartfast
@Slartibartfast Ja, ich habe den Layer-Typ auf Hardware eingestellt. Der Benutzer wird niemals tatsächlich scrollen; Die Ansicht scrollt kontinuierlich ihren eigenen Inhalt. Ich mag HW Acceleration vielleicht falsch verstehen, aber ich denke, dass dieses Raster aus Bitmaps, das ich zeichne, in eine Hardware-Ebene gerendert und einfach übersetzt werden kann, anstatt die Bitmaps in jedem Frame neu zu zeichnen. – kcoppock