在XNA中设置效果参数的最佳做法


13

我想问一下是否有Effect在XNA中设置参数的最佳实践。换句话说,当我打电话时到底发生了什么pass.Apply()。我可以想象多种情况:

  1. 每次Apply调用时,所有效果参数都会传送到GPU,因此我对参数的设置频率没有真正的影响。
  2. 每次Apply调用时,仅传输已重置的参数。因此,应避免缓存实际上未设置新值的Set-operations。
  3. 每次Apply调用时,仅传送更改的参数。因此,缓存Set-operations是没有用的。
  4. 这整个问题是没有根源的,因为没有一种提及的方式会对游戏性能产生任何显着影响。

因此,最后一个问题是:实现set操作的某些缓存是否有用,例如:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

感谢你在期待。


我添加了DirectX标记,因为它是比XNA更低级别的功能。
安德鲁·罗素

我发现有证据表明这个话题非常可行。如果您聪明地设置效果参数,则可以将绘制调用的数量(即在CPU上处理它们的速度)增加两倍以上。:我仍然在测试这个过程中,你可以在这里阅读我的问题 gamedev.stackexchange.com/questions/66932/...
cubrman

Answers:


8

这一切都发生在CPU端,因此,如果缓存是一项有用的功能,那么我推测图形驱动程序将自己实现它。不需要添加自己的缓存层。

我的理解是,无论何时设置参数,以及何时调用Apply,这些调用都会照原样传递给DirectX,然后照原样传递给用户模式GPU驱动程序。然后,用户模式驱动程序可以执行所需的任何操作。您的所有三种情况都是可能的。

(因为场景#2是可能的,所以最好不要绕过故意重新设置不变的参数。)

老实说,我不太确定典型的驾驶员会做什么。主要是因为它从未真正成为一个问题。我从未听说过有人将效果参数设置作为瓶颈。理论上可能是这样。但是还有很多其他共同的事情要担心

当然,在不衡量性能并了解正在发生的情况之前,不要开始执行这样的优化。

另外,将Matrix与进行比较==是不好的伏都教。A Matrixfloats组成,并且浮点相等比较在许多情况下容易失败。

而且,通常来说,这种模式if(x != y) x = y;比简单模式要慢x = y


驾驶员应对此感兴趣的一点。感谢您的链接(和重新链接)。
0xBADF00D 2012年

我最近遇到了msdn中的几何实例化示例。每帧多次重置相同的渲染状态(具有相同的值)会大大降低渲染过程两倍或三倍。因此,状态批处理绝对有用。不幸的是,我不确定这种情况是否也适用于设置效果参数。但我想分享我的信息。
0xBADF00D 2012年

4

我发现有关此主题的一件有趣的事情。

来自msdn:

您可以使用效果上的“参数”索引属性访问任何效果参数,但这比使用“效果参数”慢。因此,您应该为经常更改的每个效果参数创建一个EffectParameter。

为Effect中的每种技术创建和分配EffectParameter实例的速度明显快于使用Effect上的Parameters索引属性。

这意味着_effect.Parameters["xWorld"].SetValue(value);明显慢于wordlParam.SetValue(value);

因此,您应该缓存这样的参数:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

但是我还没有找到任何实际的基准。

资料来源:

http://msdn.microsoft.com/zh-CN/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/zh-CN/library /bb976060%28v=xnagamestudio.31%29.aspx


刚刚在Monogame和WP仿真器上进行了测试-我可以确认确实存在显着差异(在我的情况下为5-15%)。还有其他有助于提高性能的技巧吗?
康拉德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.