2011-06-19 7 views
5

Mam prostą grę, która renderuje grafikę 2D do bufora ramki (nie używając żadnego OpenGL). Miałem zamiar użyć CVDisplayLink, aby uzyskać czysty framerate, jednak większość przykładów w Internecie dotyczy OpenGL lub QuickTime.Jak narysować kontekst graficzny NSView z poziomu wywołania zwrotnego CVDisplayLink?

Do tej pory mam klasy sub NSView:

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

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

I skonfigurować zwrotnego CVDisplayLink:

CVDisplayLinkSetOutputCallback(displayLink, MyDisplayLinkCallback, self); 

I mam funkcję callback:

Część, w której utknąłem, to co zrobić w getFrameForTime:, aby narysować kontekst graficzny w GameVi ew. Moje pierwsze przypuszczenie było wykonać rysunek ten sam sposób, jak w drawRect:

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

    //.. Drawing code follows 
} 

Ale ctxCurrent jest nil który myślę, że rozumiem - zwykle jest jakaś konfiguracja, co dzieje się przed drawRect: sprawia, że ​​Twój widok bieżącego kontekstu. Myślę, że to jest ta część, której mi brakuje. Jak uzyskać kontekst dla mojego widoku?

Czy robię to wszystko na wszystkie złe sposoby?

Odpowiedz

2

Możesz zostawić swój kod rysunkowy w ‑drawRect:, a następnie w swoim MyDisplayLinkCallback() ustawić ivar na bieżący czas i wywołać ‑display w swoim widoku. To zmusi twój widok do natychmiastowego przerysowania siebie.

W swojej metodzie ‑drawRect: po prostu użyj wartości czasu ivar, aby zrobić dowolny rysunek, aby zaktualizować widok odpowiednio dla bieżącej klatki animacji.

+0

Dzięki, to działa i wydaje się być najczystszym z dotychczas znalezionych. – John

0

Powinieneś utworzyć osobną metodę -draw: i zadzwonić do niej pod numer MyDisplayLinkCallback(), a także od -drawRect:.

Znalazłem Rob Kenigera, response według mojego upodobania i wypróbowałem; Niestety, jeśli zadzwonisz pod numer -display z twojego połączenia zwrotnego, Twoja aplikacja może zawiesić się w martwym punkcie, gdy zamkniesz aplikację, pozostawiając ci wymuszenie zamknięcia aplikacji (dla mnie zdarzało się to częściej niż nie).

+1

Dodaj link do odpowiedzi Roba Kenigera. Byłoby to całkiem interesujące zobaczyć to. – SalmonKiller

+0

@SalmonKiller: Jak mogę połączyć? Jest to obecnie akceptowana odpowiedź tuż nad moją. – placeitintheblob

Powiązane problemy