2010-09-07 48 views
4

我正在模拟器上依靠OpenGL来显示符号,地图,移动项目...作为图层/纹理。作为OpenGL纹理WPF

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

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

我正在寻找一种方法来提高性能或任何可能使我们回到正确轨道的建议。

当前系统是基于

  • 主/宿主应用程序写在C++和OpenGL驱动(开始,时间表,停止...)的WPF部分和提供上下文信息

  • 与支持多点触摸一个WPF应用程序相应地作出反应到主背景下,为了用户输入

  • 一种用于通信的COM组件beetween主/主机应用程序和WPF应用程序

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

主机应用程序调度器询问WPF应用程序要捕获/位图每XX毫秒(XX < 50-60ms通常)并将该位图添加为OpenGL纹理(glTexImage2D)以渲染仿真窗口。

WPF呈现其位图的当前方式依赖于RenderTargetBitmap。渲染时间约为500ms,至少比我们想要的慢10倍,并消耗太多的CPU(在这种情况下,WPF使用软件管道)。

所以,我的问题是:

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

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

+0

为什么不能为此选择一些多点触控框架?或者只是使用WPF和其他MS框架,而不需要“主机”应用程序。 – 2011-08-12 15:49:16

回答

1

渲染API

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

渲染

每当一些假定的布局发生改变,WPF重新计算其显示的整个布局,它可以是相当昂贵的。因此,请务必使用最小复杂的容器,以满足您的任务需求(即当Canvas足够好的时候不要使用网格)。

内存管理

为了改善内存处理,你可以使用弱事件(释放事件处理程序的对象时不需要任何处理更多),使用VirtualizingStackPanels代替StackPanels减少UI元素的内存的影响,并使用可冻结的对象。