我正在使用依赖OpenGL的模拟器来显示符号,地图,移动项目......作为图层/纹理。
我们正在研究在模拟器中引入多点触控支持的不同选项。
WPF是其中一个选项,因为它可以为GUI开发提供有趣的生产力因素。已经构建了一个原型,但它不符合我们的性能要求。
我正在寻找一种方法来改善表现或任何可以让我们回到正确轨道的建议。
当前系统基于
在C ++和OpenGL上编写的主/托管应用程序,用于驱动(启动,计划,停止......)WPF部分并提供上下文信息
具有多点触控支持的WPF应用程序,可根据主要上下文和用户输入做出相应的反应
用于主要/托管应用和WPF应用之间通信的COM组件
由特定抽象层管理的多点触控输入(处理TUIO或专有事件)
在主机应用程序调度器询问WPF应用程序要捕获/位图每XX毫秒。(XX<通常50-60ms),并增加了该位图作为一个OpenGL纹理(glTexImage2D)来呈现仿真窗口
WPF呈现其位图的当前方式依赖于RenderTargetBitmap。渲染时间大约为500毫秒,比我们想要的速度慢至少10倍,并消耗太多CPU(在这种情况下,WPF使用软件管道)。
所以,我的问题是:
有没有办法更快地渲染WPF窗口的位图,同时保留其所有功能(例如透明度)?我知道gdi32 API,但它似乎不支持透明度之类的东西,我不知道我们是否可以获得任何性能
当前架构看起来不是最佳选择,因为执行了两个“渲染”(WPF应用程序本身的渲染和其位图的渲染)。是否有可能WPF在一些虚拟内存空间中呈现一次,可以由主/主机应用程序直接读取?
答案 0 :(得分:1)
渲染API
首先,你不应该混合使用WPF和OpenGL,因为WPF是基于DirectX的。确保在DirectX 9.0+硬件上运行WPF以获得最佳性能。
渲染
每当发生一些假定的布局更改时,WPF会重新计算其显示的整个布局,这可能非常昂贵。因此,请确保始终使用足以完成任务的最小复杂容器(即,当Canvas足够好时不要使用网格)。
内存管理
为了改进内存处理,您可以使用弱事件(当不再需要处理程序时从对象释放事件处理程序),使用VirtualizingStackPanels而不是StackPanels来最小化UI元素的内存影响,并使用freezable对象。