Domanda

sto testando il mio semplice implementazione OpenGL ES (un gioco 2D) su iPhone e Ho notato un elevato utilizzo di rendering durante l'uso del profiler. Questi sono i fatti:

  • Sto visualizzazione un solo precaricati grande consistenza ( 512x512 pixel ) a 60fps e la rendono l'utilizzo è di circa il 40%.
  • Il mio texture viene miscelato con GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, l'unica funzione GL sto usando .
  • Ho cercato di rendere la trama più piccolo e rivestimenti , il che fatto alcuna differenza .
  • sto usando un PNG struttura atlante di 1024x1024 pixel

Trovo molto strano che questo una texture è causando un tale uso della GPU intenso.

È da aspettarsi? Che cosa sto facendo di sbagliato?

Modifica Il mio codice:

// OpenGL setup is identical to OpenGL ES template
// initState is called to setup
// timer is initialized, drawView is called by the timer

- (void) initState
{
    //usual init declarations have been omitted here        
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);     
    glEnableClientState (GL_VERTEX_ARRAY);
    glVertexPointer     (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].x);          
    glEnableClientState (GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer   (2,GL_FLOAT,sizeof(Vertex),&allVertices[0].tx);     
    glEnableClientState (GL_COLOR_ARRAY);
    glColorPointer      (4,GL_UNSIGNED_BYTE,sizeof(Vertex),&allVertices[0].r);    
}    
- (void) drawView
{       
    [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity();

    GLfloat width  = backingWidth /2.f; 
    GLfloat height = backingHeight/2.f; 

    glOrthof(-width, width, -height, height, -1.f, 1.f);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0.f, 0.f, 0.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT);       
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);       
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];      
    [self checkGLError];        
}

Modifica Ho fatto un paio di miglioramenti, ma nessuno riuscito a ridurre l'utilizzo di rendering. Ho diviso la texture in alcune parti del 32x32, cambiato il tipo di coordinate e texture coordinate da GLfloat a GLshort e ha aggiunto vertici in più per i triangoli degenerative.

Gli aggiornamenti sono i seguenti:

initState:     (Vertice e puntatore consistenza sono ora GL_SHORT)

glMatrixMode(GL_TEXTURE);
glScalef(1.f / 1024.f, 1.f / 1024.f, 1.f / 1024.f);
glMatrixMode(GL_MODELVIEW);
glScalef(1.f / 16.f, 1.f/ 16.f, 1.f/ 16.f);

drawView:

glDrawArrays(GL_TRIANGLE_STRIP, 0, 1536); //(16*16 parts * 6 vertices)  
È stato utile?

Soluzione

leggere questo post.

512x512 è probabilmente un po 'più ottimista per l'iPhone da affrontare.

EDIT:

I suppone che si abbia già letto questo, ma se non controllare Mele guida per ottenere prestazioni ottimali OpenGL ES su iPhone.

Altri suggerimenti

Sto scrivendo un app che mostra cinque 512x512 texture su uno sopra l'altro in un ambiente 2D utilizzando GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, e posso ottenere circa 14fps. Avete veramente bisogno di 60fps? Per un gioco, pensavo 24-30 andrebbe bene. Inoltre, utilizzare la compressione delle texture PVR, se possibile. C'è un esempio che fa incluso con l'SDK.

  1. Spero di non aver dimenticato di disattivare GL_BLEND quando non si dispone già bisogno.
  2. È possibile effettuare un tentativo di ottimizzazione della larghezza di banda della memoria - usare 16 formati BPP o PVRTC. IMHO con la cache dimensioni delle texture trama non aiuta affatto.
  3. Non dimenticate che il vostro framebuffer è utilizzato come texture da iPhone UI. Se viene creato come 32 bit RGBA sarà alfa-mescolate ancora una volta. Per ottenere prestazioni ottimali a 16 bit 565 framebuffer sono i migliori (ma la qualità grafica soffre).

Non conosco tutti i dettagli, come la dimensione della cache, ma, suppongo, texture pixel sono già swizzled quando caricato nella memoria video e triangoli sono divisi dal motore di piastrelle di PVR. Pertanto la propria divisione sembra essere ridondante.

E infine. Questo è solo un cellulare GPU a basso consumo, non progettati per schermi enormi e alti fillrates. Alpha-blending è costoso, forse 3-4 volte differenza sul chip PowerVR.

Che cosa è esattamente il problema?
Stai ricevendo i vostri 60 fps, che è liscia come la seta.

A chi importa se il rendering di utilizzo è del 40%?

Il problema potrebbe essere a causa della dimensione della cache tessitura di iPhone. Si può semplicemente scendere a quanta della trama è su ogni singolo triangolo, quad, o tristrip, a seconda di come si sta impostando lo stato.

Prova questo: suddividere tuo quad e ripetere i test. Quindi, se siete 1 quad, renderlo 4. Quindi 16. e così via, e vedere se questo aiuta. La chiave è quello di ridurre il numero effettivo di pixel che ogni riferimenti primitivi.

Quando la cache trama si fa succhiare, quindi l'hardware sarà thrash ricerche di texture dalla memoria principale in qualunque VRAM viene messa da parte per il buffer di texture per ogni pixel . Questo può uccidere prestazioni possente rapido.

O - io sono completamente sbagliato, perché io davvero non so l'hardware iPhone, e so anche che il chip PVR è una strana bestia in confronto a quello che io sono abituato a (PS2, PSP). Ancora è un test facile da provare e io sono curioso di sapere se aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top