【发布时间】: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