如何将 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# 中的渲染分开?的主要内容,如果未能解决你的问题,请参考以下文章