在一个批次中绘制所有DrawableGameComponents

时间:2010-12-28 00:57:32

标签: c# xna sprite draw drawablegamecomponent

这是一个XNA问题......

我的游戏中有大量的DrawableGameComponents对象,它们都共享相同的SpriteBatch。但是,我每次都要调用SpriteBatch.Begin()和.End()来绘制每个组件。我想在一个批处理中绘制所有内容以获得更好的性能,但我不知道.Begin()和.End()可以去哪里,因为.Draw()被自动调用(因为它们是DrawableGameComponents)

是否有人知道我可以做些什么来使它们在单个.Begin()和.End()调用之间被绘制,同时将它们保持为DrawableGameComponents?

编辑:

好的,从这个网站http://www.progware.org/Blog/post/XNA-Game-Development-(Decentralize).aspx我发现它在主游戏循环的base.Draw()调用中被调用...所以我可以用Begin和End方法包装它

protected override void Draw(GameTime gameTime) {
    if (Cell.Cell.CellSpriteBatch != null) {
        Cell.Cell.CellSpriteBatch.Begin(
            SpriteSortMode.BackToFront, BlendState.AlphaBlend, 
            SamplerState.AnisotropicClamp, null, null, null,
            gamePlay.Camera.GetTransformation()
        );
    }

    base.Draw(gameTime);

    if (Cell.Cell.CellSpriteBatch != null) {
        Cell.Cell.CellSpriteBatch.End();
    }
}

并且现在可以正常工作但是这样做似乎意味着我想要在不同的SpriteBatch中绘制的所有其他内容将始终在此下面绘制(因为它们是先绘制的),因为此SpriteBatch的.End()总是将被称为最后一次。

对此有任何解决方案吗?

1 个答案:

答案 0 :(得分:0)

首先,除非你已经知道你是批量限制的,否则它可能不值得这样做。如果每个.Draw调用都来自相同的纹理,那么你可能会看到一些加速。如果它们是不同的纹理,那么切换到单个Begin / End将没有区别。无论如何,SpriteBatch都会破坏您的绘制调用。

正如您所发现的那样,这会让您的代码变得非常混乱 - 您必须在组件之间进行跟踪。

当前问题的唯一解决方案是使SpriteBatch立即生成,以便在调用绘制调用时绘制,而不是在End调用时绘制。但是,由于根本没有完成批处理,这会终止你的性能。

就个人而言,我会坚持每个组件的开始/结束,直到你遇到一个性能问题。假设您没有5000个组件,在这种情况下,您可能需要对事物进行一些不同的构建。