我有一个 XNA 应用程序,它永远不会调用 Draw()
(并且 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毫秒,那么系统就会开始绘图。但对于我的目的来说,这个帧速率太低了。
最佳答案
SpriteBatch.End
是实际调用绘制的内容。其他一切只是将内容推送到要渲染的队列中(IIRC)。我猜正在发生的事情是您没有在线程之间使用线程安全的数据结构。我知道您仅在单个线程上调用 SpriteBatch.End
,并且其他线程没有 SpriteBatch
但如果您要更新 Sprite 的位置
在另一个线程上执行 End
时,您可能会使渲染调用无效。您检查过 Visual Studio 中的输出窗口吗?它可能会提供一些详细的调试信息。通常,使用线程,当我所描述的情况发生时,您会抛出类似 AccessViolationException
的情况。也许你的系统只是吃掉了异常?我不知道。我想说,我们需要查看这些其他线程上正在执行哪些代码,以便更好地识别可能导致问题的原因。
关于c# - 为什么我的 Draw() 和 Update() 方法没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660291/