Каков наилучший подход для многократного аннулирования окна с помощью InvalidateRect?

Мне нужно многократно перерисовывать окно, показывающее некоторую форму непрерывного анализа. Сейчас:

1) Если я делаю это в WM_PAINT после рисования, я в основном убиваю рисование всех остальных, поэтому его нельзя использовать.

2) Если я делаю это по таймеру, это немного отстает.

Итак, что является лучшим способом сделать это, чтобы окно часто перекрашивалось, но когда ОС занята обработкой некоторых данных или рисованием других приложений, это снижает скорость. Я всегда думал, что ОС должна позаботиться о распределении мощности процессора между процессами, оставляя вторичную графику, чтобы обеспечить достаточное время для фактической обработки, но на Windows и Mac это не выглядит так.

1 ответ

Обычно вы создаете таймер и делаете недействительным окно при каждом тике таймера. Если существует задержка, возможно, частота обновления слишком высока или обработка, выполняемая методом рисования, слишком дорогая.

Имейте в виду, что игры со сложными 3D-сценами обычно достигают 60 кадров в секунду (и выше). Так что обновления с высокой частотой кадров, безусловно, возможны.

Обратите внимание, что под Windows WM_TIMER событие общеизвестно противоречивым. Возможно, вам придется изучить другие таймеры с высоким разрешением, если вам нужно разрешение более ~1 секунды.

На Mac вы можете создать NSTimer и позвонить setNeedsDisplay:YES на ваше NSView, Что-то вроде этого:

// 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];
}

NSTimer в Какао довольно надежный, поэтому вышесказанное должно работать просто отлично, даже для довольно быстрых обновлений.

Если вам нужно обновить с частотой кадров (т.е. 25 кадров в секунду), посмотрите на CVDisplayLink служба поддержки. Это действительно нужно только для видеоприложений и тому подобного.

Другие вопросы по тегам