Note de curs, programare grafică, 25 noiembrie 2013
În acest curs am discutat despre câteva concepte fundamentale care trebuie cunosute înainte de a putea lucra cu OpenGL ES 2.0.
Arhitectura client-server
OpenGL ES 2.0 este bazat pe o arhitectură client-server în care:
- clientul este o aplicație grafică, care rulează pe CPU și folosește memoria RAM;
- serverul este un driver al plăcii video, care rulează, preponderent, pe GPU și folosește memoria plăcii video.
Memoria
Memoria mașinii virtuale Dalvik
Mașina virtuală Dalvik rulează toate aplicațiile Android scrise în Java. Aceasta gestionează memoria în care sunt stocate (aproape) toate tipurile de date din Java.
Memoria nativă
Memoria nativă este memoria dispozitivului și aceasta este folosită de Dalvik. Dalvik (de obicei) nu dă acces direct la memori nativă. Singurul mod de accesa memoria nativă este prin intermediul pachetului java.nio.
Pachetul java.nio ne dă posibilitatea să referim regiuni contigue de memorie nativă (pointeri). Putem realiza transferuri de date între memoria nativă și memoria mașinii virtuale, dar nu putem efetua operații aritmetice sau orice altfel de operații mai complexe.
Memoria plăcii video
Memoria plăcii video nu poate fi accesată direct din cod Java, dar putem realiza transferuri de date între memoria nativă și memoria plăcii video prin intermediul OpenGL ES 2.0.
Transferul de date
Nu se pot transfera date direct din memoria mașinii virtuale Dalvik în memoria plăcii grafice (sau invers), ci indirect, prin intermediul memoriei native.
Buffering
Single buffering
Single buffering înseamnă memorarea unui singur cadru în orice moment de timp. Acest cadru este periodic șters, redesenat și afișat utilizatorului pe ecran. Single buffering este folosit foarte rar pe sisteme Android.
Double buffering
Double buffering înseamnă memorarea a două cadre în orice moment de timp. În timp ce un cadru este șters și redesemnat, conținutul celuilalt este afișat utilizatorului pe ecran. Periodic, cele două cadre sunt interschimbate. Double buffering este foarte frecvent utilizat pe sisteme Android.
Erori în OpenGL ES 2.0
Atunci când metodele OpenGL ES 2.0 sunt apelate greșit, apare o eroare. Atunci când clientul rulează o comandă care generează o eroare, această instrucțiune este ignorată, iar tipul erorii este memorat. Utilizatorul are posibilitatea să ruleze o comandă care îi întoarce tipul de eroare înregistrată.
Implementările OOGLES20 API
Pentru a putea utiliza OOGLES20 API, mai întâi programatorul trebuie să specifice o implementare pe care s-o folosească:
OpenGLES20 implementation; OOGLES20.setBackEnd(implementation);
Implementări disponibile
Implementarea nativă Android: android.opengl.GLES20
OpenGLES20 implementation = new NativeGLES20(); OOGLES20.setBackEnd(implementation);
Implementarea libGDX, de la BadLogicGames: com.badlogic.gdx.backends.android.AndroidGL20
OpenGLES20 implementation = new LibGDXGLES20(); OOGLES20.setBackEnd(implementation);
Decoratori pentru implementări
Înregistrează toate comenzile într-un fișier sau în log:
implementation = new AndroidGLES20Logger(implementation);
Semnalează toate erorile apărute prin generarea de excepții:
implementation = new AndroidGLES20ErrorSignaling(implementation);
Interogări despre implementarea de OpenGL ES
Putem rula comenzi care să ne întoarcă:
- numele companiei care a realizat implementarea:
OOGLES20.implementation.getVendor(); GLES20.glGetString(GLES20.GL_VENDOR);
- numele (codul) plăcii video:
OOGLES20.implementation.getRenderer(); GLES20.glGetString(GLES20.GL_RENDERER);
- versiunea de OpenGL ES:
OOGLES20.implementation.getVersion(); GLES20.glGetString(GLES20.GL_VERSION);
- versiunea de OpenGL ES Shading Language:
OOGLES20.implementation.getShadingLanguageVersion(); GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION);