Ich bin gerade dabei, einen ähnlichen Port/eine ähnliche Erweiterung mit meiner eigenen 2D-Engine zu erstellen, und ich hatte diese genaue Frage auch selbst.
Ich nehme an, die Art und Weise Ihren Motor zur Zeit arbeitet, ist die folgende:
- Es verwendet eine
SurfaceView
.
- In der Spielschleife (in einem separaten Thread) ruft es .
- Dann bezieht es sich auf diese
Canvas
mit einigen der drawCircle()
, drawLine()
, drawPath()
usw. Methoden (die Skia-Bibliothek unter der Haube).
- Dann ruft es
unlockCanvasAndPost()
.
- Danach kann es einige Zeit unter Verwendung
Thread.sleep()
warten.
Wenn diese Annahme richtig ist, dann:
Zunächst einmal gibt es viele Gründe warum Ihre Framerate niedrig sein kann (zum Beispiel alle Objekte in der Spielschleife zu schaffen, damit verursacht Müllabfuhr zu kicken). Wenn Sie es gemessen haben (mit System.nanoTime()
), und es ist die Berufung der drawCircle()
Methoden, die zu lange dauert, dann:
Sie können versuchen, Bitmaps zu erstellen:
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
c.drawCircle(...);
können Sie die zeichnen kreise während der Initialisierung in sie ein und zeichnen dann die Bitmaps in der Spielschleife (mit der Methode drawBitmap()
). Das ist schon viel schneller als das Zeichnen von Kreisen.
Wenn dies immer noch zu langsam ist, können Sie OpenGL ES 2.0 ausprobieren. Ich empfehle ein Tutorial, wie das Buch OpenGL ES 2 for Android by Kevin Borthaler - dieses hat schöne Beispiele für 2D und Texturing. Ich würde vorschlagen, von seinem texturierten Beispielquellcode auszugehen und es zu ändern.
Sie werden feststellen (und Sie können schockiert sein), dass Sie mit OpenGL ES keine andere Form als Punkte, Linien und Dreiecke zeichnen und mit Texturen rendern können. Dies bedeutet, dass der einfachste Weg hier ist, 2 Dreiecke für jeden Ihrer Kreise zu verwenden, um ein Rechteck zu bilden, und eine Textur darauf anzuwenden, die von einem Bitmap
stammt, den Sie durch Zeichnen eines Kreises initialisiert haben.
Dies ist der einfachste Weg, um Ihre aktuelle Zeichnung zu "portieren", aber es ist immer noch ziemlich kompliziert. Ich würde empfehlen, zuerst die Bitmap
-basierte Vorgehensweise zu versuchen.
In Bezug auf Game-Engines basieren sie wahrscheinlich auf OpenGL ES selbst (das ist keine Game-Engine, sondern eine Low-Level-GPU-API). Sie können den Prozess vereinfachen, aber Ihre Optionen werden diesem letzten Ansatz ähneln.