GPU渲染和GDI
要实现这样一段逻辑,用GPU画3D图,用GDI画二维图元,怎么样效率高。相传Vista年代,是这样干的:
- 硬件渲染的东西在GPU上做完
- 读回CPU端
- 把GDI这些用软件渲染
- 两者混合
- 拷贝到显存显示
这样的话,相当于整个屏幕都要维持2份拷贝,并且要互相同步。早期的vista驱动上,D3D/OGL和GDI混合使用的话闪得要死或者慢的要死,就是这个原因。
于是新的wddm要求驱动提供overlay和blt,所以流程变得很简单高效:
- 硬件渲染的东西在GPU上做完
- 把GDI这些用软件渲染
- BitBlt到GPU端作为overlay
这样只需要在GPU端维护一份屏幕拷贝,CPU端只需要短暂地维护一个局部GDI的内容就可以了。
这也解释了为什么过去大型游戏在窗口模式下渲染比较慢,而全屏模式下比较快。全屏模式下,显卡是独占的,而且不需要与其他桌面程序(任务栏等 )和其他窗口坐混合,甚至桌面占用的内存也会被释放,记得曾经我的老爷机退出大型游戏时,窗口黑屏,接着慢慢刷出背景和桌面图标,大概就是这么个人道理吧。Win7 时代不一样了,GDI可以blit到显存,而Aero特效本身也是硬件加速的,所以全屏和窗口模式应该差别不大了。