Connexion
Pour récupérer votre compte, veuillez saisir votre adresse email. Vous allez recevoir un email contenant une adresse pour récupérer votre compte.
Inscription
En vous inscrivant, vous acceptez les conditions d'utilisation du site et de nous vendre votre âme pour un euro symbolique. Amusez vous, mais pliez vous à la charte.

Un Rédacteur Factornews vous demande :

ARTICLE

Tick Tick Boom

CBL par CBL,  email  @CBL_Factor
 
The Evil Within est encore un exemple de jeu dont le framerate est bloqué à 30 FPS sur PC. Bethesda a publié la liste des commandes debug permettant de faire sauter cette limite tout en précisant que cela peut donner des résultats inattendus.

Pour comprendre l'origine du problème, il est nécessaire de donner un petit cours de programmation sur les moteurs graphiques.
En général, ils fonctionnent grosso modo de la manière suivante. On commence par faire les calculs liés au gameplay, à l'IA, à la physique, aux collisions, aux animations... afin d'obtenir la position des différents objets 3D. Puis on va balancer le tout à la carte graphique qui va rendre le résultat et afficher une belle image.

Selon la complexité de ce qu'il y a à afficher et la puissance de la carte graphique, le rendu va prendre plus ou moins de temps. Accessoirement les calculs mentionnés plus haut vont aussi prendre du temps. La conséquence est qu'entre deux images, il se passe quelques dizaines de millisecondes. C'est la période entre deux images et si vous vous rappelez vos cours de collège, la fréquence équivaut à l'inverse de la période. F = 1/T. Donc si votre période est de 33 ms ou 0.033 s, votre fréquence est de 30 Hz (et des poussières). C'est votre frame rate. On l'exprime plutôt en frames par seconde (FPS).

Pour la majorité des calculs liés au gameplay comme les déplacements des personnages, on les effectue au sein de fonctions Tick qui sont gentiment fournies par le moteur et qui s'exécutent à chaque nouvelle image. Cette fonction Tick va aussi vous fournir le temps qui s'est écoulé depuis la dernière image, la fameuse période. Appelons-la dt (pour delta temps). Du coup il y a deux manières de faire ces calculs : en fonction du framerate ou en fonction du temps.

Quand vous fondez vos calculs sur le frame rate, vous espérez toujours atteindre un certain frame rate. Mettons 30 images par seconde. Imaginons maintenant qu'un ennemi court à 10 mètres par seconde en ligne droite le long de l'axe X. Comme une frame correspond à 1/30 de seconde, le calcul de la position de l'ennemi va ressembler à cela dans sa fonction Tick :
void Tick(float dt)
{
    x = x + 10/30;
}

Si vous souhaitez plutôt fonder vos calculs sur le temps, le calcul sera plutôt du genre : 
void Tick(float dt)
{
    x = x + 10 * dt;
}

Si votre jeu tourne vraiment à 30 FPS, le résultat sera le même. L'ennemi bougera de 10 mètres en une seconde. Bloquer un jeu à 30 FPS est facile mais vous ne pouvez pas empêcher qu'il tombe en-dessous. Supposons qu'en même temps que l'ennemi court, votre carte graphique doive rendre une explosion atomique et arrive péniblement à cracher du 20 FPS. Si vous avez fondé vos calculs sur le frame rate, à la place d'avancer 30 fois en une seconde de 10/30 mètres, l'ennemi ne le fera que 20 fois. Il ira plus lentement.

En clair, tout le jeu sera ralenti. Si au contraire vous avez utilisé le temps, l'ennemi aura parcouru la même distance qu'à 30 FPS. Mais comme le rendu n'a été rafraîchi que 20 fois, son mouvement n'a pas dû paraitre très fluide. Si à la place d'un ennemi c'est une balle de Metal Slug qui se dirige vers vous, il est beaucoup plus juste de ralentir l'ensemble du jeu que de vous laisser moins de chance d'esquiver le projectile. Accessoirement quand le delta temps entre deux frames devient trop grand car le jeu rame à plein tubes, utiliser ce dt dans certains calculs type physique peut provoquer des effets indésirables vu qu'on perd beaucoup en précision.

