WPF 使用 OpenGL 4.5 繪圖太卡?

界面 C# WPF C++/CLI 調用 C++ DLL 封裝的 OpenGL 4.5 繪圖 啟動後幾十秒拖動界面明顯卡頓

使用了 WindowsFormsHost 載入 C++/CLI UserControl

繪圖裡只有 glClear wglSwapBuffers 注釋掉就流暢了 內存 CPU 佔用也不高 其它程序都是流暢的

DispatcherTimer timer = new DispatcherTimer();

timer.Tick += new EventHandler(updateTimer_Tick); //調用gl繪圖

timer.Interval = TimeSpan.FromMilliseconds(30);

timer.Start();


你幾乎用了最差的組合。

  1. 絕不該用定時器。如果你想實時,就在CompositionTarget.Rendering或者Idle裡面調用繪製。WPF自己會做同步,讓它做好了。定時器是所有遊戲開發入門書里就提到過的大忌。
  2. WPF是D3D的,你要加上OpenGL的,本身就會需要系統或驅動多一次同步,可能最高速度就是30FPS了。用D3D渲染主窗口的會好得多。


必須用自己的定時器去刷新嗎?winform的控制項不是有OnPaint嘛,在裡面draw不行嗎?

如果是需要保證一定的刷新率的話,那也不可以假定幀率固定,應該要根據時間間隔去估算幀率。

我覺得偷懶的做法就是拿定時器去invalidate控制項,然後靠wpf/winform自身去控制控制項內部的刷新。

非專業人士,想法有錯的地方還請多多指教。


如果必須 Open GL 可以研究下 Google Angle (Almost Native Graphics Layer Engine) + D3DImage 的組合試試

ref: l3m/wpf-gles

ref: https://groups.google.com/forum/#!topic/angleproject/uhHloFsmcNY

ref: http://lists.qt-project.org/pipermail/interest/2015-September/018985.html


WPF本身就是Direct3D繪製後端的,如果使用OpenGL,反而需要同步,造成性能大幅損耗。

當然,如果非要使用OpenGL,可以藉助angle庫,angle是用OpenGL的介面封裝Direct3D的庫


opengl應該配winform吧,wpf不是有dx


你都用WPF了為什麼不使用DirectX繪圖


推薦閱讀:

渲染的時候是不是頂點數目越少越好?
WebGL 和 OpenGL ES 有什麼區別?
WebGL 是否需要以 OpenGL 為學習基礎?
OpenGL ES 和 Unity3D 是什麼關係?
openGL與界面兼容?

TAG:OpenGL | C | C# | WindowsPresentationFoundationWPF |