2010-09-07 66 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元素的內存的影響,並使用可凍結的對象。