Metal Slug 2, un bon exemple de jeu qui rame à fond les ballons

Ceci étant dit, coder en fonction d'un framerate fixe n'est pas propre pour deux raisons. Tout d'abord si des petits malins débloquent la limite que vous avez fixée, votre jeu va aller beaucoup plus vite que prévu. C'est l'effet Benny Hill. Mais aussi certains aspects du jeu bénéficient d'un framerate élevé. C'est le cas des animations de personnage. Mettons que vous levez un bras. Les animateurs vont définir l'orientation de départ et l'orientation d'arrivée et le moteur va se charger d'interpoller entre les deux. Plus vous avez d'images par seconde pour réaliser cette interpollation et plus ce mouvement paraitra fluide.

Un des solutions consiste à mélanger les deux systèmes à l'aide d'un accumulateur. L'idée est de débrider le framerate mais de ne faire certains calculs qu'après un certain temps écoulé. La fonction Tick va alors ressembler à quelque chose dans ce genre :
const float PERIODE = 1 / 60;
float accumulateur = 0;

void Tick(float dt)
{
    accumulateur = accumulateur  + dt;
    while(accumulateur >= PERIODE) 
    {
        MonTick(PERIODE);
        accumulateur = accumulateur  - PERIODE;
    }
}

void MonTick(float dt)
{
    x = x + 10 * dt;
{

En clair, si le delta temps est supérieur à celui voulu (donc si le frame rate est trop bas), on va effectuer les calculs plusieurs fois à chaque Tick histoire de compenser le fait qu'il y a moins de Tick. S'il est inférieur (donc si le frame rate est trop haut), on ne va pas faire les calculs à chaque Tick. Mais comme vous pouvez le constater, le code est bien plus lourd que si on se fondait uniquement sur le frame rate en priant pour qu'il atteigne les 30/60 FPS voulus. C'est du temps de dev en plus.
 
Need For Speed Rivals, l'exemple typique de la version PC codée avec les pieds

Du coup quand l'équipe qui est chargée de réaliser la version PC d'un jeu pensé avant tout pour consoles se retrouve avec ce genre de code sur les bras, ils ont deux solutions : soit ils en réécrivent une partie, soit ils conservent la même limite de frame rate que sur consoles.
 

Commentaires

Masquer les commentaires lus.
lirian
 
Temps de dev en plus -> deadline -> éditeur -> actionnaires-> millions -> économie -> politique -> peuple -> pauvres

TL;DR : c'est la faute aux pauvres si on a des jeux codés avec les orteils.
Captain America
 
Le titre est en clin d'oeil à The Hives ?
CBL
 
Voui.
ptitbgaz
 
Ah, je croyais que c'était un hommage à Bebel... :D
Captain America
 
CBL a écrit :
Voui.


Ah, un homme de gout ! :-)

Bon, maintenant, je vais lire la news... :nerd:
(C'est ironique hein...)
xdr
 
Intéressant. Moi qui n'y connait rien en technique, j'ai pas tout compris (en plus moi les maths... à part la géométrie... :D), mais en gros, par exemple j'ai pris Evil Within sur PC, au début j'avais délocké le framerate et en 60fps l'animation me semblait "flottante" (je trouve pas d'autre mot pour définir ça), et c'était assez désagréable à la longue, donc du coup j'ai remis en 30fps et ça passe très bien, c'est même parfait je trouve. C'est ça l'effet "Benny Hill"? :D Car c'est bizarre mais sur certains jeux ont voit vraiment qu'ils n'ont pas été fait pour le 60fps.
nono_le_robot
 
L'effet "Benny Hill" c'est plutôt les jeux prévus pour du 30fps bloqué qui vont 2x plus vite quand tu passes à 60fps, parce que tous les calculs sont "fixes". C'est plutôt rare de nos jours.
LeGreg
 
"c'est une optimisation raisonnable", famous last words. (okay je suis souvent coupable de la prononcer cette phrase..)
hiroshimacc
 
Ah bien vu, j'avais pas noté le TALC :P !

Je préciserais (plus que CBL ne l'a fait :P) que la physique est maintenant quasiment toujours calculée sur un DT fixe (souvent 60 Hz). Ça ne signifie pas que le jeu doive tourner à cette vitesse, mais que le calcul sera effectué 2 fois par cycle à 30 FPS (comme l'explication des animations).

Coder envers un DT fixe a aussi l'avantage de simplifier certains calculs, contrairement au DT variable qui oblige à appliquer toutes ses formules en fonction de ce même DT. C'était surtout pratique à l'époque où les calculs en virgules flottantes n'existaient pas sur certaines machines ou étaient trop lents.

Également, le fait d'utiliser la synchronisation verticale (VSYNC ou V-BLANK), comme c'était forcément le cas sur les télés cathodiques, empêche la carte graphique d'afficher ce qu'elle a dans ses tuyaux quand elle le désire (aka quand c'est prêt !). Du coup c'est un laps de temps supplémentaire qui s'ajoute au temps de rendu total d'une frame. Pour ceux qui ont suivi jusqu'ici, ça explique la différence de vitesse entre les jeux PAL (50Hz) et NTSC (60Hz).
xdr
 
D'accord, bah je me demande pourquoi je trouve Evil Within mieux en 30fps qu'en 60fps.

Sinon je me suis toujours demandé, donc l'histoire de nos vieilles consoles 50hz au lieu de 60hz, c'était donc locké à 50fps? Je me souviens des bandes noires et du son ralenti en tout cas. Par contre je comprend pas car j'étais tombé sur un topic sur un site "technique" qui parlait des jeux en 60fps sur PS2, c'était un site US (donc ils parlaient pas de nos versions PAL) et ils disaient que très très peu de jeux PS2 tournaient en 60fps, genre moins de 50 jeux. Donc 60hz ne veux pas forcement dire 60fps c'est bien ça?

Oui ça doit sembler très con mais je me questionne... ^^"

EDIT: Ah bah Hiroshimacc répond en partie. Par contre je comprend pas tout, pfff. :D
nono_le_robot
 
xdr a écrit :
D'accord, bah je me demande pourquoi je trouve Evil Within mieux en 30fps qu'en 60fps.


Je dis peut-être une bêtise parce que j'ai pas joué au jeu mais je suppose que c'est le cas qu'explique CBL à la fin de l'article. En gros la «logique» du jeu (les input, l'IA, la physique, etc…) doit être calculée avec un DT fixe à 30Hz mais le reste passe à 60fps (animations, etc…) ce qui provoque une latence et donc un effet de flottement entre ce qui se passe et ce qui est affiché. Enfin c'est juste une supposition.
xdr
 
Ah oui ça doit être ça Nono, j'avoue que les formules mathématiques et le jargon me larguent un peu (je suis vraiment à chier dans ce domaine j'y comprend pas grand chose). :p Je ne suis donc pas fou, ça fait plaisir. :)
hiroshimacc
 
@xdr Sur les vieilles télés, notre format PAL rafraîchissait l'écran 50 fois par seconde (50Hz) donc ta console pouvait au mieux afficher 50 images/sec. C'était même pas la peine d'essayer d'en faire plus. Du coup les jeux capables de faire leurs calculs en 1 cycle ou moins (1/50 sec. soit 20 ms) pouvaient s'attendre à ce que la console bloque en attendant d'envoyer l'image sur l'écran, et pouvait donc considérer que chaque frame prendrait 1/50 sec.

Le problème c'est que le format NTSC présent au USA et au Japon est à 60Hz, et évidemment les jeux étaient avant tout codés pour fonctionner avec ce rafraîchissement là en tête. Du coup chaque frame était estimée à 1/60 sec. soit 16,666 ms, ce qui fait qu'une fois porté pour l'Europe au format PAL, un jeu exécutait 10 frames de moins par seconde, soit une perte de ~17% des calculs, et forcément le tout était plus lent.
Burps
 
@hiroshimacc : je vais faire mon casse-couille : sur ta vieille télé, le signal PAL rafraîchissait l'écran que 25 fois par seconde car 50Hz (50i). Idem pour NTSC, c'est plutôt 30 images par seconde, car 60Hz.
Sinon l'article est intéressant. J'aimerai lire des articles techniques plus souvent sur mon site de jeux vidéos préféré :-p
kakek
 
Ceci n'explique pas l'aspect ratio par defaut bizarre, qui colle des grosses bande noires, et le fov bloqué (qui empêche de le corriger convenablement sur PC.) Bethesda dit "choix artistique", mais personne n'y croit. Et il y a un mouselag énorme. Bref, le portage PC est assez mal foutu.
CBL
 
Le 2.35 peut se comprendre. Ca permet de cacher certaines choses et donner un cachet cinématique. Ce n'est pas une limitation technique mais un choix. Idem pour le fov. Un fov resserré accentue le sentiment d'oppression.
nono_le_robot
 
Pour le cinémascope, faut se rappeler que déjà dans Resident Evil 4 du même Shinji Mikami on se tapait des bandes noires sur les versions NGC et PS2. Faut croire qu'il aime pas le plein écran.
kakek
 
Ou alors c'est que c'est son truc pour réduire la résolution utilisée et améliorer les perfs.
D'ailleurs sur RE4, les éditions remastered sorties plus tard ont virées les dites bande noires. Ce qui laisse penser que le "choix artistique" était quand même un peut lié a la plateforme et/ou a été désavoué plus tard.

Mais bon, on est sur PC, il y a déjà un trainer pour bidouiller le FOV et réussir a avoir du plein écran sans réduire encore plus le fov déjà assez faible.
CBL
 
kakek a écrit :
D'ailleurs sur RE4, les éditions remastered sorties plus tard ont virées les dites bande noires. Ce qui laisse penser que le "choix artistique" était quand même un peut lié a la plateforme et/ou a été désavoué plus tard.


Au contraire. Sur PS2/GC, le jeu était en 4/3 avec des bandes noires pour simuler le 16/9. Dans les versions remaster, il est directement en 16/9.
kakek
 
OK, dans ce cas c'est juste un choix artistique que je désapprouve au possible.

Sinon, aprés un petite heure de jeu, là a l'instant, c'est dingue ce que le début ressemble a RE4 justement. Le décord style vieux village avec des maisons en bois, cloisonné par des grosses palissades en rondins, on croirait qu'il l'a fait avec les mêmes textures et assets. Et pas que ca. Le gameplay, l'ambiance ... tout pareil.
LeGreg
 
Burps a écrit :
@hiroshimacc : je vais faire mon casse-couille : sur ta vieille télé, le signal PAL rafraîchissait l'écran que 25 fois par seconde car 50Hz (50i). Idem pour NTSC, c'est plutôt 30 images par seconde, car 60Hz.


Non, il y a bien 50 images par seconde en PAL. (et 60 en NTSC). Tu peux vraiment afficher des infos différentes sur chaque demi-image et qui sont bien enregistrées par l’œil comme distinctes. Le trick c'est qu'elles sont légèrement décalées ce qui en clignant des yeux donne l'impression que la résolution est plus importante (une sombre histoire de bande passante).

C'est la raison pour laquelle du contenu enregistré pour la télé est plus fluide que du contenu enregistré pour le cinéma (qui reste limité à 24hz non entrelacé sauf expérience récente comme le Hobbit).
Ouhlala
 
LeGreg a écrit :
Burps a écrit :
@hiroshimacc : je vais faire mon casse-couille : sur ta vieille télé, le signal PAL rafraîchissait l'écran que 25 fois par seconde car 50Hz (50i). Idem pour NTSC, c'est plutôt 30 images par seconde, car 60Hz.


Non, il y a bien 50 images par seconde en PAL. (et 60 en NTSC). Tu peux vraiment afficher des infos différentes sur chaque demi-image et qui sont bien enregistrées par l’œil comme distinctes. Le trick c'est qu'elles sont légèrement décalées ce qui en clignant des yeux donne l'impression que la résolution est plus importante (une sombre histoire de bande passante).

C'est la raison pour laquelle du contenu enregistré pour la télé est plus fluide que du contenu enregistré pour le cinéma (qui reste limité à 24hz non entrelacé sauf expérience récente comme le Hobbit).



Je pense qu'il y a confusion entre les Hertz et les images là : Le PAL c'est bien 25 images/secondes , et le NTSC 30ips (enfin 29,97) . En terme de fréquence , il y a bien 50 et 60 hertz . Techniquement, çà signifie qu'il y a un changement de polarité possible respectivement 100 et 120 fois, et çà concerne tout les appareils électriques secteurs (c'est pas juste un truc réservé aux écrans). Le cinéma, c'est 24 ips

