Vista is evil!

原创 2007年09月16日 12:55:00

最近做了件事情,就是让我们现在的系统能够在vista aero下跑起来。

其实这个问题很多人都碰到过,就是vista aero下GDI和3D API(d3d,opengl)是不能在一个区域里一起工作的。为什么会有这种现象呢?可以参考下这篇blog: http://blogs.msdn.com/greg_schechter/archive/2006/05/02/588934.aspx

上面提到了一个概念叫composite。我来以我自己的方式来解释一下,根据我以前做vista display driver的经验,在aero打开时,wdm进程会为每一个窗口都会创建一个render target。所有的绘制操作都会在这个render target上完成。但系统实现时不可能不考虑到硬件的情况——render target一般都是在video memory或者是在CPU读非常慢的AGP/PCIE memory里,而很多GDI绘制是需要read back的,典型的如XOR drawing。所以MS在实现系统时,弄了个叫shadow buffer的东西(driver层的概念,对用户层是透明的),此shadow buffer是在system memory中的,所有的基于SetPixel()/GetPixel()的GDI绘制都会先发生在此shadow buffer上,然后由OS在认为合适的时候"composite"到此窗口对应的render target上去。

这样就引入了一个问题——如何"composite"?整个窗口都copy? 显然不行,那样效率太低。虽然MS没有明确的文档说明这个问题,但我的观点是MS会以"GDI影响范围的screen aligned rectangle"来进行composite。比如你沿着水平方向画了条长度为N的像素的线段,那么恭喜你,OS只会更新此线段上的N个像素;然而假如你延45度方向画了条N个像素的线段,那么OS将会更新以此线段为对角线的正方形。这种做法也是因为图形硬件的缘故,基于screen aligned rectangle的更新对硬件来说是友好的。

然而,这样做却引入了更大的问题——假如shadow buffer上的内容和render target上的不一致,那么这种更新就是完全错误的。而这种情况在3D API和GDI同时绘制一个区域时一定会发生——3D API直接绘制到render target上,GDI先绘制到shadow buffer上,然后在composite。而以前的OS或者是vista basic mode时,GDI都是直接在frame buffer上操作的。可以想象一下vista aero下,3D API和GDI同时绘制一个区域时会有什么结果发生?

遗憾的是:MS吧这个难题留给了应用程序开发者。要解决这个问题只有两种办法:

1. 全部使用GDI或3D API来进行某一screen aligned rectagnle的绘制,比如GDI绘制屏幕左侧的面板区域,3D API绘制右侧的游戏场景预览区域,注意必须是screen aligned rectangle;

2. 强制shadow buffer在3D API绘制完成后,从render target上download数据下来进行更新,从而保持一致;

其实2基本不具备使用价值,read back不仅慢,重要的是他要flush GPU(即我们通常听到的打断流水线),效率可想而知。所以我的做法是用了1,即用3D API实现了一套替代GDI功能的方法。那个虚线的ellipse烦得我够呛,不过除了设计接口,其他的都是体力活。现在我只在d3d9下实现了,opengl和d3d10如果其他同事有兴趣,让他们照着做吧。

 

最后说点题外话,现在中国的股市,楼市真让人看不懂。有人说股市是泡沫,有人说还要涨到6k点以上,不过大家普遍看到北京奥运前中国的经济。楼市也很奇怪,京沪深等地方房价15000+还算说得过去,毕竟全中国的人都想往这里挤。可连武汉这种鸟不拉shit的地方房价都要7k+了,这种房价市民居然还排两天对抢购。实在看不懂,希望疯狂之后大家慢慢降温,骤变对百姓一点好处都没有。

Do not be evil-不作恶的谷歌

大多数人想了解一样事物,会通过搜索引擎搜索相关信息,因此,搜索代表着一种求知意愿。想你所想,并呈现出你想要的搜索结果,便是搜索引擎的追求。 谷歌作为目前最主流的搜索引擎,一直宣扬着他们公正、自由...
  • dongsheng186
  • dongsheng186
  • 2015年06月15日 15:50
  • 1093

ORcle-OUI-18001: 不支持操作系统 'Windows Vista 版本 6.1'——解决方法

Windows 7下安装Oracle 11g报错OUI-18001: 不支持操作系统 'Windows Vista 版本 6.1'
  • youmengdaigu
  • youmengdaigu
  • 2014年08月27日 10:03
  • 829

hdu5892 -Resident Evil 二维树状数组 + 状态压缩

题目大意:有50种动物,给你n*n的矩阵,m次操作,P代表加入操作,在左上角 x1,y1 到右下角 x2,y2,的矩形范围内加入种类为x,数量为y的动物。      Q代表询问操作,在左上角 x...
  • viphong
  • viphong
  • 2016年09月22日 17:35
  • 407

无线网络几种攻击方式

Evil Twin Attack 双面恶魔攻击: 攻击者使用相同的SSID创建一个欺诈性接入点,因为与受害者常用SSID名称一样,并且具有更强的型号,因此可以轻易欺骗受害者与之连接。建立连接后,攻击...
  • jerry81333
  • jerry81333
  • 2016年10月28日 02:50
  • 2682

HDU 5892 Resident Evil(二维树状数组,好题)

题目大意 这道题的大意是一个城市有n*n个格子组成,每次都可以选择一个长方形的区域然后往里面放怪物,然后这个长方形区域里面的每个小格子都有同样数量的怪物,就是相当于一个二维区间更新了,然后又给你一...
  • chen_ze_hua
  • chen_ze_hua
  • 2016年11月06日 09:34
  • 294

通过修改程序解决Vista/Win7/Win8下应用程序兼容性问题

在Vista/Win7/Win8下,有一个系统兼容性助手功能,使得程序在安装完成后或运行时,总是弹出应用程序兼容性助手相关的提示,很是烦人,事实上我们的程序兼容性是没有问题的,只不过是在程序中没有指定...
  • chenlycly
  • chenlycly
  • 2013年06月10日 15:01
  • 6099

我也说说Emacs吧(4) - 光标的移动

Spacemacs的光标移动继承自evil,学习了vi的模式,跟标准emacs有所不同
  • lusing
  • lusing
  • 2017年06月02日 16:28
  • 464

hdu4027 Can you answer these queries?(线段树平方减少,区间求和)

线段树平方减少,区间求和)
  • u012860063
  • u012860063
  • 2014年06月29日 15:20
  • 982

HDU5892 Resident Evil(二维树状数组+状态压缩)

Resident EvilTime Limit: 6000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) T...
  • Viscu
  • Viscu
  • 2016年10月18日 00:25
  • 355

Windows Vista/7桌面边栏小工具开发入门

Windows Vista 的Gadget开发其实并不难,只要你有一定的HTML、CSS、Javascript基础就能成功地开发出一个漂亮的桌面小工具。在Vista和Win7下,每一个桌面Gadget...
  • mrxyz098
  • mrxyz098
  • 2014年06月01日 20:48
  • 1887
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Vista is evil!
举报原因:
原因补充:

(最多只允许输入30个字)