У меня есть простая игра, которая отображает 2D-графику в буфер кадров (без использования OpenGL).Я собирался использовать CVDisplayLink для получения чистой частоты кадров, однако большинство примеров в Интернете имеют дело с OpenGL или QuickTime.
Пока у меня есть подкласс NSView:
@interface GameView : NSView {
@private
CVDisplayLinkRef displayLink;
}
- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime;
@end
И я настроил обратный вызов CVDisplayLink:
CVDisplayLinkSetOutputCallback(displayLink, MyDisplayLinkCallback, self);
И у меня есть функция обратного вызова:
CVReturn MyDisplayLinkCallback (CVDisplayLinkRef displayLink,
const CVTimeStamp *inNow,
const CVTimeStamp *inOutputTime,
CVOptionFlags flagsIn,
CVOptionFlags *flagsOut,
void *displayLinkContext)
{
CVReturn error = [(GameView*)displayLinkContext getFrameForTime:inOutputTime];
return error;
}
Часть, в которой я застрял, это то, что нужно сделать в getFrameForTime:
, чтобы нарисоватьв графический контекст в GameView.Моим первым предположением было сделать рисование так же, как вы это сделали бы в drawRect:
- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime
{
CGContextRef ctxCurrent = [[NSGraphicsContext currentContext] graphicsPort];
//.. Drawing code follows
}
Но ctxCurrent
- это nil
, что, я думаю, я понимаю - обычно есть некоторые настройки, которые происходят до drawRect:
, что делает ваш взгляд текущим контекстом.Я думаю, что это та часть, по которой я скучаю.Как мне получить контекст для моего взгляда?
Или я поступаю по этому поводу во всех неправильных направлениях?