Edit : ce sont les normes de ces formats . Parfois, on parle de Pal 50i, mais, ce sont des images interpolées (demi images affiché à chaque cycle). Même pour le HD on parle de 24, 25 ou 30 ips.

Vous me direz que les moniteurs tournent parfois en 120hz . Oui , en effet . Mais, généralement ce sont déjà des moniteurs qui ne sont pas au standard pal ou ntsc, et çà concerne surtout les écrans type 3D . Certaines TV dépassent aussi les 100hz , pour des raisons essentiellement marketing : Ca reste toujours du 24 ips (ou 25-30), mais avec filtre, interpolant les images, et donnant cet effet caractéristique de mer huileuse sur l'image.

Pour les jeux vidéos , ce n'est pas forcément comparable, vu qu'on peut obtenir le nombre d'images/sec que l'on veut selon le jeu/matos.
LeGreg
 
Ouhlala a écrit :
Je pense qu'il y a confusion entre les Hertz et les images là : Le PAL c'est bien 25 images/secondes , et le NTSC 30ips (enfin 29,97) . En terme de fréquence , il y a bien 50 et 60 hertz . Techniquement, çà signifie qu'il y a un changement de polarité possible respectivement 100 et 120 fois, et çà concerne tout les appareils électriques secteurs (c'est pas juste un truc réservé aux écrans). Le cinéma, c'est 24 ips


