【问题标题】:Pixel Shader with multiple textures − How to get better performance?具有多个纹理的像素着色器 - 如何获得更好的性能?
【发布时间】:2023-07-07 18:08:02
【问题描述】:

我实际上是在使用 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 传递纹理有什么区别?

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

非常感谢!

【问题讨论】:

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

标签: c# performance xna hlsl


【解决方案1】:

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

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

我是否可以建议使用某种着色器,例如来自 http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html 的 uvDetective 来找出您的纹理真正需要的尺寸。我怀疑你把所有可能的旋钮都调到了 11。不要那样做。这是一个游戏。

【讨论】:

    最近更新 更多