Android nur Spiel in OpenGL: Leistung in C ++ (NDK) vs Java (Dalvik) [geschlossen]

8

Ich weiß, dass ähnliche Fragen schon früher gestellt wurden, aber ...

Wir wollen ein Indie-Spiel entwickeln (zumindest hoffen), aber trotzdem ein Spiel mit hochqualitativen Grafiken mit hunderten, wenn nicht tausenden von bewegten Objekten auf dem Bildschirm, so dass wir eine sehr hohe Anzahl an Polygonen und Anforderungen für Hittests und vielleicht auch KI erwarten .

Ich kenne das grundlegende Problem mit Java ist Garbage Collection. Aber es ist kein Problem, wir planen, den gesamten benötigten Speicher vor dem Spiel zu reservieren und für transiente Objekte werden wir Pooling verwenden (in der Spielschleife wird das neue Schlüsselwort nie geschrieben). Und wir planen, alle hier erwähnten Techniken zu nutzen ( Google I / O 2009 - Echtzeitspiele für Android schreiben ) ).

Der Hauptgrund, warum wir auf Java bestehen, ist die Bereitstellung, und wir wollen nur für Android entwickeln (zumindest jetzt) ​​

So kann die gleiche Leistung in einem Spiel mit Java erreicht werden (selbst wenn das hässlichen / nicht idiomatischen Code bedeutet), als ob wir es mit c ++ gemacht hätten. Wenn nicht, was sind die Besonderheiten? Oder vielleicht, wenn es möglich ist, aber sehr - sehr unpraktisch, was sind diese Gründe?

(Ich habe zum Beispiel etwas über Java gelesen. Puffer und OpenGL sind nicht die beste Paarung, erinnern sich aber nicht an die Einzelheiten - vielleicht ein Experte)

    
naeron84 14.11.2013, 13:33
quelle

1 Antwort

10

Sie zahlen einen festen Aufpreis pro Aufruf, um OpenGL aus dem Java-Quellcode zu verwenden. Android bietet Java-Sprache Wrapper um die Anrufe. Wenn Sie beispielsweise glDrawArrays aufrufen, rufen Sie eine native Methode auf, die in GLES20.java , die in android_opengl_GLES20.cpp . Sie können anhand des Codes sehen, dass der Anruf nur mit minimalem Overhead weitergeleitet wird.

Wenn Sie in der Datei herumschnüffeln, können Sie andere Anrufe sehen, die zusätzliche Prüfungen durchführen und daher etwas teurer sind.

Die Quintessenz, soweit unvermeidbare Kosten gehen, ist, dass der Preis für viele GLES-Aufrufe bei Java-Quellen höher ist als bei nativen Quellen. (Sehen Sie sich die Leistung von Android Breakout mit systrace Ich bemerkte, dass der Treiber viel CPU-Overhead aufwies, da ich viele redundante Statusaktualisierungen durchführte. Die Kosten dafür hätten sich aus nativem Code ergeben war niedriger, aber die Kosten für Null Arbeit ist weniger als die Kosten für weniger Arbeit.)

Die tiefere Frage hat damit zu tun, ob Sie Ihren Code so unterschiedlich schreiben müssen (z. B. um Zuteilungen zu vermeiden), dass Sie einfach nicht das gleiche Leistungsniveau erreichen können. Sie müssen mit direkten ByteBuffer -Objekten anstatt mit einfachen Arrays arbeiten, was ein bisschen mehr Management auf Ihrer Seite erfordert. Aber abgesehen von den aktuellen Geschwindigkeitsunterschieden zwischen rechenintensivem nativem und Java-Code auf Android ist mir nichts bekannt, was eine gute Performance von strikt Java-Implementierungen grundlegend verhindert.

    
fadden 14.11.2013, 19:31
quelle