【问题标题】:WPF as OpenGL textureWPF 作为 OpenGL 纹理
【发布时间】:2010-09-07 08:13:52
【问题描述】:

我正在开发一个模拟器,它依赖于 OpenGL 将符号、地图、移动项目...显示为图层/纹理。

我们正在研究在模拟器中引入多点触控支持的不同选项。

WPF 是其中一种选择,因为它可以为 GUI 开发提供有趣的生产力因素。已构建原型,但不符合我们的性能要求。

我正在寻找提高性能的方法或任何可以让我们重回正轨的建议。

当前系统是基于

  • 使用 C++ 和 OpenGL 编写的主/托管应用程序,可驱动(启动、调度、停止...)WPF 部分并提供上下文信息

  • 支持多点触控的 WPF 应用程序,可根据主上下文和用户输入做出相应反应

  • 用于在 Main/hosting 应用程序和 WPF 应用程序之间进行通信的 COM 组件

  • 由特定抽象层管理的多点触控输入(处理 TUIO 或专有事件)

主机应用调度程序每 xx 毫秒(xx

当前 WPF 呈现其位图的方式依赖于 RenderTargetBitmap。渲染时间大约为 500 毫秒,这比我们希望的速度至少慢了 10 倍,并且消耗了过多的 CPU(在这种情况下,WPF 使用了软件管道)。

所以,我的问题是:

  • 有没有一种方法可以更快地呈现 WPF 窗口的位图,同时保持其所有功能(例如透明度)?我知道 gdi32 API,但它似乎不支持透明度之类的东西,我不知道我们是否可以获得任何性能

  • 当前架构看起来不是最佳选择,因为执行了两次“渲染”(WPF 应用程序本身的渲染和位图的渲染)。 WPF 是否有可能在某个虚拟内存空间中渲染一次,该虚拟内存空间可以由 Main/hosting 应用程序直接读取?

【问题讨论】:

  • 你为什么不能选择一些多点触控框架呢?或者只使用 WPF 和其他 MS 框架而不需要“主机”应用程序。

标签: wpf opengl


【解决方案1】:

渲染 API

首先,您不应该混合使用 WPF 和 OpenGL,因为 WPF 是基于 DirectX 的。确保您在 DirectX 9.0+ 硬件上运行 WPF 以获得最佳性能。

渲染

每当发生一些假定的布局更改时,WPF 都会重新计算其显示的整个布局,这可能会非常昂贵。因此,请确保始终使用足以完成您的任务的最简单的容器(即,当 Canvas 足够好时不要使用 Grid)。

内存管理

要改进内存处理,您可以使用弱事件(当不再需要处理程序时从对象中释放事件处理程序),使用 VirtualizingStackPanels 而不是 StackPanels 来最大限度地减少 UI 元素对内存的影响,并使用可冻结对象。

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 2020-04-03
    • 2013-03-28
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多