2015-03-13 1 views
1

J'ai une scène WebGL et un ensemble de paramètres que je peux utiliser pour équilibrer la qualité du rendu et la vitesse. Je voudrais afficher la scène à l'utilisateur aussi haut que je peux faire de la qualité, tant que la fréquence d'images ne tombe pas en dessous de certains seuils à cause de cela. Pour y parvenir, je dois en quelque sorte mesurer la fréquence d'images "actuelle" en réponse aux changements de qualité.Mesure du temps de rendu

Mais la scène est statique tant que l'utilisateur n'interagit pas avec lui (comme une caméra rotative à l'aide de la souris). Je ne veux pas avoir une boucle qui restaure la même scène tout le temps même si rien ne change. Je veux arrêter le rendu si la scène s'arrête de bouger. Ce qui signifie que je ne peux pas simplement faire la moyenne du temps entre les images successives, car je n'arrive pas à faire la différence entre le rendu lent et le déplacement lent de la souris.

J'ai pensé à rendre la scène plusieurs fois au démarrage, et à en juger par la vitesse d'image. Mais la complexité de la scène peut changer au fil du temps, en raison de la partie de la scène visible à partir de la position actuelle de la caméra, ou en raison de l'interaction de l'utilisateur en dehors de la toile. Je dois donc adapter la qualité car la scène change de complexité. Exécuter une boucle d'étalonnage après chaque lancement de souris serait peut-être une option.

J'ai également pensé à utiliser l'appel finish au lieu de l'appel flush pour mesurer avec précision le temps de rendu. Mais pendant que j'attends que GL finisse le rendu, mon application ne répondra essentiellement pas, en particulier ne pourra pas mettre en file d'attente les événements de la souris. Puisque j'imagine que le rendu occuperait idéalement tout le temps entre deux images à la fréquence d'image du seuil cible, ce serait probablement plutôt mauvais. Je pourrais sortir avec l'utilisation finish au lieu de flush seulement dans quelques occasions, comme après une version de souris. Quelle est la meilleure façon d'obtenir la fréquence d'images souhaitée dans une application WebGL ou de mesurer régulièrement l'heure du rendu? Pourquoi ne pouvez-vous pas utiliser le temps de rendu moyen?

+1

FYI: [la finition est juste une couleur en chrome] (http://stackoverflow.com/a/20810521/128511). – gman

+0

@gman: Il va une idée ... merci beaucoup pour cette référence! – MvG

Répondre

1

Pourquoi? Tout simplement parce que vous rendez moins souvent, cela ne signifie pas que vous ne pouvez pas faire la moyenne des temps de rendu. Cela prendra juste un peu plus de temps pour obtenir une moyenne précise.

Une fois que l'utilisateur commence à déplacer sa souris, vous aurez un afflux de données, ce qui devrait rapidement vous donner un taux de rendu moyen de toute façon.

+0

Je peux prendre un horodatage chaque fois que je * commence * un rendu, mais je n'ai pas accès au moment où j'ai terminé. Donc comparer une heure de début et une autre ne me dit rien si le temps de calcul n'est pas le facteur limitant, mais la vitesse de la souris. – MvG

+0

Que voulez-vous dire que vous n'avez pas accès? –

+0

Il n'y a aucun rappel ou similaire pour notifier mon code JavaScript que le rendu est terminé. Le moment que j'appelle 'flush' (ou, selon le commentaire de gman, même' finish') n'est * pas * le rendu de l'heure est terminé, mais seulement le moment où toutes les instructions de rendu ont été transmises. Le rendu prendra généralement encore plus de temps après cela. – MvG