• Aucun résultat trouvé

Composition et consommation mémoire

CHAPITRE 7 IMPLEMENTATION OPTIMISEE D'UN LECTEUR DE SCENES

7.3 Composition optimisée de scènes SVG

7.3.3 Composition et consommation mémoire

Au niveau de la consommation mémoire, l'algorithme que nous proposons implique, de manière générale, une consommation mémoire plus importante du fait des points suivants :

• du stockage, au niveau du module de composition, de :

o la liste des éléments temporels afin de déterminer les activations/désactivations sans recourir à un parcours complet de l'arbre,

o la liste des éléments média pour mettre à jour les données issues des décodeurs,

o et la liste des cibles d'évènement pour le traitement des évènements indépendamment de la traversée de l'arbre des éléments graphiques.

• du stockage, dans la structure d'élément décrite précédemment, en plus d'une liste des enfants qui appartiennent à un élément, de :

o la liste des animations qui s'appliquent à cet élément,

o un pointeur vers l'élément parent afin de propager les évènements en cas de bouillonnement et de capture,

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

o et de la liste d'écouteurs pour lesquels l'élément est ciblé.

• et de l'application conjointe des mécanismes d'héritage et d'animation.

Les deux premiers points sont simples à comprendre. En revanche, le dernier point mérite plus d'explications.

Comme nous l'avons décrit dans les chapitres précédents, les descriptions de scènes au format SVG s'appuient sur les normes SMIL pour l'animation et CSS pour les notions d'héritage. L'implémentation conjointe de ces deux normes implique notamment que le lecteur de scènes multimédia doit supporter les concepts de :

• valeur de base : déduite de la valeur spécifiée dans le document SVG ou de la valeur par défaut définie par le langage;

• valeur calculée : résultat de l'héritage et de la cascade CSS;

• valeur de présentation : résultat conjoint de l'animation et de l'héritage.

Si ces valeurs doivent effectivement être déterminées ou calculées pour composer une scène SVG, les conserver, toutes les trois en mémoire, à chaque instant, pour chaque attribut et chaque élément de la scène conduit à une surconsommation mémoire trop importante. Dans cette partie, nous proposons une méthode pour présenter une scène SVG faisant bien appel à ces trois notions (valeur de base, valeur calculée, valeur de présentation) tout en conservant une occupation mémoire minimale.

Nous partons des constats suivants :

• Seuls les attributs susceptibles d'être animés doivent conserver une séparation entre valeur de base et valeur d'animation. Plus précisément, seuls les attributs réellement animés dans une scène ont besoin de conserver la valeur de base, et ce, seulement pour le cas où l'animation restaurerait cette valeur à la fin de la période d'activité.

• Seuls les attributs qui représentent des attributs héritables ou propriétés doivent utiliser les notions de valeur spécifiée et valeur calculée.

Sur la base de ces constats, notre proposition repose sur trois principes :

• L'utilisation d'un unique espace mémoire par attribut au niveau de l'élément cible de l'animation. La représentation mémoire décrite dans le Code 7.7 n'est donc pas modifiée.

• L'allocation de l'espace mémoire pour la valeur de base au niveau de l'élément d'animation. Ainsi, la mémoire supplémentaire pour la valeur de base d'un attribut n'est allouée que si une animation cible effectivement cet attribut.

• L'utilisation d'un contexte de propriété CSS, stockée dans la pile d'exécution du module de composition, transmis lors de la traversée de l'arbre de scène, potentiellement modifié au

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

- 166 -

niveau de chaque élément de l'arbre, par l'héritage; et rétabli à la fin du traitement de l'élément. Ainsi, le stockage des valeurs des propriétés calculées CSS n'est que temporaire, et lors de la composition d'un élément de profondeur p dans un arbre composé de N éléments, il n'y aura que p+1 contextes de propriétés sauvegardées et non N.

Cette proposition aboutit donc à l'algorithme simplifié de composition d'un élément SVG donné dans le Code 7.10.

TraverseElement(Element E, ContexteProprietes C) { Si (E == racine et première composition)

Mettre en place dans C les valeurs initiales des propriétés Sauvegarder les propriétés du contexte C

Pour toutes les propriétés P, appliquer l'héritage:

Si E.P != inherit alors pointer la valeur P de l'élément E dans C Pour toutes les animations A dont la cible est E, dans l'ordre

d'activation,

S'il s'agit de la première évaluation, stocker la valeur de base Si les valeurs clés de A utilisent inherit, résoudre à l'aide de C Si A est terminée, écraser la valeur de l'attribut dans E par la valeur de base stockée dans A

Sinon calculer la valeur interpolée et écraser la valeur de l'attribut dans E Pour tous les enfants E' de E, appeler TraverseElement(E', C)

Rétablir les valeurs sauvegardées des propriétés dans C }

Code 7.10 – Algorithme simplifié de composition d'un élément SVG

Nous présentons ici une synthèse des propositions précédentes sous la forme d'un algorithme complet de composition de scènes SVG. L'algorithme final obtenu est décrit dans le Code 7.11. Nous proposons ensuite d'analyser les limitations de cet algorithme.

CycleDeComposition() {

Tant qu'un état stable n'est pas trouvé, Parcourir la liste des éléments temporels, Evaluer les intervalles d'activité,

Transmettre les évènements de début/fin/répétition d'élément. Pour chaque évènement reçu depuis le précédent cycle,

Pour chaque écouteur dans la liste des écouteurs, Si l'évènement correspond,

Activer le gestionnaire d'évènements

Si la propagation continue, faire bouillonner l'évènement Parcourir la liste des éléments média,

Mettre à jour les mémoires de composition issues des décodeurs média TraverseElement(racine);

}

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