2009-08-17 5 views
25

J'ai essayé d'effectuer quelques optimisations de performance OpenGL ES dans le but d'augmenter le nombre de triangles par seconde que je suis capable de rendre dans mon application iPhone, mais j'ai atteint un mur de briques. J'ai essayé de convertir mes types de données OpenGL ES de fixe en virgule flottante (par Apple's recommendation), d'entrelacer mes objets de tampon de sommets, et de minimiser les changements d'état de dessin, mais aucun de ces changements n'a changé la vitesse de rendu. Quoi qu'il en soit, je n'arrive pas à pousser mon application au-dessus de 320 000 triangles/s sur un iPhone 3G fonctionnant sous le système d'exploitation 3.0. Selon this benchmark, je devrais être capable de frapper 687 000 triangles/s sur ce matériel avec l'ombrage lisse que j'utilise. Dans mes tests, lorsque je lance l'outil de performance OpenGL ES dans Instruments par rapport au périphérique en cours d'exécution, la statistique "Tiler Utilization" atteint presque 100% lors du rendu de mon benchmark, mais "Renderer Utilization" est seulement arriver à environ 30%. Cela peut fournir un indice quant à ce que le goulot d'étranglement est dans le processus d'affichage, mais je ne sais pas ce que ces valeurs signifient, et je n'ai trouvé aucune documentation sur eux. Quelqu'un at-il une bonne description de ce que cela et les autres statistiques de l'instrument iPhone OpenGL ES représentent? Je sais que le PowerVR MBX Lite dans l'iPhone 3G est un tile-based deferred renderer, mais je ne suis pas sûr de la différence entre le Renderer et Tiler dans cette architecture.Que signifie la statistique Utilisation du carreleur dans l'instrument iPhone OpenGL ES?

Si cela aide de quelque façon que ce soit, le code source (sous licence BSD) de cette application is available si vous voulez le télécharger et le tester vous-même. Dans la configuration actuelle, il commence un petit benchmark chaque fois que vous chargez une nouvelle structure moléculaire et affiche les triangles/s sur la console.

+0

Quelle est la taille de vos triangles? Je pense que l'une de ces statistiques est plus sur le nombre de pixels, et l'autre sur le nombre de triangles. les nombres relatifs d'utilisation changent-ils si vous zoomez de manière à ce que l'écran soit moins rempli? –

+1

Il varie, selon le modèle que je charge, mais ils ont tendance à être assez petit. Peu importe le niveau de zoom sur le modèle, les chiffres semblent rester les mêmes. En outre, j'ai essayé de réduire la taille de la vue OpenGL à la moitié de ce qu'elle est maintenant, sans aucun effet, ce qui semblait exclure une limitation du taux de remplissage. –

Répondre

25

Les pourcentages Utilisation du carrousel et Utilisation du rendu mesurent le cycle de service du matériel de traitement des sommets et des fragments, respectivement. Sur la MBX, l'utilisation des carreleurs évolue généralement avec la quantité de données de sommet envoyées au GPU (en termes de nombre de sommets et de taille des attributs envoyés par vertex), et l'utilisation des fragments augmente généralement avec le suréchantillonnage et la texture .

Dans votre cas, la meilleure solution serait de réduire la taille de chaque sommet que vous envoyez. Pour commencer, j'essaierais de trier vos atomes et vos liens par couleur, et d'envoyer chacun de ces bins en utilisant une couleur constante au lieu d'un tableau. Je suggère également d'examiner si les shorts conviennent à vos positions et à vos normales, compte tenu de l'échelle appropriée. Il se peut que vous deviez également bin par position dans ce cas, si les shorts mis à l'échelle pour fournir une précision suffisante ne couvrent pas la plage dont vous avez besoin. Ces types de techniques peuvent nécessiter des appels de dessin supplémentaires, mais je soupçonne que l'amélioration du débit de vertex l'emportera sur la charge supplémentaire de l'UC d'appel par appel. Notez qu'il est généralement avantageux (sur MBX et ailleurs) de s'assurer que chaque attribut de vertex commence sur une frontière de 32 bits, ce qui implique que vous devez ajuster vos positions et vos normales à 4 composants si vous les mettez en court-circuit. Les particularités de la plate-forme MBX font que vous voulez réellement inclure le composant W de la position dans l'appel à glVertexPointer dans ce cas. Vous pouvez également envisager d'utiliser d'autres méthodes d'éclairage comme DOT3 pour vos données polygonales, en particulier les sphères, mais cela nécessite un soin particulier pour vous assurer que vous ne ferez pas de fragment de rendu ou que vous n'enverrez pas par inadvertance plus de données de vertex. avant.

+2

Cela correspond à mon expérience depuis que j'ai posé la question pour la première fois. J'ai réduit mes vertex et mes données normales en courts-circuits, en complétant le composant supplémentaire pour atteindre la limite de 32 bits, et cela a amélioré les performances de rendu de 30%. L'élimination des backfaces et l'ajustement du test de profondeur ont ajouté 10% de plus. Je vais jeter un oeil à la couleur-binning pour voir quel effet cela a. Merci pour la réponse détaillée. –

+1

J'ai une question stupide ..... qu'est-ce que le verbe "bin" veut dire utilisé dans toute la réponse de Pivot ici? –

+3

@Andrew Garrison: Dans ce cas, cela signifie regrouper des éléments d'un certain type. Quand il dit «classer vos atomes et vos liens par couleur», il veut dire que je devrais regrouper les sommets pour les éléments qui partagent tous la même couleur, puis soumettre seulement ces éléments une fois pour cette couleur. Cela évite d'avoir à spécifier une couleur pour chaque sommet, ce qui réduit la taille de la géométrie envoyée. –

4

Bonne réponse, @Pivot! Pour référence, this Apple doc définit ces termes:

  • Renderer Utilisation%. Le pourcentage de temps passé par le GPU à effectuer le traitement du fragment.
  • Utilisation du carreleur%. Le pourcentage de temps passé par le GPU à exécuter le traitement de vertex et le pavage.
  • Utilisation du périphérique%. Le pourcentage de temps passé par le GPU à effectuer des travaux de pavage ou de rendu.
Questions connexes