2010-12-15 5 views
16

Dans this document (documentation iOS d'Apple sur OpenGL), Apple recommande d'utiliser le triangle des bandes plus (indexés) triangles dans OpenGL ES sur iOS:GL_TRIANGLES ou GL_TRIANGLE_STRIP sur iOS?

Pour des performances optimales, vos modèles doivent être soumis en une seule bande triangulaire non indexée à l'aide glDrawArrays avec le moins de sommets dupliqués possible.

Cependant, Imagination Technologies (les créateurs de la puce graphique qui est utilisé dans les appareils iOS) suggèrent l'inverse dans this document (POWERVR Recommandations de développement d'applications 3D). Ils écrivent spécifiquement à la page 11:

L'utilisation d'une liste de triangles indexés peut être beaucoup plus efficace que l'utilisation de bandes.

Ma question: qui a raison? Ou ai-je mal compris l'un ou l'autre document?

Répondre

12

TBH Je crois que PowerVR. Le PowerVR prend en charge un cache de post-transformation. Cette antémémoire signifie que les indices qui sont répétés relativement près de l'endroit où ils ont été appelés la dernière fois peuvent éviter totalement une re-transformation (elle extrait simplement la valeur déjà transformée du cache). Donc, dans le cas d'une bande qui vaut 0, 1, 2, 3, 4, 5, 6, 7, elle n'offre aucun bonus mais, en réalité, les bandes ne sont généralement pas aussi simples. Il y aura une réutilisation d'index de vertex là dedans. Cette réutilisation peut éviter complètement la transformation. Si les bandes sont optimisées pour en tenir compte (voir le NVTriStrip library!), Vous pouvez obtenir des performances MASSIVEMENT améliorées car de nombreuses transformations ne seront tout simplement pas effectuées. En outre, un bonus supplémentaire est que les listes de triangles ne sont plus une entrave aux performances car 2 des sommets que vous êtes sur le point de transformer ARE dans le cache et donc aucun succès de performance (autre que le téléchargement de 6 octets par triangle plutôt que 2 (ish) qui n'est pas beaucoup dans le grand schéma des choses). De plus, parce que vous n'avez pas besoin d'effectuer des "redémarrages" de bande (un redémarrage est effectué en répétant le dernier index du dernier triangle et le premier index du triangle suivant, c'est-à-dire 0,1,2,2,3,3, 4,5,6) certaines mailles complexes peuvent être plus rapides qu'avec des bandes. Ajoutez à cela le fait que dans une bande non indexée chaque sommet répété doit être envoyé dans son intégralité, la quantité de données qui doit être envoyée peut être beaucoup plus grande que la quantité qui doit être envoyée dans une liste indexée (comme chaque sommet est seulement envoyé à travers une fois et la répétition est faite dans les indices beaucoup plus compacts).

Bien sûr, la MBX (iPhone 3G) ne prend pas en charge les caches post-transformation, ce qui est très probable d'où provient le conseil de Apple. Le SGX (iPhone 3GS et supérieur) fait cependant tout dépend du matériel que vous souhaitez cibler. Si vous allez bien 3GS et plus, utilisez l'indexation, sinon ne le faites pas. Bien sûr, le fait de prendre en charge les deux méthodes dès la sortie de la boîte donnera les meilleures performances sur les deux plates-formes.

Bien sûr, la meilleure façon de voir est d'essayer les deux méthodes (cela ne prend pas beaucoup de temps) et de voir ce qui fonctionne le mieux sur le matériel !!

+0

Excellent conseil Goz. Je pense qu'il est étrange qu'Apple passe par tout le travail "traduisant" les recommandations PowerVR dans leur propre document "Best practices", mais tourne ces suggestions d'optimisation autour (strips vs. tris indexés). Ce pourrait être pour les raisons que vous dites: matériel pré 3GS, mais Apple est généralement très à jour dans ses conseils et se concentre principalement sur le matériel plus récent. Tester cela ne serait en effet pas si difficile, mais j'aurais aimé connaître les "recommandations" d'ImgTec auparavant car cela m'aurait économisé BEAUCOUP de temps (j'ai créé des bandes très complexes, sans nécessité ...). – zmippie

+0

@zmippie: Je sais ce que vous voulez dire par rapport à l'ennui, c'est pourquoi les bibliothèques comme NVTriStrip sont très pratiques.Par expérience, cependant, je chercherais toujours plus d'une preuve d'optimisation. En outre, il est toujours préférable de le vérifier par vous-même (à moins qu'il ne s'agisse d'une décision de conception fondamentale;)). – Goz

+1

@Goz: Vous avez, encore une fois, très raison. Je vois actuellement des preuves que dans mon cas particulier, même avec (je pense tout à fait optimal) le tri des vertex et le tri des index, je ne peux pas surclasser GL_TRIANGLE_STRIPS avec des GL_TRIANGLES indexés. Je vais voir si GL_TRIANGE_STRIPS indexé peut me faire du bien, et je reviens à GL_TRIANGLE_STRIPS régulièrement ... Merci encore! – zmippie