IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement 2D, 3D et Jeux Discussion :

Questions sur les shaders et leurs performances


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Questions sur les shaders et leurs performances
    Je développe en ce moment un jeu sur XNA. Je viens de me rendre compte (ou plutot, on m'a fait me rendre compte) d'un soucis de performances, qui vient (peut-être ? en partie ?) des shaders.

    Pour le moment, je suis plus au moment de l'élaboration du moteur que du jeu. Ma boucle de dessin basique se compose donc :

    1. Un pre screen shader qui dessine la skybox en fond.
    2. Dessins du vaisseau principale et de la carte, tous les deux se basant sur du normal mapping en shader 2.0
    3. Un post screen shader de glow

    Le soucis étant que sur mon portable (Centrino 1.86 Ghz, Radeon 9600 donc Shader 2.0), le tout tourne entre 40 et 60, moins si j'active le glow (mais ça c'est bien sûr normal). En plus il y a divers artefacts visuels par ci par là, surtout sur le vaisseau. Pour une scène d'une telle simplicité, celà me fait bien peur (le tout ne doit pas dépasser les 3000 polygones). Ce constat a été vu aussi sur un autre portable : A nouveau un centrino, mais avec une X700 qui ne dépase pas les 100 fps. Par contre, mes deux ordis de bureau, que ce soit mon C2D 1.86Ghz, 7900GTX et mon Athlon 3000+ Radeon 9800 Pro dépassent largement les 400 fps.

    Je suis parti à la recherche pour savoir d'où venait ce soucis, et en fait, je me suis rendu compte qu'en désactivant l'affichage de la carte, tout allait mieux (je passe de 40 à 80 fps, l'affichage de la carte prends donc la moitié du temps de la boucle de dessin classique :s). En fait, plus la carte apparait grosse sur ma carte, plus le jeu lag. en simplifiant le shader de la carte, ça se résout en grande partie (les artefacts du vaisseau comme la chute de fps).

    D'où mes questions :

    -Le fait que le jeu lag selon la taille de la portion visible de l'objet et que des artefacts apparaissent sur d'autres objets affichés pourrait-elle provenir d'un shader mal écrit ?
    - Celà pourrait-il venir d'un problème de mémoire au niveau de la CG ? (ce qui expliquerait pourquoi le soucis des artefacts n'est visible que sur ma radeon 9600 32 Mo et pas sur la X700 64 Mo, ni sur une Radeon 9800 Pro 128 Mo (ni d'ailleurs sur une 7900 GTX))
    -Ou peut-être suis-je tout simplement trop gourmand, et que les cartes graphiques d'il y a quelques temps ne supportaient pas encore d'afficher des grandes zones en normal mapping ?

    En fait, à y réfléchir, ces symptomes pourraient venir de beaucoup d'endroits. Mais avez-vous déjà eu ce type de soucis ?

    Merci déjà pour toutes les réponses

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Toujours personne pour ce soucis ? :'(

    Jusque là, j'avais mis la carte en diffuse mapping pour gagner des fps, mais là dès que j'ai voulu mettre les ombres en place, c'est la catastrophe, 7-8 fps avec le glow activé, 30 sans au grand grand maximum. Y-at'il un moyen de traquer de quelle fonction viendrait cette perte de temps ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Peux-tu montrer un peu les artefacts que tu rencontre ?
    Comment est affiché ton terrain ?
    Quel est le code des shaders ?
    Est-ce que l'on peut voir exactement comment tu affiche tout ça ?

    Sans précisions, on ne peut pas vraiment t'aider.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Oui c'est vrai, j'espérais que ça soit une erreur courante de débutant (ça l'est sûrement cependant )

    Je vous ai fait un petit screen comparatif entre la radeon 9600 et la 7900GTO.

    il se trouve soit
    soit (un peu plus lent, mais plus gros).
    Sur l'image de droite, on voit clairement les "artefacts" sur les pates du mouton, sur les bords de sa cape, ou sur son pelage. Plus tot dans le développement, le mouton n'apparaissait même pas de cette forme là, mais dans une sorte de forme indéterminée proche d'une sphère rouge (dur dur à décrire).

    Le shader le plus simple que j'utilise, surtout pour le terrain pour le moment est donc celui de diffuse mapping. Le code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    string description = "Diffuse mapping shaders";
     
    // Default variables, supported by the engine (may not be used here)
    // If you don't need any global variable, just comment it out, this way
    // the game engine does not have to set it!
    float4x4 viewProj         : ViewProjection;
    float4x4 world            : World;
    float4x4 viewInverse      : ViewInverse;
    float4x4 xLightWorldViewProjection; //for ShadowMapping only
    float3 lightDir : Direction
    <
    	string UIName = "Light Direction";
    	string Object = "DirectionalLight";
    	string Space = "World";
    > = {-0.65f, 0.65f, -0.39f};
     
     
    float xMaxDepth; //for ShadowMapping
     
     
    // Texture and samplers
    texture diffuseTexture : Diffuse
    <
    	string UIName = "Diffuse Texture";
    	string ResourceName = "asteroid4.dds";
    >;
    sampler diffuseTextureSampler = sampler_state
    {
    	Texture = <diffuseTexture>;
    	AddressU  = Wrap;//Clamp;
    	AddressV  = Wrap;//Clamp;
    	AddressW  = Wrap;//Clamp;
    	MinFilter = Linear;
    	MagFilter = Linear;
    	MipFilter = Linear;
    };
     
    texture shadowMapTexture : Diffuse
    <
    	string UIName = "Diffuse Texture";
    	string ResourceName = "asteroid4.dds";
    >;
    sampler shadowMapTextureSampler = sampler_state
    {
    	texture = <shadowMapTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = clamp; AddressV = clamp;
    };
     
    //----------------------------------------------------
     
    // Vertex input structure (used for ALL techniques here!)
    struct VertexInput
    {
    	float4 pos      : POSITION;
    	float2 texCoord : TEXCOORD0;
    	float3 normal   : NORMAL;
    	float3 tangent	: TANGENT;
    };
     
    //----------------------------------------------------
     
     
    //----------------------------------------------------
     
    // vertex shader output structure
    struct VertexOutput_Specular20
    {
    	float4 pos          : POSITION;
    	float4 ShadowMapSamplingPos : TEXCOORD0;
    	float2 TexCoords                 : TEXCOORD2;
    	float4 RealDistance        : TEXCOORD1;
    	float3 Normal            : TEXCOORD3;
    	float3 Position3D            : TEXCOORD4;
    };
     
     
    VertexOutput_Specular20 VS_Specular20(VertexInput In)
    {
    	VertexOutput_Specular20 Out = (VertexOutput_Specular20) 0; 
     
    	Out.pos=mul(mul(In.pos, world), viewProj);
    	Out.TexCoords= In.texCoord;
    	Out.Normal=In.normal;
    	Out.Position3D=mul(In.pos,world);
    	Out.ShadowMapSamplingPos=mul(In.pos,xLightWorldViewProjection);
    	Out.RealDistance=Out.ShadowMapSamplingPos.z/xMaxDepth;
    	return Out;
    } // VS_Specular20(.)
     
    // Pixel shader function
    float4 PS_Specular20(VertexOutput_Specular20 In) : COLOR
    {
     
    	float4 diffuseTexture = tex2D(diffuseTextureSampler, In.TexCoords            );
    	float2 ProjectedTexCoords;
        //PCF Filter
        ProjectedTexCoords[0] = In.ShadowMapSamplingPos.x/In.ShadowMapSamplingPos.w/2.0f +0.5f;
        ProjectedTexCoords[1] = -In.ShadowMapSamplingPos.y/In.ShadowMapSamplingPos.w/2.0f +0.5f;
     
        float2 vTexCoords[9];
         float fTexelSize=1.0f/1600.0f;
       // Generate the tecture co-ordinates for the specified depth-map size
       // 4 3 5
       // 1 0 2
       // 7 6 8
         vTexCoords[0]=ProjectedTexCoords;
         vTexCoords[1]=ProjectedTexCoords+float2(-fTexelSize,0.0f);
         vTexCoords[2]=ProjectedTexCoords+float2(fTexelSize,0.0f);
         vTexCoords[3]=ProjectedTexCoords+float2(0.0f,-fTexelSize);
         vTexCoords[6]=ProjectedTexCoords+float2(0.0f,fTexelSize);
         vTexCoords[4]=ProjectedTexCoords+float2(-fTexelSize,-fTexelSize);
         vTexCoords[5]=ProjectedTexCoords+float2(fTexelSize,-fTexelSize);
         vTexCoords[7]=ProjectedTexCoords+float2(-fTexelSize,fTexelSize);
         vTexCoords[8]=ProjectedTexCoords+float2(fTexelSize,fTexelSize);
     
    	float4 Color=(float4)0.0f;
    	Color.a=1.0f;
    	if ((saturate(ProjectedTexCoords.x) == ProjectedTexCoords.x) && (saturate(ProjectedTexCoords.y) == ProjectedTexCoords.y))
    	{
    		float StoredDepthInShadowMap =0.0f; //tex2D(ShadowMapSampler, ProjectedTexCoords).x;
            StoredDepthInShadowMap+=tex2D(shadowMapTextureSampler, vTexCoords[1]).x;
            for (int i=0; i<9; i++){
     
            float4 colorDistance=tex2D(shadowMapTextureSampler, vTexCoords[i]);
           		StoredDepthInShadowMap+=colorDistance.x+colorDistance.y/256.0f+colorDistance.z/65536.0f;
            }
            StoredDepthInShadowMap/=9.0f;
     
    		if ((In.RealDistance.x) <= StoredDepthInShadowMap||StoredDepthInShadowMap==0.0f)
    		{
                float4 ColorComponent = tex2D(diffuseTextureSampler, In.TexCoords);
                Color=ColorComponent;
    		}
    		else Color=tex2D(diffuseTextureSampler, In.TexCoords)*0.2f;
     
    	}
    	else Color=tex2D(diffuseTextureSampler, In.TexCoords);
     
    	return Color;
    } // PS_Specular20(.)
     
    // Techniques
    technique Specular20
    {
    	pass P0
    	{
    		VertexShader = compile vs_2_0 VS_Specular20();
    		PixelShader  = compile ps_2_0 PS_Specular20();
    	} // pass P0
    } // Specular20
    En virant toute la partie shadowMapping, je monte en fps, mais je doute que ça résolve vraiment le soucis.

    Pour dessiner mes objets, je me base la plupart du temps (c'est le cas ici) sur cette méthode là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public void Render(Matrix renderMatrix)
    		{
    			if (xnaModel == null)
    				return;
     
    			// Apply objectMatrix
    			renderMatrix = objectMatrix * renderMatrix;
     
    			// Go through all meshes in the model
    			foreach (ModelMesh mesh in xnaModel.Meshes)
    			{
    				// Assign world matrix for each used effect
    				BaseGame.WorldMatrix =
    					transforms[mesh.ParentBone.Index] *
    					renderMatrix;
     
    				// And for each effect this mesh uses (usually just 1, multimaterials
    				// are nice in 3ds max, but not efficiently for rendering stuff).
    				foreach (Effect effect in mesh.Effects)
    				{
    					// Set technique (not done automatically by XNA framework).
    					effect.CurrentTechnique = effect.Techniques["Specular20"];
     
    					// Set matrices, we use world, viewProj and viewInverse in
    					// the ParallaxMapping.fx shader
    					effect.Parameters["world"].SetValue(
    						BaseGame.WorldMatrix);
    					// Note: these values should only be set once every frame!
    					// to improve performance again, also we should access them
    					// with EffectParameter and not via name (which is slower)!
    					// For more information see Chapter 6 and 7.
    					effect.Parameters["viewProj"].SetValue(
    						BaseGame.ViewProjectionMatrix);
    					effect.Parameters["viewInverse"].SetValue(
    						BaseGame.InverseViewMatrix);
                        effect.Parameters["ambientColor"].SetValue(Color.White.ToVector4());
    					// Also set light direction (not really used here, but later)
                        effect.Parameters["lightDir"].SetValue(
                            BaseGame.LightDirection);
                        Matrix lightViewProjectionMatrix = Matrix.CreateLookAt(new Vector3(BaseGame.LightPos.X, BaseGame.LightPos.Y, BaseGame.LightPos.Z), Vector3.Zero, Vector3.Up) * Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver2, 640f / 480f, 1f, 10000f);
     
                        if (effect.Parameters["xLightWorldViewProjection"]!=null)
                        effect.Parameters["xLightWorldViewProjection"].SetValue(BaseGame.WorldLightViewProj);
     
                    if (effect.Parameters["shadowMapTexture"] != null)
                        effect.Parameters["shadowMapTexture"].SetValue(Shaders.ShadowMap.shadowMap.XnaTexture);
     
                    if (effect.Parameters["xMaxDepth"] != null)
                        effect.Parameters["xMaxDepth"].SetValue(BaseGame.maximumDepth);
    				} // foreach (effect)
     
    				// Render with help of the XNA ModelMesh Draw method, which just goes
    				// through all mesh parts and renders them (with vertex and index
    				// buffers).
    				mesh.Draw();
    			} // foreach (mesh)
    		} // Render(renderMatrix)
    Mes textes et HUD(hum hum, on ne se moque pas ) sont ajoutés à une classe spécialisée qui dessine tous ces objets à l'aide d'un seul spriteBatch.

    La boucle de dessin principale est :
    On définit le renderTarget sur la texture pour la shadowMap
    On "Clear" ce RenderTarget
    On dessine la shadow map du mouton, puis on récupère la texture de ShadowMap.
    On dessine alors le ciel à l'écran via un pré screen shader
    (Optionnel, on peut mettre en place le glow ici, je l'ai désactivé pour l'instant)
    On dessine le joueur
    On dessine la carte
    On dessine les différents sprites nécessaires (textes etc)
    Fin de la boucle de rendu (sauf si Glow bien sûr).

    Je suis actuellement à la recherche d'un outil permettant de tracer les occupations mémoires du GPU au cours du programme. Je commence tout simplement à me demander si je ne commencerait tout simplement pas à saturer les petits 32 Mo de ram de la 9600 pro. Pix me donne bien une liste de ressources, mais je sais pas si elle correspond à une image précise, où à toutes les ressources utilisées pendant le jeu. Je vais me renseigner sur ce petit logiciel. Pour info, en désactivant le glow, si je fais le total de toutes les ressources indiquées par pix, j'arrive à 31-32 Mo.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bon, pour commencer, tu es en shader 2.0, il n'y a pas de branching... donc tes if ne font pas ce que tu crois... tu as le code des 2 parties de ton if qui est exécuté... tu ne gagne absolument rien avec ça (voir même, tu perd un peu). Si tu peux l'écrire autrement, tu risque de gagner un peu.

    Essaye aussi de déporter au maximum tes calculs dans le vertex shader, tu gagnera.
    Aussi, si tu peux te permettre, fait ton blur dans une passe avant, ça ira peut-être un peu plus vite. (surtout après, quand tu aura plusieurs lumières et plusieurs meshs, autant ne faire le blur qu'une seule fois)

    Personnellement, pour débugger, j'utilise Pix, et c'est a peu près tout (jamais réussi a faire marcher l'outil d'ATI, sinon sur nvidia, tu as NvPerfHud)

    Au niveau de ta quantité de mémoire, Pix est a peu près fiable si je me souvient bien (tu as un graph d'occupation mémoire par frame si je ne me trompe pas), donc, tu rempli un peu ta CG, c'est normal de baisser en performances.

    Compte autrement la taille des tes ressources, à vu d'oeil comme ça, tu devrait pouvoir te faire une idée pour savoir si tu éclate réellement ou pas.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Merci pour ces quelques éclaircissements. Pour le branching dans le PS, je m'étais basé sur les tutorials de Riemers, j'y vouais une confiance certaine. Ce que tu me dis pour le if vaut-il aussi pour les for ? Je suis en train de réfléchir pour déplacer une partie des instructions du pixel shader dans le vertex, mais j'avoue que ça sera sûrement très limité, je ne sais pas si ça changera des masses, surtout que le soucis est apparent sur d'autres shaders qui n'utilisent pas de branching non plus.

    Je me demandes si le problème ne vient pas d'ailleurs, parce que tout de même, une X700 (portable d'un amis qui tourne lui aussi à 30fps), ça ne casse pas des briques, mais ça devrait être capable d'afficher moins d'une centaine de polygones en plein écran avec du normal mapping sans que ça rame non ? :O Surtout que Nitschke, l'auteur de "mon" shader de normal, et de la base du moteur que j'utilises dessine tous ses objets par là, voir via un shader de parralax mapping, avec notamment une montagne bien mieux fournie niveau polygones, et occupant parfois tout l'écran. Bien sûr, ça tourne relativement bien sur mon portable, en tout cas mieux que mon "jeu"...

    Pour pix, j'avoue que je débute tout juste, mais il m'a déjà permis de gagner quelques Mo de place sur la carte graphique(passage de la skybox en DXT1, et de la shadowmap en RF32). aucun changement n'est visible cependant au niveau du framerate. Et je n'arrive pas à avoir les jolies graphes GPU que l'on observe sur certains sites qui parlent de Pix, notamment les tutoriaux de Microsoft... J'avais vu bien sûr PerfHUD, mais je n'arrives pas à l'interfacer avec XNA.

    Enfin pour le blur là je sèches, je vois pas comment je pourrais le faire avant :o il faut bien que je rendes la scène une fois dans son intégralité pour effectuer le blur (surtout que c'est la dernière passe de l'affichage, vu que c'est un post screen shader). De toute façon, il est désactivé pour le moment, (et je pense qu'il ne sera jamais activé sur ma radeon 9600 )

    Là, je cale vraiment, je ne sais pas si ce dont je parle est un véritable problème (mais je ne verrais pas d'où il pourrait venir, peut-être d'un renderstate mal choisi, peut-être de la mémoire, peut-être du mauvais temps, ou d'un soucis à la création de la fenêtre...) ou juste que j'en demandes trop à la CG (mais ça j'en doute très fortement tout de même :O )

    En tout cas, merci pour l'aide

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Alors effectivement, en commentant les if, je passe de 30 à 50-60 fps. En écrivant le shader sans aucun if (mais en les remplaçant par une fonction mathématique maison), je monte à 45fps. C'est mieux, mais pas top je trouves vu ce que j'affiche ! Ca doit être un bug qui ne dépend pas des shaders je pense,ou pas directemnt du code des shaders proprement dit, mais peut-être de l'appel des shaders ou de je ne sais pas quoi :'(

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Je deviens de plus en plus fou. J'ai pu faire des tests sur d'autres machines, et les fps ne concordent pas du tout avec la puissance que ces machines ont... Un petit extrait :

    Portable 1, Centrino 1.86Ghz, Radeon 9600 32Mo, 756Mo de ram sous XP pro: 45fps
    Portable 2, Intel Core Duo 2Ghz, 7600GT 256 Mo, 2Go de ram sous Vista: 55fps
    Portable 3, processeur inconnu, X700 128 Mo, 1 Go de ram sous XP pro: 50 fps

    Tour 1, Core 2 Duo, 7900GTO 512 Mo, 2G de ram, XP Pro: 180 fps
    et surtout, le test qui va m'empêcher de dormir ce soir :
    Tour 2, Sempron 3000+, 6600 GT 256 Mo, XP Pro: 160 fps...

    Pourquoi une tour vraiment moins puissante tourne beaucoup mieux qu'un portable ? Ce qui limite les fps ne vient apparemment pas du processeur (fps du sempron > fps du Core Duo), ni de la carte graph (6600>7600), ni de la ram, ni de la ram du GPU... Je ne lis rien sur le disque dur non plus. Tous les drivers sont à jour bien sûr.

    Ah et encore autre chose complètement fou : Si je passe le jeu en plein écran (sans modifier la résolution), les fps du portable 1 passent de 45 à 60, ceux du portable 2 de 55 à 130...

    Peut-être tout simplement que ça ne vient pas de la partie graphique sinon..

    Pfff je patauge dans la semoule :'(

  9. #9
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    Le nombre des FPS ne dit absolument rien sur la puissance d'une machine, puis il y a de nombreux facteurs qui peuvent faire varier ce chiffre:
    - activité du disque,
    - état du disque (s'il est fragmenté ou pas),
    - état de la RAM (qui peut être fragmentée aussi),
    - activité des autres applications et serveurs lors de l'execution,
    etc, il y en bien trop plein.

    Puis bon, il se peut bien que le driver de la carte graphique du portable limite l'activité du chip pour le protéger contre la chaleur (ce qui sera moins le cas sur un pc non-portable).

    Ah oui, si le VSync est activé (pour un écran TFT par exemple), cela limitera les FPS à la vitesse d'affichage, soit 60 fps.

    Puis bon, tu t'occuppes pour peux, du moment que tu as plus de 30 frames/seconde, ca suffit pour avoir un rendu fluide. (Ton oeil limitera simplement le nombre visible d'images à 24 images/seconde).

    EDIT: J'ajoute, (je sais pas si c'est valable pour HLSL, mais pour GLSL ca l'est), ton shader peut avoir été traduit de facon différente (et donc plus ou moins optimisé) selon la carte et le driver, voire même selon la version de DirectX installée.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Pour ce qui est du disque, on ne faisait pas de lecture sur le disque, hormis au tout début du jeu, et vu le peu de mémoire que prends mon jeu pour le moment, il n'y avait pas non plus d'acès swap.

    La Vsync a bien sûr été désactivée.

    En fait, je crois que je vais mettre ce topic en résolu finalement. J'avoue avoir écrit un peu plus tard sur gamedev.net pour demander de l'aide, et un de ses membres a pointé le soucis avec justesse. C'est tout bête, mais les GPU portables sont tout simplement beaucoup moins puissants que ceux de machines de bureau. Je ne pensais pas à ce point cependant. Effectivement, si l'on regarde les performances pures d'une 7600Go, ils dépassent à peine celles d'une 6600GT de bureau. Ensuite, et surtout, le nombre de vertex pipeline et pixel pipeline reste très limité (5/8 je crois sur la 7600Go) ce qui limite énormément les performances si tout l'affichage se base sur des shaders un peu compliqué. Il m'a alors orienté vers un document en ligne très intéressant que chacun se devrait de lire je pense. Il s'agit de "GPU Programming Guide" sur le site de nvidia ici , qui est en fait un condensé de conseils pour optimiser les shaders. Ils y donnent aussi une méthode simple pour déterminer d'où vient l'engorgement. Dans un des paragraphes de ce livre, j'ai lu que si l'on utilisait des pixels shaders de plus de 20 cycles et que ceux ci utilisaient plus du quart de l'écran, on pouvait (selon la résolution) s'attendre à ce que les pixels shaders soient l'élément limiteurs des performances du programme.

    Résultat, en effectuant beaucoup de petites améliorations (passe des float en half pour tout ce qui est couleur par exemple, balancement pixel shader/vertex shader...), je suis passé sur la radeon 9600 de 45fps à 90fps (et au passage, mon pixel shader est passé de 28 instructions lorsqu'il était assemblé, à 11...).

    En tout cas, c'est une chose à savoir pour ceux utilisant XNA qui se base uniquement sur les shaders !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2008, 18h02
  2. Réponses: 9
    Dernier message: 17/03/2007, 05h49
  3. [C#] Questions sur les webmethodes et leur utilisation
    Par NoiBe dans le forum Services Web
    Réponses: 10
    Dernier message: 14/12/2006, 08h40
  4. Quelques questions sur les shaders
    Par Yno dans le forum OpenGL
    Réponses: 2
    Dernier message: 04/12/2006, 15h44
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo