Limiter le framerate avec fullscreen ne marche pas

Hep !

Problème : la limite de framerate à 60 fps fonctionne bien (à quelques fps près, je suis plutôt à 62fps et de brouettes), mais quand je passe en fullscreen, je l’explose totalement : j’oscille entre 120 et 600 fps ! (Vsync ou pas, en full screen ça change rien).

Avoir bcp de fps n’est pas un problème en soit, sauf pour les “animations scriptées”… Par exemple je fais osciller l’opacité d’un objet entre 128 et 255 de +/- 5 : en 60 fps l’animation est parfaite (et que le fps bouge un peu ne se remarque absolument pas), mais si je passe le jeu en fullscreen les objets clignotent alors bcp trop vite !

Comment contourner ça ? cad que le framelimit fonctionne et/ou se baser sur autre chose pour faire clignoter ? (j’ai bien essayé les chronos, mais vu que j’utilise ces animations dans des “Pour chaque” il me faudrait autant de chronos que d’objets :s).

Un principe général est de ne pas dépendre des FPS même s’il y a une limite de fps.
Pour cela, tu peux faire varier l’opacite de 5*TimeDelta() ce qui va donner une variation de 5 par seconde étant donné que TimeDelta() donne la durée d’une frame.
Note: Ne jamais utiliser TimeDelta() pour une force, elles sont déjà en pixels/seconde.

J’ai pas remis le nez là dedans car si timedelta() est égal à la durée d’une frame, du coup la valeur dépend directement du framerate ? J’aurai un timedelta très différent suivant que je sois à 60 fps ou 600 fps ?

Dis moi is je m’égare avant d’avoir testé… Mais in fine la limite de framerate qui n’est plus respectée en fullscreen c’est un beau bug (connu)(corrigible ?) ?

J’aimerais pouvoir animer des choses sans passer par les sprites (ça serait dommage d’utiliser 15 images là où un script peut faire le boulot) et avec un framerates d’animation constant (sans chronometre également car objet doit avoir son propre cycle de clignotements et sont générés à la volée… cf mon problème “pour chaque et chrono”).

Jjustement, sans timeDelta(), tu ajoutes 5 par frame. Alors qu’en multipliant par TimeDelta(), cela ajoute 5 par secondes Par exemple, si la frame dure 1/60 s, cela ajoutera 5/60, si la frame suivante dure 1/80 s, alors ça ajoutera 5/80. Mais au final, il y aura bien 5 ajouté en 1 seconde.

Ok merci je vais tester, c’est plus clair comme ça :slight_smile:

Bon bin non :frowning:

je sèche, je sais pas comment conditionner ça…

De base pour l’animation (ici en -/+1 opacité), voir la pièce jointe ce que j’ai, où et comment utiliser ton idée stp ?

Il faut multiplier 1 par TimeDelta() quand tu modifies l’opacité (faudra augmenter 1 d’ailleurs).
Mais je crois que l’opacité est un entier entre 0 et 255 donc déjà, il ne pourra pas prendre une valeur à virgule. Le mieux est d’utiliser une variable d’objet “opacite” que tu modifies (avec l’opacité “à virgule”) et d’affecter le contenu de la variable à l’opacité de l’objet.

Je comprends mal mais j’ai ré essayé : si je me contente de rajouter -5TimeDelta() ou +5TimeDelta() ça ne marche pas sans surprise, j’ai tenté avec un round() mais idem c’est arrondi à 0 (5*TimeDelta() donne aux alentours de 0.08).

C’est pour ça que je te dis de faire varier une variable d’objet (qui contiendra l’opacité avec la virgule) et ensuite, tu affectes son contenu (arrondi) à l’opacité. Résultat, l’opacité aura bien sa valeur arrondie, mais la variable pourra varier par petit pas < 1. :wink:

Ok merci, je suis arrivé à ça (en fait j’avais testé hier mais à 5*TimeDelta() je voyais que dalle, je n’avais pas tracé la variable)…

Ca donne ce qu’il ya en pièce jointe pour les curieux…

Mais autre question : est-ce la meilleure méthode/pratique, et surtout la plus simple/rapide pour faire mon anim de clignotement ? Ca me parait bien long et compliqué… Est-ce que j’ai raison d’utiliser une variable “seuil_opacite” comme ça ? Je cherche à optimiser et surtout si possible savoir si on peut écrire moins pour le même résultat !

Encore merci à Victor !

Oui, c’est le seul moyen de savoir dans quel sens tu vas devoir faire varier l’opacité.