• Aucun résultat trouvé

CHAPITRE 7 IMPLEMENTATION OPTIMISEE D'UN LECTEUR DE SCENES

7.3 Composition optimisée de scènes SVG

7.3.2 Rapidité de composition

La composition implique, à chaque cycle de présentation, un parcours de la représentation mémoire de l'arbre de scène et la lecture des attributs des éléments de cet arbre. Pour obtenir une expérience fluide, notamment en cas d’animation et d’interactivité, nous l'avons dit, il faut que les cycles de présentation soient très courts, donc notamment que l’étape de composition soit la plus rapide possible. Nous avons, dans la partie précédente, décrit comme les objets mémoire étaient structurés. Nous nous intéressons ici aux parcours de ces objets et aux traitements associés qui peuvent être également complexes et coûteux en temps.

Pour limiter le temps de la phase de composition, on peut :

• limiter le temps total passé dans la phase de composition, en limitant le nombre de parcours de la scène par seconde mais au détriment de la fluidité;

• ou pour chaque parcours, limiter l’ampleur du parcours, c'est-à-dire la profondeur de la traversée de l’arbre de scène;

• et enfin, limiter les opérations à effectuer au niveau de chaque nœud de l'arbre.

Différents travaux ont été publiés sur la question. Le groupe de travail SVG réfléchit, dans le cadre de la standardisation du profil Full de la version 1.2 du langage SVG, à l'utilisation d'indicateurs des parties statiques de la scène. La version du 27 octobre 2004 [69] mentionne les propriétés cache et

static décrivant respectivement les parties de la scène devant être retracées souvent et celles qui a priori ne seront pas modifiées. D'autres travaux s'orientent vers la détection des parties de la représentation interne qui n’évolue pas d’un cycle à l’autre afin de ne pas les parcourir au cycle suivant. Par exemple, il n’est pas nécessaire de parcourir les parties de la scène non affectées par l’animation ou l’interaction. Cependant, la détection et le suivi de ces zones ‘statiques’ de la scène n’est pas un processus simple. Il faut notamment mettre en place des caches qui peuvent être coûteux en mémoire. De plus, la détection et le suivi des zones non modifiées nécessitent de nombreux tests qui ralentissent l’exécution. Donc, si la scène est très volumineuse, il peut arriver qu’une recomposition complète soit plus efficace qu’un suivi et une recomposition des changements. Un

Descriptions de scènes multimédia : représentations et optimisations

- 160 -

compromis doit être trouvé entre capacité mémoire et vitesse d’exécution. On pourra également lire [01] à ce sujet.

Notre démarche s'inscrit également dans cette optique de limiter l'ampleur des parcours et traitements de l'arbre. Pour cela, nous considérons la composition d'une scène SVG comme le traitement de trois types de primitives :

• les primitives temporelles, c'est-à-dire les animations et les éléments audiovisuels;

• les primitives liées aux interactions utilisateur, c'est-à-dire les écouteurs, les gestionnaires d'évènements et les scripts;

• et enfin, les primitives graphiques et celles relatives au positionnement spatial des primitives graphiques.

Toutes ces primitives nécessitent un traitement spécifique durant la phase de composition. Une approche simple de composition consisterait à parcourir l'arbre de scène et à appliquer ce traitement spécifique à chaque élément au moment de la traversée de cet élément. Il est évident que cette approche n'est pas satisfaisante car si la scène contient beaucoup d'objets graphiques et peu d'animations, les animations ayant besoin d'être parcourues régulièrement pour atteindre une fluidité satisfaisante, les primitives graphiques seraient alors inutilement parcourues.

Cependant, il n'est pas immédiat que, dans toutes les scènes, du fait de mécanismes d'héritage et d'interactivité, les primitives temporelles, d'interactivité et graphiques peuvent être traitées séparément. Nous analysons ici ces trois catégories de primitives afin de montrer qu'il est possible de séparer le traitement entier de l'arbre en plusieurs traitements disjoints de ces trois catégories pour obtenir un algorithme de composition des scènes SVG plus rapide que l'approche simple précédente.

7.3.2.1 Traitement des éléments temporels

Pour les éléments temporels, le traitement effectué dans la phase de composition peut se dérouler comme suit :

• Déterminer si un élément temporel est actif, par la construction des intervalles d'activité à partir des valeurs temporelles de début et de fin d'activation, et générer les évènements correspondants (début, fin, répétition).

• Dans le cas où un intervalle d'activité existe :

o Calculer la fraction de temps écoulé dans la durée simple depuis le début de cette période d'activité et le nombre de répétitions qui ont eu lieu.

o Appliquer un traitement associé. Dans le cas d'un élément d'animation, ce traitement est le calcul de la valeur d'interpolation et la modification de la scène. Dans le cas