Hertz c'est une mesure de fréquence. On peut donc parler au choix de 50 Hertz ou 50 image par seconde (N Hz = 1/N sec). Ça veut dire la même chose !

Un jeu rendu à 30 images par seconde, peut être affiché sur un écran qui est rafraîchi à 60 images par seconde. Dans ce cas deux images consécutives que le moniteur affiche seront identiques.

Un jeu qui est affiché en mode entrelacé 60i (en général c'est assez old-school donc on ne le verra plus aujourd'hui) doit bien produire 60 nouvelles images par secondes. La différence avec le mode non entrelacé est que la résolution en lignes est réduite de moitié pour chaque demi-image. La fluidité est au rendez-vous mais l'image semble "clignoter" en contrepartie : elle clignotera plus sur un vieil écran cathodique PAL que sur un vieil écran cathodique NTSC. Les écrans LCDs ne clignotent plus.. (Enfin sauf si c'est fait volontairement).
Ouhlala
 
ouip, jamais dit le contraire, que le Hz , c'est la fréquence . J'ai même utilisé le terme.

Pareil, pour les jeux .

Je pense que tu n'arrives pas à distinguer le nombre d'image par seconde physique du moniteur (possible), lié en effet à la fréquence de rafraichissement, et le nombre d'image par seconde imposé par une norme (pal, ntsc, ciné, etc). Encore heureux qu'il y a ces normes, sinon ce serait l'anarchie . Pour les jeux, c'est différent, vu qu'il est possible de programmer le nombre d'image désiré, et de l'adapter selon les configs.

En gros, il y a une réflexion de technicien pure et dure , qui dit "non, pal, c'est du 50 ips" , et de l'autre, le mec qui bosse dans l'audiovisuel, et qui te dira " non, le pal, c'est du 25 ips" . Ce dernier aura raison, vu qu'en filant du 50 ips à ton diffuseur, il y aura de mauvaises surprises, et tu te feras insulter de ton incompétence, parce qu'on doit respecter la norme .
Burps
 
LeGreg a écrit :
Non, il y a bien 50 images par seconde en PAL. (et 60 en NTSC).


Je crains que si. Pour éviter de citer à nouveau la vieille pute brésilienne qu'est wikipedia, voici un lien alternatif détaillé sur le timing de PAL
Ici quand on parle d'images par seconde, on parle bien d'images complètes (25p ou 50i).
Comme le dit Ouhlala, PAL et NTSC sont des normes, c'est comme ça et pas autrement (c'est le but principal d'une norme).
En même temps au vu de l'article, on s'en tape un peu...
nono_le_robot
 
En vidéo oui c'est bien 25 ou 30 images par seconde mais en ce qui concerne les consoles rien n'a jamais empêché d'afficher des demi-images et avoir ainsi du 50 ou 60fps. Et heureusement parce que sinon le 60fps sur console serait une notion toute nouvelle.
Turom_
 
