gpt4 book ai didi

cocoa - 使用 InvalidateRect 重复使窗口无效的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 17:52:50 29 4
gpt4 key购买 nike

我需要反复重绘一个窗口,显示某种形式的连续分析。现在:

1)如果我在绘画后在WM_PAINT中这样做,我基本上会杀死其他人的绘画,所以它不可用。

2)如果我在计时器中执行此操作,则会有点滞后。

那么最好的方法是什么,以便窗口经常重新绘制,但是当操作系统忙于处理某些数据或绘制其他应用程序时,它会降低速率。我一直认为操作系统应该负责在进程之间分配 CPU 功率,让图形处于次要位置,以确保实际处理有足够的时间,但在 Windows 和 Mac 上看起来并非如此。

最佳答案

通常,您会创建一个计时器并在每个计时器滴答时使窗口无效。如果出现延迟,可能是更新频率太高,或者在paint方法中执行的处理成本太高。

请记住,具有复杂 3D 场景的游戏通常可以达到 60 fps(或更高)。因此高帧率更新当然是可能的。

请注意,在 Windows 下,WM_TIMER 事件是出了名的不一致。如果您需要超过 1 秒的分辨率,您可能需要探索其他高分辨率计时器。

在 Mac 上,您可以创建一个 NSTimer 并在 NSView 上调用 setNeedsDisplay:YES。像这样的事情:

// in your init... method
NSTimer* repaintTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(timerTickHandler:)
userInfo:nil
repeats:YES];

// ...

-(void)timerTickHandler(NSTimer*)timer {
[self.view setNeedsDisplay:YES];
}

Cocoa 中的 NSTimer 非常可靠,因此即使对于相当快的更新,上述内容也应该可以正常工作。

如果您需要以帧速率(即 25fps)更新,请查看 CVDisplayLink 支持。这实际上只适用于视频应用程序等。

关于cocoa - 使用 InvalidateRect 重复使窗口无效的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961414/

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