2017-12-22 6 views
0

Ich mache ein 2D-Android-Spiel und derzeit mache ich die Zeichnung auf einem Canvas.Portierung Canvas zu OpenGL auf Android

Wenn ich versuche, viele Kreisstriche zu zeichnen, fällt die Framerate sehr stark ab. Also ich dachte, ich sollte versuchen, die Zeichnung mit etwas mächtiger zu machen.

Was ist der einfachste Weg, um ein leinwandbasiertes Spiel zum Beispiel auf OpenGL ES oder eine andere Spielengine zu portieren? Mit welcher Game Engine soll ich mein Spiel portieren?

Antwort

1

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:

  1. Es verwendet eine SurfaceView.
  2. In der Spielschleife (in einem separaten Thread) ruft es .
  3. Dann bezieht es sich auf diese Canvas mit einigen der drawCircle(), drawLine(), drawPath() usw. Methoden (die Skia-Bibliothek unter der Haube).
  4. Dann ruft es unlockCanvasAndPost().
  5. 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.