2014-03-07 14 views
5

Ich habe dieses "genaue" Problem:Wie kann die Hardwarebeschleunigung in einem SurfaceView deaktiviert werden?

setShadowLayer Android API differences

Ich habe einen Spieler und Feinde, und ich bin mit 14 API kompilieren. Problem ist: Ab 14 API ist die Hardwarebeschleunigung standardmäßig aktiviert und wird nicht bei allen Zeichenmethoden unterstützt (z. B. setShadowLayer(), die ich verwenden möchte). Die Lösung ist also einfach, genau wie die im obigen Thema. Problem ist: Er verwendet eine Ansicht und ich verwende eine SurfaceView für bessere Spieleleistung. Meine Oberflächenansicht wird wie folgt erklärt:

public class Screen extends SurfaceView implements Runnable { // Code } 

Also, ich an den Konstruktor nur hinzugefügt:

public Screen(Context context) { 
    super(context); 
    holder = getHolder(); 
    setLayerType(View.LAYER_TYPE_SOFTWARE, null); // Here. 
} 

Um die Hardwarebeschleunigung auf meinem Surface zu deaktivieren, um meinen Schatten uggly nicht aussehen zu lassen, und die Ergebnis: Das gesamte SurfaceView funktioniert nicht mehr. Ich kann nicht zeigen, was passiert, aber es zeichnet nichts, wenn ich die Hardwarebeschleunigung deaktiviere. Ich bin ziemlich pessimistisch, weil es so aussieht, als ob das SurfaceView selbst von der Hardwarebeschleunigung abhängt, aber das Canvas, in das es gezeichnet wird, kann Schatten nicht richtig funktionieren lassen.

+1

Wenn Sie Software-Rendering verwenden, geben Sie besonders auf modernen Geräten viel Leistung auf. Auf jeden Fall ist es nicht möglich, die Beschleunigung auf der SurfaceView-Oberfläche zu deaktivieren - beachten Sie in http://developer.android.com/guide/topics/graphics/hardware-accel.html, dass die Beschleunigung für ein Fenster nicht deaktiviert werden kann . Haben Sie versucht, die Beschleunigung für die gesamte Aktivität oder App zu deaktivieren? – fadden

+0

Ja, ich habe diesen Teil auch ausprobiert. Es war nutzlos, die Schatten sahen immer noch hager aus. Ich beschloss, die Schattenqualität aufzugeben und darauf zu warten, dass Google das korrigierte. –

+0

Mein früherer Kommentar war falsch. Wie in @ shellls Antwort erwähnt, ist der Canvas, den Sie von SurfaceViews Oberfläche mit lockCanvas() erhalten, nicht hardwarebeschleunigt. – fadden

Antwort

5

Laut this ist die SurfaceView überhaupt nicht HW-beschleunigt, also ist Ihr Problem wahrscheinlich woanders.

+0

Einfach zu erkennen - rufen Sie nach dem Sperren der Oberfläche einfach Canvas # isHardwareAccelerated() 'auf. Ich habe es gerade jetzt auf einem "SurfaceView" versucht und bestätigt, dass es nicht hardwarebeschleunigt war. – fadden

Verwandte Themen