Chapitre 7 – Implémentation optimisée d'un lecteur de scènes multimédia animées et interactive

d'un élément vidéo, il consiste à afficher l'image précise correspondant à l'instant de composition.

La première partie est une tâche relativement complexe. L'activité d'un élément peut en effet dépendre d'évènements qui se produisent dans d'autres parties de l'arbre de scène, comme dans l'exemple du Code 7.9.

<A begin="B.begin" …>

<B begin="3; A.end" …>

Code 7.9 – Démarrage conjoint de deux éléments temporels

Dans une approche basique, si on décide de traiter l'activation des éléments temporels en fonction de l'ordre dans lequel ils sont déclarés dans l'arbre de scène, A ne sera pas démarré pendant le même cycle de composition que B. Cette approche pourrait résulter en une désynchronisation des animations A et B, potentiellement non acceptable. Du fait de ces dépendances, il faut donc, à chaque activation, désactivation ou répétition d'un élément temporel, notifier les autres éléments temporels de ce changement d'état puis parcourir à nouveau la liste des éléments temporels, jusqu'à arriver soit à un état stable (plus de notifications), soit à détecter des références cycliques correspondant à un contenu erroné.

De plus, il est intéressant de remarquer que, si tous les éléments de l'arbre de scène partagent la même base de temps, comme c'est le cas dans un document SVG, la résolution des dépendances temporelles entre ces éléments devient donc indépendante de leurs positions dans l'arbre de scène.

On retiendra donc que notre algorithme exploite cette propriété afin de ne pas effectuer inutilement le traitement associé à un élément temporel actif. Ainsi dans notre algorithme, la phase de traitement d'un élément temporel actif (interpolation ou affichage) est effectuée après le traitement d'activation/désactivation/répétition de tous les éléments temporels de la scène. La conséquence, dans le cas d'une scène SVG large et comportant de nombreux éléments mais très peu d'éléments temporels, est que le temps passé pour la résolution des dépendances temporelles est réduit car seul un parcours limité de l'arbre est effectué.

Les paragraphes suivants précisent à quel moment est effectué le traitement spécifique à chaque élément temporel actif :

• D'après le modèle SMIL d'animation, décrit dans le chapitre 2, le résultat d'une animation requiert la résolution des attributs, de la cible de l'animation, dont la valeur est inherit. Cette résolution nécessite de connaître la valeur résolue du même attribut au niveau de l'élément parent de cette cible. Cependant, cette valeur est, à son tour, le résultat des animations à ce niveau de l'arbre, qui découle des animations au niveau parent. Ce comportement implique que la valeur issue d'une animation dépend de la position de la cible

Descriptions de scènes multimédia : représentations et optimisations

- 162 -

de l'animation dans l'arbre de scène. Ainsi, il n'est pas possible de séparer le traitement des animations actives du traitement de l'arbre en entier. En d'autres termes, pour traiter une animation, il faut parcourir l'arbre de la racine jusqu'à la cible de l'animation.

• A l'inverse des éléments d'animation, le traitement associé à un élément média, quand il est actif, consiste à mettre à jour l'image ou les échantillons audio issus du décodeur vidéo ou audio. Ce traitement ne dépend pas de la position de l'élément média dans l'arbre. Nous complétons donc notre algorithme précédent en utilisant une liste des éléments médias, au niveau du module de composition, parcourue à chaque cycle de composition afin de mettre à jour les données issues des décodeurs. L'avantage de cette liste est de permettre la mise à jour des données média indépendamment de la traversée de l'arbre. Ainsi, dans le cas d'une scène statique, composée de nombreux éléments graphiques mais ne comportant qu'un unique élément vidéo, il ne sera pas nécessaire de parcourir l'arbre en entier pour mettre à jour l'image issue du décodeur vidéo.

7.3.2.2 Traitement des éléments liés au modèle évènementiel DOM

Comme nous l'avons décrit dans le chapitre 4, le modèle évènementiel DOM, utilisé dans les scènes SVG, se base sur la déclaration d'écouteurs d'évènements, sur des mécanismes de propagation d'évènements et sur l'utilisation de gestionnaires d'évènements. Or, le comportement des écouteurs et gestionnaires d'évènements (script, animation ou hyperliens) ne dépend pas de la position de cet élément dans l'arbre. Seule la position de l'élément cible de l'évènement a de l'importance. En effet, du fait des propagations ascendantes et descendantes (bouillonnement et capture), on ne peut pas ignorer la position de cet élément car un évènement déclenché à un endroit dans l'arbre peut être traité à un niveau supérieur dans l'arbre.

De manière précise, le traitement d'un évènement implique :

• le parcours, pour chaque élément cible d'évènement, de l'arbre de scène en entier pour déterminer le chemin de la racine jusqu'à cet élément. Ce parcours, nécessaire pour la phase de capture, est effectué une seule fois, pour toute la phase de composition, à la mise en place de l'écouteur d'évènement;

