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

标签 c# multithreading xna

我有一个 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/

相关文章:

c# - 访问从属性自动生成的值类型

C# excel 插件 - 访问控件

Ruby:使用 join 和 ThreadsWait.all_waits 等待所有线程完成 - 有什么区别?

c# - 在 XNA 4.0 中绘制多边纹理立方体

C# SHA256Managed 如何计算空字节[]的哈希值

c# - 上传文件 winForms C#

python - 在函数中执行循环多处理的最快方法?

c++ - 重用线程 - C++

c# - Xamarin Studio 上的 MonoGame - Xna 存在问题?

c# - 将 2D 仿射变换矩阵转换为 3D 仿射变换矩阵