2009-12-10 7 views
0

Je cherche à obtenir des augmentations de performance (FPS) supplémentaires sur mon application iPhone. J'utilise déjà des données entrelacées, GL_SHORT et un seul atlas de texture. Voir this question pour les détails de ce que j'ai déjà fait.Est-il logique d'utiliser Vertex Buffer Objects même lorsque vous modifiez la matrice Model View?

Maintenant, je veux regarder en utilisant les VBO pour augmenter les performances. Selon la documentation OpenGL ES d'Apple, c'est une bonne étape à suivre. Cependant, il ne traite pas comment (ou si) les VBO sont affectées par les changements apportés à la matrice Model View. Essentiellement, j'ai le même objet rendu à la scène plusieurs fois, mais chaque fois en utilisant une matrice Model View légèrement différente. La principale différence entre les objets (autres que la position dans la scène) est le mappage de texture. Ils ont tous des coordonnées de texture légèrement différentes.

Les VBO vont-elles aider dans cette situation? Dois-je attribuer une VBO séparée pour chaque objet individuel?

Update 1

Jusqu'à présent, il semble que VBOs un effet négatif sur ma performance. FPS est retombé dans le milieu à 20 ans. Je suis allocationg 70 VBOs: 35 pour les données et 35 pour les indices. Je pourrais faire tomber cela à 35 pour les données, et un tableau d'index global. J'utilise glBufferSubData() pour mettre à jour les coordonnées de texture si nécessaire.

Une autre idée consiste à décomposer toutes les données statiques et à spécifier GL_STATIC_DRAW pour ce VBO.

+0

Votre évaluation des performances avant-après a-t-elle été effectuée sur l'iPhone 3G ou l'iPod touch? Je ne m'attendrais pas à un changement de framerate pour passer aux VBO sur les anciens appareils, mais sur les GPU avec support VBO matériel, les mises à jour partielles d'un objet tampon peuvent causer du travail supplémentaire ou de la synchronisation si le GPU n'a pas fini de lire . L'accent est mis ici sur "partial": si vous remplacez complètement les données (c'est-à-dire avec glBufferData), les pilotes peuvent généralement prendre en charge le double tampon pour vous. – Pivot

+0

L'évaluation a été faite sur l'iPhone 3G. –

+0

Intéressant. Je recommande de comparer les deux versions dans Shark pour voir où la différence de temps est. Si la copie de données est problématique, une autre façon de mettre à jour un objet tampon est de le mapper en mémoire via l'extension 'OES_mapbuffer' et de générer des données directement dans celui-ci. Les mêmes mises en garde pour les mises à jour partielles sur les GPU avec support VBO matériel s'appliquent, puisque vous êtes autorisé à mapper un tampon et en changer seulement une partie, mais vous pouvez signaler que vous ne vous souciez pas de l'ancien contenu en appelant glBufferData avec un null avant de le mapper. – Pivot

Répondre

1

il ne traite pas comment (ou si) VBOs sont affectés par des changements à la vue Modèle matrice

Le modèle vue de la transformation a lieu sur le GPU chaque fois que vous faites un appel de tirage. Changer la vue-modèle ne provoque pas la mutation du VBO.

La principale différence entre les objets (autres que la position dans la scène) est le mappage de texture. Ils ont tous des coordonnées de texture légèrement différentes.

On dirait que vous devriez adaptez la matrice de texture, en plus de la matrice modèle-vue, sorta comme ceci:

glMatrixMode(GL_TEXTURE); 
// glTranslate, glRotate, etc 
glMatrixMode(GL_MODELVIEW); 
// glTranslate, glRotate, etc 

Tirer parti VBOs est généralement une bonne idée, mais ils ont vraiment seulement aider avec iPhones de troisième génération. Ils n'aident pas beaucoup avec les anciens iPhones. Dois-je allouer un VBO séparé pour chaque objet?

Il est généralement plus efficace de réduire le nombre de VBO dans votre application. Plutôt que de passer plusieurs appels à glBindBuffer, vous pouvez fournir des décalages uniques chaque fois que vous appelez glDrawArrays ou glDrawElements.