很多人提到了硬件的更新,自然而然7就比Vista顺。其实不完全是那样的。虽然Vista的最低要求比7低,但如果同样是在符合7的要求的机器上,7也比Vista流畅。而vista自己也其实要到推荐要求的机器上,才能算可用。
就拿图形系统做个例子吧。
限于当年的软硬件水平,Vista的图形部分要求所有要显示的内容都可能有2份,一份在主存,一份在显存。GDI这样软件渲染的部分,画到主存里,同步到显存。GPU渲染的部分,画到显存里,但有可能会被同步回内存。这样一来,空间和时间都浪费了。而且WDDM 1.0是没有Blt的,GDI完全无法硬件加速。只能硬生生在CPU端拷贝数据。但真正dwm做混合,很多都是发生在主存。结果就是,如果你有个D3D/OpenGL的窗口,上面叠加一个GDI控件,就会闪烁。Maya就深受其害。
到了7,只需要保留显存一份。GDI画到内存后,立刻可以通过Blt传到显存。混合都在GPU端进行。这样首先是减少了空间的消耗,第二是09年的硬件和驱动,搞这些事情完全没问题。这样的改进,可以在程序完全不知情的情况下完成。结果就是同一个程序跑快了。
DWM本身,也有个大区别。Vista的dwm用的是D3D9的接口,7的用的是D3D11。在API上的效率就提升了,混合部分的开销减少。
再说Aero。看起来几乎一样的效果,其实在Vista和7里实现也不同。Vista用的是D3D9的StretchRect,拷贝到半分辨率的一张纹理里面,横竖blur,再加上前景颜色画到屏幕。7用的是D3D11,已经没有StretchRect了,也不能拷贝到不同分辨率的纹理,但back buffer也可以作为纹理读取。结果就变成了直接从back buffer做横向blur到一个横向只有一半的纹理上,再做一次纵向blur到半分辨率的纹理。在早期的硬件上,7的做法会比较慢。因为你在shader里第一次读取的是全分辨率的。到后来就已经没区别了。
就是这些细节上的改进,让7相对Vista有着效率上的巨大优势。但因为整体风格变化不大,老用户可以习惯地接受。这才挽救了颓势。