C# 具有多个纹理的像素着色器−;如何获得更好的性能?

C# 具有多个纹理的像素着色器−;如何获得更好的性能?,c#,performance,xna,hlsl,C#,Performance,Xna,Hlsl,我实际上在用C#和xna制作一个小3D游戏。由于一些事情变得相当缓慢,我开始优化这些事情 我有一个使用多个纹理/采样器的像素着色器: texture MountainTexture; texture GrassTexture; texture IceTexture; texture SandTexture; sampler moutain = sampler_state { texture = (MountainTexture); MinFilter = Linear; Mag

我实际上在用C#和xna制作一个小3D游戏。由于一些事情变得相当缓慢,我开始优化这些事情

我有一个使用多个纹理/采样器的像素着色器:

texture MountainTexture;
texture GrassTexture;
texture IceTexture;
texture SandTexture;
sampler moutain = sampler_state {
   texture = (MountainTexture);
   MinFilter = Linear;
   MagFilter = Linear;
   MipFilter = Linear;
   AddressU = Wrap;
   AddressV = Wrap;
};
sampler ice = sampler_state {
   texture = (IceTexture);
   ...
};
sampler grass = sampler_state {
   texture = (GrassTexture);
   ...
};
sampler sand = sampler_state {
   texture = (SandTexture);
   ...
};
像素着色器函数对渲染的每个像素使用一个或两个采样器。我注意到,当我让着色器对每个像素只使用其中一个采样器时,帧速率提高了~x2因子

所以我想知道: -当我在同一个着色器中的多个采样器上使用tex2D时,GPU到底做了什么?为什么这么慢? -使用
Shader.Parameters[“myTexture”].SetValue(myTexture)
传递纹理和
GraphicsDevices.Texture[10]=myTexture
之间有什么区别

在使用具有多个采样器的着色器时,是否有方法提高性能?(我的纹理太大,无法将它们全部放在一个纹理中)

多谢各位

(我的纹理太大,无法将它们全部放在一个纹理中)

我想说你发现了你的问题。巨大的纹理


我可以建议使用某种着色器,比如uvDetective from,以确定纹理真正需要的大小。我怀疑你把所有可能的旋钮都调到了11。不要那样做。这是一个游戏。

在其他人用“”出现之前,我要做的是。我的场景以每秒30帧的速度运行,这真的很糟糕。我还没有把我想放的都放进去。所以我想我现在真的需要优化:)60->30fps听起来像是vsync开启了。你在关闭vsync的情况下试过了吗?(这当然不能解决问题,但可能会提供一个更有用的基准)我已经禁用了vsync。这确实是一个~x2因子。:)我认为这与耗时的状态更改有关,但我想了解它到底是如何工作的,以及何时发生状态更改。我搜索了很多,但没有找到任何有用的东西…你的纹理有mipmap吗?这通常会以相当好的因数加快采样速度。