Reverse engineering (du moins un peu) de Street Fighter IV
J’ai vu hier soir sur la Tribune qu’un bench de SFIV était sorti. C’est la bonne occaze pour regarder comment Capcom a goupiller ce titre.
La 1ere chose qui m’a marqué est que durant ce bench, un seul CPU est utilisé. Chose étonnante puisque MT, le moteur 3D de capcom utilisé dans LostPlanet, Dead Rising,…a été architecturé pour tirer parti du multicore. 2eme chose étonnante, ma config à base de Core2Duo P8600 & GForce 9650M fait tourner le bouzin a 20FPS en 1680×1050 avec rien à fond (ni AA ni rien). C’est la misère.
Et en regardant ce qui se passe dedans, je comprends mieux pourquoi. J’utilise Microsoft PIX pour tracer les appels de rendu DirectX sur certains frames.
La chose qui me choque en 1er lieu est la quantité d’appels vers DX. Pour un frame plutôt simple (gros plan sur Ryu en train de parler), on atteint 10000 appels. Un appel peut changer le mode de blending, dessiner un lot de triangle ou spécifier une constante de shader. C’est énorme. A titre d’exemple (qui vaut ce qu’il vaut), une scène complète dans mon jeu avec post process et ménu ne dépasse pas les 2000appels.

Lié à ca: le nombre de drawcalls. Il y en a plein. plein plein plein. Quelques 100aines de triangles a chaque fois. Mais pour quelques triangles, il y a appels DX pour les constantes de shaders, blending…le cout CPU pour la rasterisation d’un triangle est énorme. Le meilleur moyen pour avoir de bonnes performances sur PC est le batching (regrouper des mesh, merger des vertex arrays). Je ferais d’ailleurs un article sur ca bientôt.
Lié à ca, chaque appel de rasterisation demande à dessiner des triangles strips. Sur PC, ca a peu d’intérêt. L’économie de GPU sont pas suffisament importantes. Pour transposer dans le monde réseau, c’est comme si on envoyait un gros fichier texte par paquet IP de 10 octets mais que chaque packet soit compréssé.
Pourquoi avoir fait ca? Tout simplement parce que sur console, la couche entre le jeu et le GPU est très fin. Sur PS2, on envoyait beaucoup de requêtes DMA pour faire des rendus. A tel point qu’un port brut d’un jeu PS2 sur PC ramait grave même sur un PC récent.
Sur ce jeu, 70-80% du temps CPU doit être perdu dans le driver.
Sur le screen suivant, on voit plusieurs choses:

- les triangles de dégénérescence dus au stripping (pour avoir un mesh correct avec du stripping, on doit rajouter des triangles)
- le nombre assez impressionnant de valeurs a interpoler entre les vertex et les pixels shader. Juste pour un mesh de décor. En avoir trop peut faire ramer le GPU puisqu’il doit interpoler pour chaque pixel.
- pas visible mais je le dis quand même, les normals maps sont encodées dans le GPU en DXT5.
Shot suivant:

Ils font un rendu dans une texture de petite taille (320×240). Je ne sais pas a quoi elle sert. Peut-être pour de l’occlusion, déterminer les vitesses par pixel pour du blur directionnel…. Je dirais quand même que c’est un rendu de normal dans l’espace de vue pour du post process/lighting.
Une chose est sure. Pour chaque appel de rasterisation, il y a des dizaines d’appels DX. Rendement nul à chier.
Chez Epic Games, ils ont un rendu software utilisé pour les occlusions et 2/3 petites choses comme ca. Ca prends peu de temps CPU comparé a tout ce qui est perdu dans le driver.
Pour les grapheux:

