2010-11-24 19 views
4

J'ai vu un exemple de code (notamment dans les projets iOS GL) où le nom de texture GL actuel est mis en cache, et une comparaison effectuée avant d'appeler glBindTexture. L'objectif est d'éviter les appels inutiles à glBindTexture.OpenGL - glBindTexture - optimisation prématurée?

par exemple. Cette approche nécessite que TOUS les appels à glBindTexture soient traités de manière similaire, de préférence à travers un wrapper. Mais l'inclusion de code tiers rend ce problème, tout en étant Encore une autre chose à retenir.

Q. Est-ce une optimisation utile? Ou l'implémentation OpenGL est-elle assez intelligente pour ignorer les appels à glBlindTexture où le nom de la texture n'a pas changé?

Merci.

Répondre

3

Ceci n'est pas appelé dans la spécification autant que j'ai vu. En pratique, il apparaît que de nombreuses implémentations effectuent un certain traitement si vous reliez la même texture que vous verrez une baisse de performance relative si vous ne testez pas la texture actuelle. Je recommande d'utiliser le test si possible juste pour s'assurer que les détails de mise en œuvre n'ont pas d'effet négatif sur votre programme. En règle générale, il est très utile de faire abstraction de l'état de la machine d'état OpenGL pour pouvoir interroger l'état tel que la texture liée ou les matrices actives sans appeler glGet qui sera presque toujours plus lent que votre traitement personnalisé. Cela vous permet également d'interdire un comportement incorrect et rend généralement votre programme plus facile à raisonner.

+0

Merci Ron. Mon penchant naturel est de l'envelopper, mais il y a aussi le problème du code tiers appelant glBindTexture sans utiliser mon état en cache. – SirRatty

+0

La situation idéale serait d'encapsuler votre code dans une bibliothèque qui se connecte à OpenGL et de supposer que les appelants de votre bibliothèque ne saisiront pas délibérément votre contexte et n'appelleront pas les fonctions OpenGL dessus. Hélas, ce n'est pas toujours possible, donc vous devez vivre avec la machine d'état OpenGL et ses faiblesses. –