Windows是怎么做hit test的?
2012-01-19 20:20:46 来源: 点击:
Windows是怎么做hit test的?过去一直依赖于现成框架中提供的各种包装好的Control来做开发,很方便。各种交互事件都已经帮开发者封装好了,但是现在由于项目需要,需要自此从头来实现这些机制。目前比较头疼的是hit test的问题。在一个矩形区域内有很多小的矩形(可能有重叠),当鼠标在其上移动的时候,我的程序必须快速判断出鼠标现在位于哪个矩形上,进而产生出相应的消息去通知该矩形。已知的解决方案:如果矩形的位置、大小变化不频繁,而且内存空间不是太捉襟见肘,可以生成一个Bitmap来实现O(1)复杂度的hit test判断。性能恐怕不会有比这个更好的了。但问题是由于这些矩形可能频繁变化位置和大小(动画),因此实时生成这样的Bitmap会对性能造成影响。似乎不太可行。另外一些解决方案有的人提到了RTree。我也查阅了一些资料,似乎性能很好。但是我还没有深入阅读。hit test对于游戏开发人员,和图形程序开发人员来说应该是很常见很成熟的一个技术了。非常想听听你们的意见和建议。最后,和标题一样,很好奇Windows是怎么做hit test的?1 个答案
-
答案 1:
简单来说所有窗口组成一个树形结构,同一个parent的所有子窗口做z排序。检测的时候从上往下做point-rect检测,如果不在rect内就直接跳过整棵子树。具体实现上还需要处理很多细节,例如当窗口不可见的时候可以直接跳过。但基本思路就是这样,复杂度大概为O(logN),N为窗口的数量。 很多开源的UI库可以参考的,例如:Qt, CEGUI, MyGUI
相关热词搜索:
上一篇:我认为米聊早晚会被阿里巴巴收购,大家怎么看?
下一篇:现在互联网做搜索的前景如何?三年后呢?