2010-05-03 15 views
8

Die GLSurfaceView.Renderer-Schnittstelle des Android-SDK gibt mir eine GL-Schnittstelle als Parameter, der den Typ GL10 hat. Diese Schnittstelle wird von einer privaten internen jni-Wrapper-Klasse implementiert. Aber es gibt auch die Klasse GLES10, in der alle GL-Methoden als statische Methoden zur Verfügung stehen. Gibt es einen wichtigen Unterschied zwischen ihnen? Was passiert, wenn ich den gl-Parameter von onDrawFrame ignoriere und stattdessen die statischen Methoden von GLES10 überall verwende?Unterschied zwischen GL10 und GLES10 auf Android

Hier ist ein Beispiel. Statt dies zu tun:

void onDrawFrame(GL10 gl) 
{ 
    drawSomething(gl); 
} 

void drawSomething(GL10 gl) 
{ 
    gl.glLoadIdentity(); 
    ... 
} 

konnte ich dies tun:

void onDrawFrame(GL10 gl) 
{ 
    drawSomething(); 
} 

void drawSomething() 
{ 
    GLES10.glLoadIdentity(); 
    ... 
} 

Der Vorteil ist, dass ich nicht den GL Kontext an alle genannten Methoden übergeben müssen. Aber selbst wenn es funktioniert (Und es funktioniert, ich habe es ausprobiert) Ich frage mich, ob es irgendwelche Nachteile und Gründe gibt, es NICHT so zu machen.

Antwort

6

Ich stocherte im Quellcode herum und versuchte genau diese Frage zu beantworten. Soweit ich das beurteilen kann, gehen beide Möglichkeiten, die OpenGL-Implementierung aufzurufen, an denselben nativen Funktionsaufruf. Mein Verständnis ist jedoch, dass der Java-seitige Zugriff durch statische Methoden schneller ist als durch den virtuellen Methodenversand (siehe http://developer.android.com/guide/practices/design/performance.html#prefer_static).

Der Kompromiss besteht darin, dass Sie beim Zugriff auf Aufrufe, die nur in späteren Versionen von OpenGL verfügbar sind, eine bestimmte Menge an Typprüfungen opfern. Wenn Sie über das Objekt auf den Aufruf zugreifen, müssen Sie zuerst eine Umwandlung durchführen. Diese Umwandlung schlägt fehl, wenn die verwendete GL-Version die Schnittstelle nicht unterstützt. Wenn ich auf den Aufruf über die statische Methode zugreife, denke ich, dass der OpenGL-Fehlerstatus gesetzt wird, was schwieriger zu erkennen sein wird, wenn Sie nicht den Debugging-Modus auf der GLSurfaceView gesetzt haben.

Im Moment greife ich auf alles über die statischen Methoden zu, und ich lasse Debug-Modus in der GLSurfaceView, bis der Code stabil ist, an welchem ​​Punkt ich es ausschalten werde.

  • Kris
Verwandte Themen