为什么我的Draw()和Update()方法没有被调用?

时间:2015-07-27 18:11:59

标签: c# multithreading xna

我有一个永远不会调用Draw()的XNA应用程序(并且update()永远不会被调用一次)。它是多线程。特别是,它拥有一组对象,每个对象都调用自己的绘制函数。

绘图功能如下所示:

    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

    foreach (Interaction<InteractionState> interaction in interactions){
        interaction.display(spriteBatch); //this calls the SpriteBatch Draw function
    }

    spriteBatch.End();

交互是由自定义输入设备更新的对象,该设备在单独的线程上运行。

当我只有一个或两个这样的交互时,事情运行得相当快,但当我开始放3个或更多时,绘图停止。由于它适用于两个交互,我确信问题不是冗余内容加载调用或调用spritebatch.begin / end两次的错误。

我最好的猜测是,现在,增加我的输入源会增加该线程的计算负荷,直到它永远不会有机会调用Draw。如何强制游戏绘制并优先于其他线程?我试过设定费率

this.TargetElapsedTime = TimeSpan.FromSeconds(1.0f / 10.0f);

并且没有不活动:

this.InactiveSleepTime = TimeSpan.Zero;

两者都在Initialize(),但都没有做过。

编辑:人们似乎很困惑(我可能没说好),但是,我只是想在主线程中画画。我不是想在后台线程中做任何绘图。主要的绘制方法永远不会被调用。

编辑2 :我还可以说,如果我让我的后台线程一次睡眠150毫秒,那么系统就会开始绘制。虽然这对于我的目的来说太低了帧率。

1 个答案:

答案 0 :(得分:1)

SpriteBatch.End实际上称之为draw。其他所有内容只是将内容推送到要呈现的队列(IIRC)。我猜想发生的事情是你没有在你的线程之间使用线程安全的数据结构。我知道你只是在一个线程上调用SpriteBatch.End而没有其他线程有SpriteBatch但是如果你在{{1}更新另一个线程上的Sprite的位置正在执行,你可能会使渲染调用无效。您是否在Visual Studio中检查了输出窗口?它可能会提供一些详细的调试信息。通常使用线程,当我所描述的事件发生时,你会抛出End之类的东西。也许你的系统正在吃异常?我不知道。我想说我们需要查看在这些其他线程上执行的代码,以便更好地识别可能导致问题的原因。