Каков наилучший подход для многократного аннулирования окна с помощью 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
служба поддержки. Это действительно нужно только для видеоприложений и тому подобного.