gpt4 book ai didi

c++ - HitTest 矩形

转载 作者:可可西里 更新时间:2023-11-01 13:51:30 24 4
gpt4 key购买 nike

我正在做一个项目,我有几个矩形,我希望每个矩形都有悬停效果。现在我知道我可以捕获 WM_MOUSEMOVE 消息并遍历每个矩形。但是,如果我有很多矩形(如果 50 个很多)怎么办?
我可能是错的,但不会在每次鼠标移动时迭代那么多并点击测试每一个会使应用程序变慢一点吗?

然后我开始想知道操作系统(例如 Windows)是如何做到这一点的,现在我的屏幕上有大约 100 多个东西,当我将鼠标悬停在它们上面时,它们都有某种动画。而且我不认为每次鼠标移动一个像素时 Windows 都会遍历所有这些。

基本上:
1. 考虑到性能,如果我有大约 50 个矩形,我如何找出我的鼠标悬停在哪个矩形上。
2.windows是怎么做到的? (我比任何事情都更好奇,但如果不是太复杂,也许我可以在我自己的程序中实现类似的东西?)

哦,它们都是矩形,它们不会旋转或发生任何变化。

最佳答案

在清楚一段代码造成真正的瓶颈之前,我不会太在意性能。假设您遇到了这样的瓶颈,并测量以下代码的性能(它是在 C# 中,但我很确定 C++ 不会更慢):

public class Rectangle
{
public int X { get; set; }
public int Y { get; set; }
public int W { get; set; }
public int H { get; set; }

public bool HitTest(int x, int y)
{
return x >= X && x < X + W && y >= Y && y < Y + H ? true : false;
}
}

我们对 HitTest() 方法的性能很感兴趣,所以让我们来测量一下吧!

void PerformanceTest()
{
const int Iterations = 1000000;
Random rnd = new Random();
var rectangles = Enumerable.Range(1, 50).Select(
r => new Rectangle {
X = rnd.Next(1000),
Y = rnd.Next(1000),
W = rnd.Next(1000),
H = rnd.Next(1000)}).ToList();

Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < Iterations; i++)
{
rectangles.ForEach(r => r.HitTest(500, 500));
}
sw.Stop();

Console.WriteLine("Elapsed time: {0}ms. ({1}us per one iteration)",
sw.ElapsedMilliseconds,
(float)sw.ElapsedMilliseconds * 1000 / Iterations);
}

在我的电脑上上面的代码打印:

Elapsed time: 701ms. (0.701us per one iteration)

如您所见, HitTest 50 个矩形所需的时间不到 1 微秒。你真的认为这与创建花哨的悬停效果和你的程序所做的任何其他事情所花费的时间相比太长了吗?当然,只有您可以回答这个问题。

但我的故事的寓意是:不要尝试预先优化,也不要花时间尝试解决可能根本不存在的问题。

关于c++ - HitTest 矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9534545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com