Annonce

Réduire
Aucune annonce.

[Guide] Performances, USER.cgf et problèmes de netcode

Réduire
X
Réduire

  • [Guide] Performances, USER.cgf et problèmes de netcode

    Salut les scorpions,

    SC est un jeu qui est relativement gourmand en ressources, surtout étant donné que le jeu n'est pas encore optimisé.
    Pour preuve, voici le type de charge que j'ai quand je joue sur Port Olisar avec des paramètres par défaut: des framerates pourris, mais un seul cœur CPU à 100% et le GPU qui tourne à motié.

    Cliquez sur l'image pour la voir en taille réelle 

Nom : 		loaduniverse.jpg 
Affichages :	509 
Taille :		259,7 Ko 
ID : 			59013


    Alors qu'est-ce qui bloque?
    J'ai fait quelques recherches pour comprendre et trouver des solutions.

    Déjà, si vous êtes sur windows 10 vous êtes probablement limité à 30 fps maximum. C'est pour cette raison que ma carte graphique ne tourne à moitié dans le cas ci-dessus. Le Vsync déconne avec windows 10 sous le jeu et bloque à 30 fps au lieu des 60 habituels.
    En jeu, si j'ouvre la console et que je tappe r_VSync = 0, mes framerates peuvent alors dépasser les 30.

    Ensuite sachez que SC est très CPU-bound, c'est à dire que le point bloquant les framerates est en général la vitesse du processeur. Comme on le voit ci-dessus la charge est mal répartie sur les cœurs, un coeur tourne a fond, et les autres tourne à 30%.

    Il y a également plusieurs témoignages qui montrent que désactiver l'hyper-threading permet parfois de gagner jusqu'à 10 fps pour des raisons qui nous échappent. (chez moi ça ne marche pas malheureusement)

    Finalement on note que si diverses bidouilles permettent de faire monter les framerates dans AC et dans le hangar, ceux-ci restent toujours bas dans le module "universe": la faute au netcode du jeu qui a plusieurs problèmes, j'y reviens en fin de post.



    Que faire pour améliorer ses framerates?

    Sachez que vous pouvez modifier le fichier USER.cfg qui se trouve dans Programmes/Cloud Imperium Games/Star Citizen/Public/ (ou en créer un si il n'existe pas).
    Dans ce fichier vous pouvez entrer des commandes pour établir des paramètres personnalisés, c'est comme si vous entriez des commandes dans la console à la main, sauf que la ça se fait automatiquement au lancement du jeu. Ces commandes sont issues du moteur CryEngine qu'utilise le jeu.

    Voici une liste de lignes à y mettre qui sont recommandés pour la plupart des gens (avec mes commentaires en orange, commentaire qu'il ne faut pas écrire dans le fichier bien sûr):
    Con_Restricted = 0 (débloque la console, et permet aux autres lignes d'être utilisées... obligatoire en première ligne donc, sinon le reste ne sert à rien.)
    r_VSync = 0 (désactive le Vsync, particulièrement conseillé sous windows 10...)
    r_MotionBlur = 0 (désactive un effet de flou, les devs de SC adore le flou, mais on y voit rien avec tout leurs flous, en plus ça consomme des ressources et ça pourri les Screenshots)
    r_ShadowBlur = 0 (désactive un autre effet de flou)
    g_radialBlur = 0 (désactive un autre effet de flou)
    r_DepthOfField = 0 (désactive un autre effet de flou)
    r_HDRBrightLevel = 0 (désactive un effet de lumière)
    r_HDRBloomRatio = 0 (désactive un autre effet de lumière)
    hud_bobHud = 0 (désactive le mouvement de HUD lorsque vous marchez/courrez)
    r_SilhouettePOM = 0 (Une amélioration de la qualité visuelle sur certain objet, 0 le désactive ce qui permet de gagner un peut en ressources mais peu aussi causer des bugs graphiques mineures)
    r_ColorGrading = 1 (un effet de gradient des couleurs, 0 pour plus de framerate, 1 pour un jeu plus joli)

    i_Mouse_Accel = 0.0 (pour être sûr qu'il n'y ai pas de modifications faites sur l’interprétation des mouvements de souris)
    i_Mouse_Smooth = 0.0 (pour être sûr qu'il n'y ai pas de modifications faites sur l’interprétation des mouvements de souris)

    autres commandes utiles:
    sys_spec = 4 (cela correspond au choix de qualité globale dans le menu du jeu low, medium, high et very high. 4 correspond à very high. Cela doit être au début juste àprès le Con_Restricted, pour que les paramètres cachés dans celui-ci soit écrasé ensuite.)
    sys_maxfps = 60 (un limiteur de framerate, moi qui enlève le Vsync foireux sous windows10, je met cela à la place à 60fps max)
    r_TexturesStreamPoolSize = 512 (si votre carte graphique à 2Go de ram ou moins mettre 256, 3Go->512, 4Go->1024, 6Go->1024, et plus que 6Go -> 2048.)
    e_ShadowsPoolSize = 256 (mettre la moitié de la ligne précendente)
    e_ShadowsMaxTexRes = 128 (qualité de texture des ombres à choisir: 128, 256, 512 .... etc jusqu'à 4096. 512 est par défaut)
    e_ShadowsReScale = 10 (un autre parametres de qualité des ombres, de 0.1 à 100, 0.1 étant la mauvaise qualité peu gourmande en ressources)
    r_AntialiasingMode = 1 ( 0 = pas d'antialiasing, 1 = un peu d'antialiasing, 2 = plus d'antialiasing, 3 = SMAA mais peut faire du flickering)
    r_DeferredShadingFilterGBuffer = 1 (ajouter cette ligne uniquement si la précédente n'est pas à 0)
    r_TexMaxAnisotropy = 16 (filtre anisotropic maximum pour rendre les textures plus jolies, de 0 à 16, le 0 étant le plus moche et le moins couteux, mais en fait même à 16 ça ne coute pas grand chose.)
    r_TexMinAnisotropy = 16 (idem pour la valeur minimum)
    r_Sharpening = 0.6 (effet visuel, recommandé entre 0.6 et 1 pour les resolution de 1440p ou supérieur, sinon entre 0 et 0.6. Le défaut est à 0.25, et c'est surtout une histoire de goût.)
    r_ssdo = 2 (paramètre d'occlusion: 0 1 ou 2, 2 étant la meilleure qualité et la plus couteuse en ressources.)
    r_ssao = 0 (à mettre à 0 pour utiliser le SSDO à la place du SSAO, car le SSDO est meilleur.)
    r_FullscreenWindow = 1 (mettre à 1 pour etre en windowed fullscreen mode)
    r_Fullscreen = 0 (et du coup mettre à 0 pour enmpecher le mode fullscreen normal)
    r_width = 2560 (pour mettre une résolution personnalisée, avec la bonne résolution le windowed fullscreen n'aura pas de bords)
    r_height = 1440 (idem...)
    r_SSReflections = 0 (qualité des réflections, 0 pour de meilleurs framerate, 1 pour un compromis, 2 pour de la qualité visuelle)

    concernant le CPU:
    r_MultiThreaded = 0 (1 pour utiliser l'hyperthreading, 0 pour le désactiver)

    concernant le multi-GPU:
    r_MultiGPU = 0 (1 pour utiliser plusieurs carte graphique, en SLI ou crossfire. pas super recommandé pour le moment)
    sys_physics_GPU = 0 (determine quel carte graphique fait les calculs de physique si vous en avait plusieur, recommandé à 1 si vous avez deux cartes graphiques)

    des commandes pour gérer la charge sur le CPU: ces commandes ne sont pas vraiment conseillées car elles ont tendance à faire des bugs ou des crashs:
    ai_NavigationSystemMT = 1 (autorise la mise à jour des information de navigation sur un thread séparé du CPU)
    e_ParticlesThread = 1 ( autorise le threading pour les particules)
    e_StatObjMergeUseThread = 1 (utiliser un thread séparé pour la fusion des maillages d'objets)
    gfx_loadtimethread = 1 (autorise le threading pour le rendu en chargement)
    p_num_threads = 1 (quantité de thread utilisé pour la physique)
    sys_job_system_enable = 0 (mettre à 1 pour permettre aux jobs de changer de thread)
    sys_main_CPU = 0 (choisir sur quel thread les calculs d'index principaux sont fait)
    sys_physics_CPU = 2 (choisir sur quel thread les calculs de physique sont fait)
    sys_streaming_CPU = 4 (choisir sur quel thread les calculs de streaming sont fait)

    Voilà, là je crois que vous êtes armer pour faire des tests et essayer d'améliorer vos framerates. En me faisant mon petit USER.cfg sur mesure j'ai réussi a grater 6-7 fps sans baisser en qualité dans le hangar et dans AC et ma carte graphique tourne a 99% au lieu de 50%.

    NB: le fichier USER.cfg ne devrait pas être utiliser sur le PTU. Sur le PTU il vaut mieux tester avec les paramétrages par défaut, histoire de ne pas rapporter avoir des bugs qui sont en fait causés par vos bidouilles


    J'ai beau faire dans "universe" les framerates restent inférieurs à 30. Et oui, c'est à cause du netcode.
    Il existe plusieurs problèmes dans le traitement des informations qui passe entre le serveur de CIG et nos logiciels clients. Voici une petite liste:

    - calculs de physique trop lourds, ce qui crée les problèmes de désynchronisation (l'ensemble des déplacements d'objets, de vaisseaux, de projectiles, est calculé par le serveur, mais le moteur de cryengine n'a pas été fait pour la quantité d'objets présent dans l'universe). John Pritchett est à la tête de la ré-écriture du moteur physique pour améliorer les performances de ce coté.
    - calculs d'AI trop lourds. Un peu comme pour le moteur physique mais pour les AI. De même ils sont en train de tout refaire au niveau des AIs, donc on verra quand les nouvelles AI à subsumption qui ont été promises arriveront.
    - Spawn de vaisseaux coté serveur. Quand un joueur demande un vaisseau, le serveur crée ce vaisseaux, puis envoie les informations à tout les clients, où qu'il soient dans la partie. Quand on fait spawn un retaliateur, le serveur va balancer 5 Mo d'info à tout les gens connecté au serveur, et ça fait des freezes... CIG prévoit de changer cela de manière a créer des codes indiquant ce qu'il faut faire spawn, puis c'est le client qui interpréta ce code et fera spawner le vaisseau correspondant au code. Au lieu d'envoyer 5 Mo le serveur enverra 1 ko, et le client fera le travail qui était contenu dans les 5Mo résultant.
    - Toutes mise à jour est envoyer a tous les clients. Si le joueur A va de kareah vers covalex, le client du joueur B qui est à port Olisar en recevra l'information, alors même que c'est completement en dehors de son champs de vision. CIG travaille à mettre en place un système qui sera sûrement un système de zones de manière à ne pas envoyer/recevoir trop d'informations inutiles.
    - chaque mise à jour est envoyée dans son propre paquet. Vous êtes dans un M50 est vous bougez du point A vers B. Le serveur va traiter l'information que le chassis du M50 bouge de A vers B dans un paquet, mais aussi que l'arme sous l'aile gauche bouge de A vers B dans un autre paquet, que le moteur du vaisseau bouge de A vers B dans un troisième paquet, et ainsi de suite pour tous les composants du vaisseau. C'est une multitude de petites infos qui sont envoyées et traitées. Cig veut mettre en place un systeme ou les informations peuvent être regrouper de manière inteligente dans les paquets pour qu'il y ai moins de paquet à traiter. On aurait alors : M50+gun+moteur+chaqueComposantduM50 bouge de A vers B dans un seul gros paquet.
    - Les identifiants des objets traités par le reseau cause des problèmes depuis qu'on a ajouté la persistance. Le système réseau s'attend à avoir un ID unique pour un objet. Hors la persistance implique de réutiliser des objets et donc leur ID, et le réseau n'aime pas cela.

    Tout cela fait que même si vous aviez des ressources infinis en CPU et GPU, vous auriez des problèmes car les informations venant du serveur ne serait pas mise à jour assez vite. La bonne nouvelle c'est que le netcode est en train d'être ré-écris et que cela devrait aller mieux à partir de la 3.0.

    sources / liens utiles pour plus de détails (en anglais)
    http://www.redacted.tv/custom-user-c...zen-alpha-2-x/
    https://forums.robertsspaceindustrie...performance/p1
    https://forums.robertsspaceindustrie...ussion/335037/
Chargement...
X