Ne AS3 Événement.ENTER_FRAME exécuter sur chaque image, toujours? Même sur des ordinateurs lents?
J'ai un script qui s'appuie sur ENTER_FRAME
événement à exécuter à chaque fois. J'ai remarqué sur certains ordinateurs plus lents, il peut y avoir un certain retard lors d'une animation flash est en cours de lecture.
Ne ENTER_FRAME
exécuter sur chaque image, même si son sur un ordinateur lent?
Si l'animation flash gal, le ENTER_FRAME
événement continue à fonctionner et le rendu juste essayer de rattraper?
Est l'exécution de code sur ENTER_FRAME
un moyen fiable pour exécuter du code à chaque fois qu'une image est entré?
OriginalL'auteur zechdc | 2011-07-06
Vous devez vous connecter pour publier un commentaire.
Yep. Chaque image, pas d'exceptions. Si quelque chose est en train de ralentir un film (que ce soit lourd de scripts ou de graphiques), il
Event.ENTER_FRAME
les gestionnaires sont toujours exécutées avant le rendu d'une image.Par conséquent, il est généralement une bonne idée d'utiliser un
Timer
exemple avecTimerEvent.TIMER
, même si ce retard est égal à "idéal" de la durée des images de votre animation fps. Parce quetimer
gestionnaire est pas lié à être déclenché à taux uniforme.Voir le lien suivant pour plus d'explication en profondeur: L'Élastique De L'Hippodrome
Je maintiens qu'elle n'est pas plus précis. La vraiment important, c'est de garder une trace de la différence de temps entre les mises à jour et utiliser le delta de temps pour mettre à jour vos positions au lieu d'une valeur fixe ", image par image." La différence de temps est tout simplement une "garantie" pour être à peu près la même chose à chaque fois que la fonction est exécutée si c'est un timer, alors que, dans le cadre d'entrée de la boucle, il va être le temps qu'il faut pour l'ensemble du processus de rendu, ce qui signifie que votre temps delta peuvent varier énormément.
C'est pas généralement une bonne idée d'utiliser une Minuterie avec votre idéal de framerate, car la cadence ralentit, votre Minuterie gestionnaire sera de faire des itérations dont les résultats ne sera jamais dessiné à l'écran. Faites votre logique dans un gestionnaire EnterFrame, et que gestionnaire d'utilisation getTimer() pour vérifier combien de temps il a été depuis la dernière image de mise à jour, et d'agir en conséquence.
Nox, peu importe ce que vous faites avec les événements de la minuterie ou getTimer, vous êtes assuré d'obtenir une image de l'événement avant chaque renouvellement, donc c'est le bon endroit pour mettre à jour des effets visuels. Si pour mesurer le temps delta de chaque image, et que faire avec delta, dépend du contenu, et ce que vos objectifs sont. Mais il n'y a pas de valeur, que ce soit à l'exécution de la logique que les mises à jour de l'écran plus ou moins fréquemment que ce que l'écran est redessiné.
Aussi:
Flash Player tries to maintain the amount of calls to TIMER event handler.
- ce n'est pas correct. À un intervalle régulier (piloté par le conteneur, mais généralement tous les 10-50ms) Flash de vérifier que les règles de l'intervalle écoulé depuis le dernier événement de minuterie, et si donc le numéro un. Puis il fait de même pour les images, puis il attend un autre 10-50ms et de répétitions. Il ne fait aucune tentative pour maintenir un ordre particulier des événements ou des types d'événements.OriginalL'auteur Nox Noctis
si vous avez un taux de rafraîchissement de jeu à 30fps, l'évènement sera le feu de 30 fois par seconde, tant que vous ne mettez pas une charge sur le processeur, rendant le frame rate chute. En effet, si le framerate est fluctuant, vous pourriez obtenir des résultats plus cohérents avec un Événement de minuterie.
sur une note de côté, sachez que...
À l'aide de nombreux gestionnaires d'Événement peut créer des problèmes de performances trop (si vous en avez trop)
Chaque fois qu'il est appelé, flash doit créer un objet d'événement pour le moins. Cela signifie que vous avez la mémoire qui doit être alloué à chaque fois que l'événement se déclenche. Cette mémoire doit ensuite être nettoyée à un moment plus tard, et de la collecte des déchets sera également utiliser les ressources d'exécution.
Si vous avez plusieurs clips ou des sprites, il pourrait être utile de disposer d'un contrôleur qui gère l'ensemble d'entre eux, plutôt que de chacun d'eux ayant son propre gestionnaire EnterFrame.
OriginalL'auteur Daniel
Manière générale, la réponse à la question générale.
Si vous voulez améliorer les performances de Flash Player ensuite considérer les points suivants,
N'utilisez pas de coups, sauf si cela est nécessaire. (Les traits sont plus de cpu
intensive)
Utilisent moins d'un dégradé de couleurs si possible.
L'utilisation optimisée des bitmaps si tout.
De l'utilisation efficace de
addChild(yourObject)
,addChildAt(yourObject, index)
,removeChild(yourObject)
,removeChildAt(index)
.Écouter
Event.ADDED_TO_STAGE
etEvent.REMOVED_FROM_STAGE
respectivement.
Écouter
addEventListener(somelistener, somefunction);
removeEventListener(somelistener, somefunction);
Écouter
Event.ACTIVATE
etEvent.DEACTIVATE.
Si les objets sont chargés de l'extérieur alors assurez-vous d'utiliser
unloadAndStop()
pour supprimer complètement inutileobjects
à partir de
de la scène.
OriginalL'auteur Rajneesh Gaikwad
Check this out pour ceux qui cherchent un taux de rafraîchissement indépendant solution... ce mec est vraiment intelligent et a une technique pour les animer de manière cohérente à travers de multiples fréquences d'images (plus lent périphériques, ordinateurs de bureau, etc), et en gardant votre objet de framerate indépendant de votre timeline du framerate. Check it out ici. Conseils 4 & 5. Espérons que ça aide!
J'ai trouvé que la classe timer est en fait très incohérents lors de l'empâtage boutons, parfois la minuterie juste ne parvient pas à terminer un cycle et de la MINUTERIE.COMPLÈTE de l'événement n'est jamais atteint, si j'avais à 5 cycles de 100ms, il suffit de s'arrêter après 3 cycles... Aussi, fréquence d'images de feu à chaque frame, mais ELLE n'EST PAS COMPATIBLE!!! Si vous avez du lag sur le CPU, votre framerate va baisser et donc vous n'aurez rien mise à jour à intervalles réguliers, mais plutôt quelle que soit la fréquence d'images. Regardez ce lien, il y a même certains framerate de code que vous pouvez utiliser sur vos projets pour le vérifier.
OriginalL'auteur Bacon Neck Games