Il est moins sexy le père Ryu vu comme ca hein?
512×512. Bon. Les nanas ont au moins 2 textures aussi (tête + corps) dont certaines en 1024×1024.
Dans les textures de menu, il est inscrit la resolution de celle-ci. Ca m’a fait marrer.
En conclusion, que dir de ce jeu? Ben qu’ils ne se sont pas fait chier pour le portage. Avec une passe sur leur renderer, tu doubles (voire plus), les perfs de rendu. J’ai pas regardé leurs shaders mais en ademettant qu’ils soient très gros, au pire, tu limites l’utilisation du CPU.
16 juin 2009 à 13:49 Citer
Ah ben, je comprend pourquoi je trouvais certaines norma maps très pixelisée, si elles tournent autour de ces résos là c’est pas étonnant. Du niveau de doom3, preuve que des bons shaders ça te fait un jeu (visuellement j’entends)
Sinon méfie toi de pas avoir des prbs avec l’eula…
16 juin 2009 à 13:50 Citer
quand on disait qu’ils sont en retard sur le nextgen je me doutais pas que c’était à ce point là :/
16 juin 2009 à 13:51 Citer
@Holi
C’est pas le même moteur que RE5/Lost planet/…
16 juin 2009 à 13:55 Citer
Je me suis jamais penché sur le dév 3d console, et grouper les données ça me parait évident.
Ça a un intérêt sur console de faire comme ça ou c’est juste par flemme et parce que la console le permet ?
16 juin 2009 à 14:01 Citer
Hé ben merde, t’as l’air calé … interessant en tout cas
16 juin 2009 à 14:04 Citer
@Wiz
Sur console, ta jamais beaucoup de cache (cher a fondre). Alors tu traites des lots de datas plus petites. Avec peu de latence (architecture unifiée CPU/GPU). Tu traites les datas au rythme ou elles arrivent. Sur PC, tu as plein de couches a traverser.
Le PC est un super tanker. La console est un hors-bord.
@thierry_l’ummite
Merci :)
16 juin 2009 à 15:11 Citer
Si tu pouvais faire pareil pour flight simulator X
Je tourne a 15-20 fps dessus, et ca parait presque normal pour ceux qui ont des gros CPU type i7.
Alors que tous les autres jeux c’est 30 de plus.
Optimisé a la pisse ou simu exigeante?
16 juin 2009 à 15:18 Citer
Tout le monde sait que c’est parce que c’est des CONSOL’GAEMS !
16 juin 2009 à 15:56 Citer
Un peu comme assassin creed :x
16 juin 2009 à 16:00 Citer
Et si tu lis l’article et le com de skaven, tu comprends pourquoi, au lieu d’avoir une idée préconçue@lol, c’est pas beau ça ?
16 juin 2009 à 19:17 Citer
est ce que ça veut dire que SFIV tournera pas sur mon PC?
16 juin 2009 à 19:23 Citer
Erf ça aurait été marrant que tout cela tourne à la compète de “kikitoudur kialaplusgrosse” à coup de bench.
Sinon ç’est fort zolie et ça tourne pas mal je trouve, malheureusement je sais que ça va pas me plaire, SC Powaaaaa !
16 juin 2009 à 19:51 Citer
ils avaient pas dit que toutes les versions, que ca soit console ou PC, seraient les meme ?
16 juin 2009 à 20:03 Citer
non rien, 3h c’est un peu juste pour une nuit
16 juin 2009 à 22:09 Citer
J’ai testé le bench à 1650×1080 et ça tourne bien. Je trouve le jeu beau pour ma part. J’ai hâte de later des vieilles merdes online !
16 juin 2009 à 22:46 Citer
Très intéressant cette petite analyse, rien de telle pour mieux comprendre les rouages sur PC et sur console. :)
16 juin 2009 à 23:04 Citer
bon le portage a l’air nickel au niveau perf (merci pour ton post au passage, même si j’ai pas compris la moitié) … reste à voir au niveau réseaux ! Si tout est réuni ça risque de faire une jolie communauté autour du jeu.
17 juin 2009 à 22:45 Citer
Sympa l’article.
Pour mon vieux PC, P4@2.6Ghz inside
1280*960 TAF AA2x average 37fps avec jamais une chute en dessous de 30 fps il me dit que mon PC est trop lent, j’ai vraiment besoin d’avoir 80fps pour jouer à un jeu de baston ?
18 juin 2009 à 11:44 Citer
Ok j’ai DL le bench et je suis fluide TAF, donc content, par contre il suporte mal le recording avec fraps, le jeu descend à 30fps, ce qui est sencé être fluide ; il l’est mais tourne au ralenti, assez étrange.
Autrement j’ai l’impression que le jeu bloque à 60fps.
18 juin 2009 à 11:48 Citer
Ok j’ai DL le bench et je suis fluide TAF, donc content, par contre il suporte mal le recording avec fraps, le jeu descend à 30fps, ce qui est sencé être fluide ; il l’est mais tourne au ralenti, assez étrange.
Autrement j’ai l’impression que le jeu bloque à 60fps.
Normal. V-synch activée: 60 fps en général, et sans vsynch: synchro sur la vitesse du proc: jeu en accéléré.
A l’inverse si tu utilises fraps: jeu ralenti car cycles processeurs utilisés ailleurs.
18 juin 2009 à 15:06 Citer
Intéressants l’article, et le blog.
Sinon, je suis lourd, mais, “a goupiller”, c’est moche. :)
18 juin 2009 à 17:39 Citer
@HeLLoWorld
Merci.
Tu dis ca parce que tu n’étais pas encore né au début des années 80.
18 juin 2009 à 21:00 Citer
Je suis né en 81 :)
Sinon, les coms ne sont pas un forum, mais je suis à Rennes, j’ignorais qu’il y avait des boites qui faisaient de la 3D temps réel? J’ai pas d’XP malheureusement, mais ça m’intéresse…
20 juin 2009 à 20:20 Citer
Ah mais il est pas sorti le jeu encore!