WPF作为OpenGL纹理

WPF作为OpenGL纹理,wpf,opengl,Wpf,Opengl,我正在开发一个模拟器,它依赖OpenGL来显示符号、地图、移动项目。。。作为层/纹理 我们正在研究在模拟器中引入多点触控支持的不同选项 WPF是其中一个选项,因为它可以为GUI开发提供有趣的生产力因素。已经制作了一个原型,但它不符合我们的性能要求 我正在寻找一种提高性能的方法,或者寻求任何可以让我们回到正确轨道上的建议 当前系统基于 >P> C++和OpenGL编写的主/宿主应用程序,驱动(启动、调度、停止…)WPF部分,提供上下文信息< /P> 支持多点触控的WPF应用程序,可对主上下文

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

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

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

我正在寻找一种提高性能的方法,或者寻求任何可以让我们回到正确轨道上的建议

当前系统基于

    >P> C++和OpenGL编写的主/宿主应用程序,驱动(启动、调度、停止…)WPF部分,提供上下文信息< /P>
  • 支持多点触控的WPF应用程序,可对主上下文和用户输入做出相应反应

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

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

主机应用程序调度程序每隔xx毫秒(通常xx<50-60ms)向WPF应用程序请求一个捕获/位图,并将此位图添加为OpenGL纹理(glTexImage2D)以渲染模拟窗口

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

因此,我的问题是:

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

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

渲染API

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

渲染

每次假定布局发生变化时,WPF都会重新计算其显示器的整个布局,这可能会非常昂贵。因此,确保始终使用最简单的容器来完成任务(即,当画布足够好时,不要使用网格)

内存管理


为了改进内存处理,您可以使用弱事件(当不再需要处理程序时从对象中释放事件处理程序),使用VirtualzingStackPanels而不是StackPanels来最小化UI元素对内存的影响,并使用可自由释放的对象。

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