• la détermination de l'élément cible de l'évènement selon la position du pointeur ou l'élément ayant le focus pour les évènements issus du clavier;

• le parcours de ce chemin de la racine jusqu'à l'élément cible, à chaque fois qu'un évènement est émis et pour lequel un écouteur est en place;

• et le parcours en remontant ce chemin de l'élément cible jusqu'à la racine pour les évènements supportant le mode bouillonnement.

Chapitre 7 – Implémentation optimisée d'un lecteur de scènes multimédia animées et interactive

On remarque donc qu'il peut y avoir deux parcours, potentiellement coûteux, à effectuer à chaque fois qu'un évènement est émis. Dans le cas où la méthode de capture n'est pas supportée, c'est le cas dans le profil Tiny de la norme SVG, les deux premiers parcours deviennent inutiles. Il suffit de déterminer les cibles des évènements, de propager les évènements à toutes ces cibles et enfin de remonter l'arbre de scène à partir de ces différentes cibles à chaque fois qu'un évènement est émis. De plus, si les écouteurs limitent la propagation à la phase de ciblage (propagate='stop'), le traitement des évènements sera encore plus rapide car cette dernière remontée ne sera pas effectuée.

Ainsi, le traitement des évènements peut être rendu indépendant de la position des différents éléments dans l'arbre de scène sous les conditions suivantes :

• maintien, au niveau du module de composition, de la liste des éléments cibles d'évènements;

• maintien, au niveau de chaque élément cible, des écouteurs d'évènements associés;

• et maintien, au niveau chaque élément de l'arbre de scène, d'un lien vers l'élément parent. De plus, du fait que les zones sensibles à la souris découlent du positionnement des objets, et du fait du caractère animable de la propriété pointer-events qui détermine si un élément est sensible aux évènements souris, notre algorithme effectue le traitement des évènements après la traversée de l'arbre.

7.3.2.3 Traitement des autres éléments

Nous nous intéressons ici aux traitements associés aux éléments autres que les éléments d'animation et ceux d'interaction. Ces éléments sont les éléments de la description de la scène qui ont pour but le positionnement spatial et l'affichage des éléments visuels. La phase de composition pour ces éléments consiste à déterminer, pour un temps de scène donné, les paramètres d'affichage des éléments visibles (couleur, taille, position, facteur d'échelle, épaisseur de trait, …) et à construire la liste d'affichage qui permettra ensuite à la phase de rendu de construire et d'afficher l'image finale.

Bien que seuls les éléments visibles situés dans les feuilles de l'arbre de scène (dans lequel les éléments d'animation et les éléments d'interactivité ont été retirés) produisent un résultat visuel, il est néanmoins indispensable de parcourir l'arbre de scène en entier pour produire la liste d'affichage. En effet, d'une part les paramètres de positionnement (rotation, translation) sont déduits de la composition matricielle des transformations successives rencontrées entre la racine de l'arbre et l'élément visuel; et d'autre part, les paramètres d'affichage (épaisseurs de traits, couleurs …) sont eux déduits de l'animation et de l'héritage des propriétés de style entre la racine de l'arbre et l'élément concerné. De ce fait, il est impossible de dissocier le traitement des éléments graphiques de celui de la traversée de l'arbre. Nous verrons, dans la section 7.4, que nous nous attacherons donc à minimiser le traitement des éléments graphiques.

Descriptions de scènes multimédia : représentations et optimisations

- 164 -

7.3.2.4 Synthèse

En résumé, nous proposons un algorithme de composition de scènes SVG qui se base sur la réduction de l'ampleur des parcours de l'arbre de scène pour le traitement des éléments temporels et des éléments liés au modèle évènementiel. A chaque étape de composition, il se découpe en quatre phases :

• La première phase consiste à déclencher et à traiter les évènements d'activation, désactivation, répétition des éléments temporels, en effectuant uniquement le parcours de ces derniers et non pas le parcours complet de l'arbre.

• La seconde phase consiste à mettre à jour les éléments audiovisuels activés à la phase précédente.

• La troisième phase consiste à traverser un arbre de scène réduit, ne comportant que les éléments de positionnement spatial, les éléments graphiques et les éléments audiovisuels, pour appliquer de manière conjointe les animations et l'héritage et construire la liste d'affichage.

• Enfin, la dernière phase consiste à traiter les évènements utilisateurs et les évènements systèmes en parcourant uniquement la liste des éléments cibles pour déterminer si un évènement doit être utilisé et en exécutant le gestionnaire d'évènement associé le cas échéant. A nouveau, grâce au maintien de la liste des éléments cibles au niveau du module de composition, cette étape ne nécessite pas le parcours complet de l'arbre et peut être très efficace si seule la phase de ciblage est utilisée.