【发布时间】:2012-11-29 03:11:49
【问题描述】:
所以我正在使用 XNA 3.1 制作一个东西,并且我有很多通过像素着色器应用的单独效果。这些来自各种来源,例如特殊攻击,环境等。我遇到的问题是我注意到帧速率显着降低。
目前,我正在将整个场景绘制到 RenderTarget2D,然后将所有效果应用到该 RenderTarget2D。我存储了一个包含效果及其 ID 的 SortedDictionary(ID 用于在运行时更改参数),并且我正在对其进行迭代并一个接一个地应用每个效果:
foreach(KeyValuePair<Ref<int>,Effect> p in renderEffects)
{
Effect r = p.Value;
g.SetRenderTarget(0, MainGame.MainRenderTarget);
//Change RenderTarget to allow code to grab existing texture in the same draw area.
levelDraw = MainGame.LevelRenderTarget.GetTexture();
//Change back to draw back to this texture, allowing render effects to be layered.
g.SetRenderTarget(0, MainGame.LevelRenderTarget);
MainGame.StartDraw(MainGame.GameBatch);
//Starts the sprite batch and sets some parameters
r.Begin();
r.CurrentTechnique.Passes[0].Begin();
MainGame.GameBatch.Draw(levelDraw, new Rectangle(0, 0, levelDraw.Width, levelDraw.Height), Color.White);
r.CurrentTechnique.Passes[0].End();
r.End();
MainGame.GameBatch.End();
}
现在,当仅分层 3 个效果时,这会产生明显的帧丢失,而当应用 10 个效果时,它会从 60FPS 下降到 16FPS,这当然是不可接受的。我想知道是否有更有效的方法来做到这一点。考虑到我只有一个纹理,我认为我可以将效果组合到一个文件中并执行多个通道,而无需重新抓取纹理。不过,我不确定这是否可能。
我不太确定最好的方法是什么,但我想肯定有比我现在的方法更好的方法。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
谢谢。我倾向于将它们包括在内,以便人们一眼就知道他们是否可以提供帮助,而不必查看标签,但我可以看到在那里不使用它们的逻辑。
-
标签包含一种比看乱码标题更好的机制。您可以设置“最喜欢的标签”,这将使带有这些标签的消息突出显示;和“忽略标签”,这将导致带有这些标签的消息被隐藏。
-
如果你能找出哪些阶段最慢,那就太好了——应用每个效果,切换效果,或者介于这些动作之间的东西。或者可能只是您使用的是全高清分辨率,所以它自然很慢。
-
我做了一些测试。应用着色器本身会将速率从 60 降低到大约 50 或 40。交换 RenderTarget,从中获取纹理,然后将其交换回来完成剩下的工作。
标签: c# xna effect pixel-shader xna-3.0