关于完全自绘界面的GDI+和D3D的两难问题!

时间:2021-01-19 19:11:15
项目要求自绘动态的多窗口界面,并可以显示3D的内容。
最初是打算直接用D3D写的,但是发现D3D要想实现多窗口限制非常大!
如果采用交换链的形式,D3D会限制其他窗口的页面大小必须小于等于主页面的大小。
如果不采用交换链,那么每个窗口都要创建一个D3D设备,而且纹理不知道是否能共享。
上面的问题导致D3D实现多窗口会大大占用显存资源。
然后就是,AERO的毛玻璃特效不知是否支持D3D,就算可以估计也会大大降低刷新效率。
再一个问题就是D3D的自动缩放,当窗口尺寸改变的时候,D3D会自动根据比例改变栅格化大小。
这个改变不是单纯的缩放图像,而是说D3D从一开始就是根据摄像机区域的比例进行绘制的,
通过改变摄像机的距离可以多少改变显示大小,但是3D透视的关系样子会改变。(这个问题只有绘制透视既3D物体才会有,2D无透视的如精灵就没问题)

于是我*妥协决定使用两种显示模式,默认使用GDI+的多窗口界面,并可以切换到使用D3D但是只有一个窗口的界面。
这样的好处是GDI+的多窗口界面可以使用AERO毛玻璃特效,而D3D的单窗口界面虽然不能用AERO但是可以显示3D元素。
就算用单窗口的D3D,但照样面临摄像机缩放的问题。这个问题在游戏中是无所谓的,因为改变游戏分辨率后虽然显示大小改变了,但是由于所有的内容的大小都改变了所以无影响。但普通软件如果一个列表大小缩放了就难看了。

另一方面,用GDI+绘制动态的界面又要面对刷新效率和CPU占用的问题。
如果在界面上一直都有动画效果而且是大范围的,估计CPU占用率会很高。用GDI效率比GDI+高,但是GDI似乎对透明通道不支持,但是AERO毛玻璃必须指定透明通道,所以可能必须使用GDI+进行绘制。

3 个解决方案

#1


还有一个Direct2D它不支持XP,并且不知道如毛玻璃支持如何。

#2


用D2D比较好,可以支持,装高一点的DX就行。

#3


XP不能装DX11啊

#1


还有一个Direct2D它不支持XP,并且不知道如毛玻璃支持如何。

#2


用D2D比较好,可以支持,装高一点的DX就行。

#3


XP不能装DX11啊