Forums Développement Multimédia

Aller au contenu

flixel et enterframe

CODE

7 réponses à ce sujet

#1 lazrie

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 242 messages

Posté 13 July 2011 - 13:10 PM

Bonjour :),

Je suis en train de regarder flixel et un bou de code m'interroge dans la "fonction enterframe" de la classe Flxgame:


                 /**
                 * Handles the onEnterFrame call and figures out how many updates and draw calls to do.
                 *
                 * @param       FlashEvent      Flash event.
                 */

                protected function onEnterFrame(FlashEvent:Event=null):void
                {                      
                        var mark:uint = getTimer();
                        var elapsedMS:uint = mark-_total;
                        _total = mark;
                        updateSoundTray(elapsedMS);
                        if(!_lostFocus)
                        {
                                if((_debugger != null) && _debugger.vcr.paused)
                                {
                                        if(_debugger.vcr.stepRequested)
                                        {
                                                _debugger.vcr.stepRequested = false;
                                                step();
                                        }
                                }
                                else
                                {
                                        _accumulator += elapsedMS;
                                        if(_accumulator > _maxAccumulation)
                                                _accumulator = _maxAccumulation;
                                        while(_accumulator >= _step)
                                        {
                                                step();
                                                _accumulator = _accumulator - _step;
                                        }
                                }
                               
                                FlxBasic._VISIBLECOUNT = 0;
                                draw();
                               
                                if(_debuggerUp)
                                {
                                        _debugger.perf.flash(elapsedMS);
                                        _debugger.perf.visibleObjects(FlxBasic._VISIBLECOUNT);
                                        _debugger.perf.update();
                                        _debugger.watch.update();
                                }
                        }
                }
 

c'est cette partie :

                                        _accumulator += elapsedMS;
                                        if(_accumulator > _maxAccumulation)
                                                _accumulator = _maxAccumulation;
                                        while(_accumulator >= _step)
                                        {
                                                step();
                                                _accumulator = _accumulator - _step;
                                        }
 

la fonction step() se chargeant de faire l'update de FlxGame

la propriété "accumulator" est le total de milliseconde passé depuis la dernière update et "_step" est indiqué comme : Milliseconds of time per step of the game loop. FlashEvent.g. 60 fps = 16ms.

Pourquoi répète t'on la boucle un certain nombre de fois par frame. Est ce que ça a voir avec l'optimisation de l'affichage?

#2 lazrie

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 242 messages

Posté 14 July 2011 - 07:09 AM

En fait ce qui m'intéresse vraiment, ce n'est pas temps le code, que de savoir comment faire un moteur de rendu ciblé sur les BitmapDatas efficacement optimisé.

#3 lazrie

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 242 messages

Posté 14 July 2011 - 09:27 AM

j'ai trouvé la réponse si ça peut intéressé :
revolugame.com

#4 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 18 July 2011 - 14:59 PM

Le principe est de mettre en place une boucle de jeu qui soit indépendante du framerate.

Donc on pose un intervalle de temps insécable _step et à chaque enterFrame on fait progresser le comportement du jeu selon le temps écoulé depuis le dernier enterFrame.

Schématiquement:

enterFrame:
|-------------->|---------->|------------> ...
step:
|->|->|->|->|->|->|->|->|->|->|->|->|-> ...

Pour être efficace dans cette approche, le temps _step doit être assez petit pour pouvoir s'exécuter au moins une fois par enterFrame, mais pas trop, sinon ça donne lieu à trop de répétition et risque de faire ramer. Entre 10ms et 20ms pour _step me semble un bon compromis.

Par contre ne jamais mettre à jour l'affichage pendant l'itération. Ca bouffe. L'itération ne doit mettre à jour que les comportements et données du jeu ; rien de graphique. La mise à jour de l'affichage se fait en fin d'enterFrame, après l'itération.

Modifié par Logic, 18 July 2011 - 15:01 PM.


#5 lazrie

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 242 messages

Posté 21 July 2011 - 12:16 PM

Merci:),

C'est vrai que c'était une question que je me posait, a savoir l'utilité d'afficher autant de fois le graphisme par frame.

Une question m’intrigue : quel problême vont arriver si l'on veut stocker beaucoup de bitmapdata en mémoire, pour les utiliser plus tard avec copyPixels ; c'est a dire sans forcement les associé a un bitmap, mais juste les copier dans un autre bitmapData?

bonne journée,

#6 frangois

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 224 messages

Posté 21 July 2011 - 12:52 PM

aucun problème pour stocker des bitmapData sans les associer à un bitmap, c'est comme ça qu'on fait sur mobile (ou pour les gros jeux sur desktop).
Je suis dispo en free-lance. Et j'ai un blog.

#7 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 21 July 2011 - 14:09 PM

Pas de problème pour la mise en cache de graphismes sous formes de BitmapData. Au contraire, c'est une excellente méthode d'optimisation. Du moment que tu fais ça une fois au début et jamais dans un enterFrame.

Si tu en as vraiment des masses, alors monitores l'occupation mémoire pour voir où tu vas, avec System.totalMemory.

#8 lazrie

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 242 messages

Posté 05 August 2011 - 11:40 AM

Il y a aussi quelque chose qui m'intrigue dans flixel. Je vois que tout les FlxSprites sont réunis dans un seul tableau au sein de FlxState. C'est seulement pendant le bouclage de ceux si qu'on regarde dans qu'elle camera ils sont est qu'on les affiche au besoin. Est ce que le fait de tous les avoir dans un même tableau améliore la vitesse de rendu, ou est ce que c'est plus un choix de programmation? Ils n'aurait pas été plus simple de faire des tableaux de FlxSprite associé a chaque camera, et ensuite de boucler les cameras qui aurait mient a jour leur propre FlxSprite?



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)