En tout cas le rendu des jeux rétro sous norme PAL est juste tout bonnement dégueulasse, j'ai fait la comparaison moi-même pour m'en convaincre.
LeGreg
 
Burps a écrit :
LeGreg a écrit :
Non, il y a bien 50 images par seconde en PAL. (et 60 en NTSC).


Je crains que si. Pour éviter de citer à nouveau la vieille pute brésilienne qu'est wikipedia, voici un lien alternatif détaillé sur le timing de PAL
Ici quand on parle d'images par seconde, on parle bien d'images complètes (25p ou 50i).
Comme le dit Ouhlala, PAL et NTSC sont des normes, c'est comme ça et pas autrement (c'est le but principal d'une norme).
En même temps au vu de l'article, on s'en tape un peu...


Oui mais chaque demi image est bien de l'info supplementaire que l'oeil interprete comme de la fluidité supplémentaire (et latence réduite).

Sinon vous ne vous êtes jamais demandé pourquoi il y avait des modes entrelacés ?

Ce n'est pas que le jeu vidéo, le contenu vidéo enregistré pour la télé bénéficie de la fluidité supérieur.
LeGreg
 
Pour résumer 60i ou 60 entrelacé (60interlaced) c'est bien un mode 60 hertz ou 60 (demi)images par seconde. Si ce n'était pas le cas on parlerait de 30p (30progressive).
LeGreg
 
La ps2 "tirait" parti du mode entrelacé en faisant du 60i authentique. Au point où si un jeu ratait une frame la résolution "sautait", parce que le frame buffer du GS n'avait pas toute l'info pour l'affichage correct. Les progs qui ne voulaient pas se prendre la tête programmaient en mode progressif avec d'autres contraintes.
hiroshimacc
 
Je ne pensais pas que les gens s'attarderaient autant sur les détails :P ! Je suis resté sommaire surtout pour expliquer la différence de vitesse d'un jeu PAL vs. NTSC, qui potentiellement est liée à la vitesse de rafraîchissement de l'écran.

Le phénomène est le même que celui expliqué dans la news et c'est pour ça que, même si nos écrans de PC aujourd'hui ne sont pas liés à la norme PAL ou NTSC, le principe reste le même si le développeur décide de coder comme un sagouin contre un frame rate fixe.
LeGreg
 
Ouhlala a écrit :
Ce dernier aura raison, vu qu'en filant du 50 ips à ton diffuseur, il y aura de mauvaises surprises, et tu te feras insulter de ton incompétence, parce qu'on doit respecter la norme .


Il y a peut-etre des limitations sur ce qu'un diffuseur accepte (le web n'est pas trés bon avec les hauts framerates) et les modes entrelacés ne sont plus trop à la mode en 2014.. Mais je dirais que le technicien a un trou béant dans ses connaissances s'il ne fait pas la distinction entre 60i et 30p. Ce n'est pas juste une différence théorique..
Kaede
 
Voir aussi cet article de référence (en anglais), la meilleure ressource que j'ai pu voir sur le sujet : http://gafferongames.com/game-physics/fix-your-timestep/
Vous devez être connecté pour pouvoir participer à la discussion.
Cliquez ici pour vous connecter ou vous inscrire.
Rechercher sur Factornews