使用InvalidateRect重复使窗口失效的最佳方法是什么



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

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支持。这实际上仅适用于视频应用程序等。

相关内容

  • 没有找到相关文章

最新更新