我需要反复重绘一个窗口,显示某种形式的连续分析。现在:
1)如果我在画完画后WM_PAINT这样做,我基本上会杀死其他人的画,所以它无法使用。
2)如果我在计时器中这样做,它有点滞后。
那么,最好的方法是什么,以便经常重新绘制窗口,但是当操作系统忙于处理某些数据或通过绘制其他应用程序时,它会降低速率。我一直认为操作系统应该负责在进程之间分配CPU功率,留下辅助图形,以确保实际处理有足够的时间,但在Windows和Mac上看起来并非如此。
您会创建一个计时器,并在每次计时器滴答时使窗口失效。如果存在滞后,则可能是更新频率太高,或者以涂装方法执行的处理成本太高。
请记住,具有复杂 3D 场景的游戏通常会达到 60fps(或更高)。因此,高帧率更新当然是可能的。
请注意,在 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
支持。这实际上仅适用于视频应用程序等。