【问题标题】:running an openGL engine in WPF in a separate thread在单独的线程中在 WPF 中运行 openGL 引擎
【发布时间】:2011-08-08 22:24:17
【问题描述】:

我有一个用非托管 C++ 编码的 openGL 渲染引擎,我想将它嵌入到 WPF 应用程序中。经过一番研究,我设法通过使用 windowsformshost 中的 windows 窗体面板的句柄来做到这一点,如下所述(第二个解决方案):

http://www.codeproject.com/Articles/127141/Unmanaged-C-OpenGL-Drawing-and-C-WinForms-WPF-inte/?display=Mobile

到目前为止还不错。问题是,我需要实时渲染,当某些 UI 操作耗时过长(例如填充属性网格)时,渲染会闪烁。

然后我想我需要在单独的线程中进行渲染。我尝试使用这种方法:

http://blogs.msdn.com/b/dwayneneed/archive/2007/04/26/multithreaded-ui-hostvisual.aspx

但它不起作用,因为我似乎无法在 HostVisual 中放置 windowsformshost (http://social.msdn.microsoft.com/Forums/en-AU/wpf/thread/124cc95c-a9c6-4aca-a5fc- 4f959ea715c3)

那么,知道我该怎么做吗?

【问题讨论】:

    标签: wpf multithreading opengl


    【解决方案1】:

    如果您使用双缓冲,那么它应该永远不会闪烁。请参阅“如何避免闪烁?”部分在您链接到的第一篇文章中。您还可以尝试在需要很长时间才能执行的代码中插入 Application.DoEvents() 调用。只是一些建议,以替代使用线程解决方案所增加的复杂性。

    编辑:刚刚意识到 WPF 不支持 DoEvents(),但还有其他选择:http://nmarian.blogspot.com/2007/09/doevents-in-wpf.html

    【讨论】:

    • 我已经实现了文章的“如何避免闪烁”部分,并且在正常操作、调整大小等时它不会闪烁。当我填充第 3 方属性网格时它会闪烁,因为它组成它本身在 UI 线程中,需要一些时间,我使用相同的 Dispatcher 来呈现 opengl。 wpf DoEvents 解决方法很有趣,但我不能将它插入任何地方,因为它是第 3 方代码。无论如何感谢您的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2019-08-12
    • 2012-05-20
    • 1970-01-01
    • 2015-01-24
    • 2011-04-21
    • 1970-01-01
    相关资源
    最近更新 更多