2011-06-19 43 views
5

我有一個簡單的遊戲,將2D圖形渲染到幀緩衝區(不使用任何OpenGL)。我打算使用CVDisplayLink來獲得一個清晰的幀率,然而網上的大多數例子都是用OpenGL或者QuickTime來處理的。如何從CVDisplayLink回調中繪製到NSView圖形上下文?

到目前爲止,我有一個子類的NSView的:

@interface GameView : NSView { 
@private 
    CVDisplayLinkRef displayLink; 
} 

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime; 
@end 

我成立了CVDisplayLink回調:

CVDisplayLinkSetOutputCallback(displayLink, MyDisplayLinkCallback, self); 

和我有回調函數:

我卡住的部分是在getFrameForTime:中做什麼來繪製到GameVi中的圖形上下文EW。我的第一個猜測是做畫一樣,你會方式drawRect:

- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime 
{ 
    CGContextRef ctxCurrent = [[NSGraphicsContext currentContext] graphicsPort]; 

    //.. Drawing code follows 
} 

ctxCurrentnil我想我明白 - 通常有一些設置的drawRect:,使您的視圖當前上下文之前出現這種情況。我認爲這是我錯過的部分。我如何獲得我的觀點的背景?

或者我是否以所有錯誤的方式去解決這個問題?

回答

2

您可以在‑drawRect:中留下您的圖紙代碼,然後在您的MyDisplayLinkCallback()中設置一個ivar到當前時間並在您的視圖上呼叫‑display。這將迫使你的視圖立即重繪自己。

在您的‑drawRect:方法中,只需使用時間ivar的值來執行任何必要的繪製操作,以適當更新當前動畫幀的視圖。

+0

謝謝,這是工作,似乎是迄今爲止我發現最清潔。 – John

0

您應該創建一個單獨的-draw:方法,並從您的MyDisplayLinkCallback()以及-drawRect:中調用該方法。

我發現Rob Keniger的response符合我的喜好並試用過;不幸的是,如果您從顯示鏈接回調中調用-display,那麼當您終止應用程序時,您的應用程序可能會陷入死鎖狀態,從而使您強制退出應用程序(對於我來說,它經常發生)。

+1

請添加一個鏈接到Rob Keniger的回覆。看到這將是相當有趣的。 – SalmonKiller

+0

@SalmonKiller:我如何鏈接?這是我目前正在接受的答案。 – placeitintheblob