如何将 UI 与 C# 中的渲染分开?

Posted

技术标签:

【中文标题】如何将 UI 与 C# 中的渲染分开?【英文标题】:How do I separate UI from rendering in C#? 【发布时间】:2014-03-15 16:59:35 【问题描述】:

我正在尝试用 C# 编写游戏循环,但我无法从另一个线程访问 WPF 对象...

基本上这就是我想要的循环:

循环:

读取输入 更新游戏状态 渲染到缓冲区 发送缓冲区到显卡 在屏幕上显示渲染图像 重复。

最好的方法是什么? 我可以用Dispatcher.Invoke 做到这一点,但我不认为Dispatcher.Invoke 是为普通的UI 设计的。

【问题讨论】:

我的问题是,你为什么要用 wpf 写游戏?如果这是一个简单的低保真图形事务,那么就足够公平了,但是已经有诸如 XNA 之类的框架提供了诸如基本游戏循环、内容管道、渲染服务等服务。另一个不错的游戏开发平台是 Unity @Charleh 我想用 C# 编写一个 RayTracer,我只需要 setpixel(x, y, color),XNA 似乎有点矫枉过正。我想要一个简单、简约的循环。 【参考方案1】:

我可以用 Dispatcher.Invoke 做到这一点,但我不认为 Dispatcher.Invoke 是为 普通的 UI 东西。

讽刺的问题 - 你认为它还有什么用途?它正是为此而设计的——因此非 UI 线程可以调用回 UI 线程来更新 UI。这正是调用它的唯一用途——如果我不调用 UI 线程,我为什么要为此支付运行时成本?

【讨论】:

是的,我明白了,但是你完全无法控制它需要多长时间,对于一个游戏循环,应该期望它每帧大约需要 20-30 毫秒,Dispatcher.Invoke 是否可靠对于这种事情? @ProgrammerAtWork 取决于你的程序有多糟糕。对于循环的所有更新,您应该在 UI 线程中调用 ONCE。不,你永远没有保证 - 在 WPF 中没有。但是 WPF 相当快。再次,每个循环调用一次 ui 线程,然后 - 在 WPF 中使用分析器来查看 WPF 在哪里花费时间(是的,这些东西是免费的,如果你知道如何使用谷歌 - MS 有一些很好的分析器可以告诉你在哪里正是 WPF 花费时间)。

以上是关于如何将 UI 与 C# 中的渲染分开?的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含 HTML 的字符串渲染到 C# 中的图像中?

Vue 3 中的模板渲染与渲染函数 h()

如何将图像中的标题和标题与正文文本分开

您如何使用 c# 4.0 app.config 中的部分?

如何将数字与 div 的 id 中的字符串分开并将字符串转换为变量? [复制]

hypermesh如何将component中的部件分开?