iOS에 CADisplayLink가 있으며, Mac OS X에는 CVDisplayLink가 있지만 사용 방법을 찾을 수 없으며 모든 예제는 OpenGL과 관련되어 있습니다.Mac OS X 용 CADisplayLink의 대안
내가이 사용자 정의에 UIView를 생성하고 난 NSView의
#import "StarView.h"
#import <QuartzCore/QuartzCore.h>
#define MAX_FPS (100.0)
#define MIN_FPS (MAX_FPS/40.0)
#define FRAME_TIME (1.0/MAX_FPS)
#define MAX_CPF (MAX_FPS/MIN_FPS)
#define aEPS (0.0001f)
@implementation StarView
@synthesize starImage = _starImage;
@synthesize x, y;
- (void)baseInit {
_starImage = nil;
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(runLoop)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self baseInit];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
[self baseInit];
}
return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
[self.starImage drawAtPoint:CGPointMake(self.x, self.y)];
}
-(void) cycle {
self.x += 5;
if (self.x > 230) {
self.x = 0;
}
}
- (void) runLoop {
//NSLog(@"called");
static CFTimeInterval last_time = 0.0f;
static float cycles_left_over = 0.0f;
static float dt2 = 0.0f;
float dropAnimRate = (2.1f/25.0f);
CFTimeInterval current_time = CACurrentMediaTime();
float dt = current_time - last_time + cycles_left_over;
dt2 += dt;
[self setNeedsDisplay];
if (dt > (MAX_CPF * FRAME_TIME)) {
dt = (MAX_CPF * FRAME_TIME);
}
while (dt > FRAME_TIME) {
if (dt2 > (dropAnimRate - aEPS)){
[self cycle];
dt2 = 0.0f;
}
dt -= FRAME_TIME;
}
cycles_left_over = dt;
last_time = current_time;
}
@end
로 번역 할
내가 번역 할 수없는 부분은 내가이를 사용할 수 있다는 것을 알고이 일
- (void)baseInit {
_starImage = nil;
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(runLoop)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
}
입니다 NSTimer,하지만 정확도가 동일하지 않습니다.
'return [(__bridge SPVideoView *) displayLinkContext renderTime : inOutputTime];'이 줄을 이해하지 못했습니다. SPVideoView 대신 MyView를 사용해야하지만 renderTime 대신 무엇을 사용해야하는지 이해하지 못합니다. . 이 함수의 목적 (renderCallback과 renderTime)을 나에게 설명해 주시겠습니까? – AR89
@ AR89 - CVDisplayLink는 메서드가 아닌 콜백 함수를 사용하기 때문에 클래스의 적절한 메서드를 다시 호출해야합니다. 위의 클래스는 SPVideoView 클래스를 사용하고 있으며 inOutputTime 타임 스탬프를 사용하는 메서드가 있습니다. 타임 스탬프를 사용하여 디스플레이 업데이트를 실행할지 여부를 결정할 수 있습니다. 또한이 콜백은 백그라운드 스레드에서 발생하기 때문에 디스플레이 업데이트에주의해야한다는 점을 지적 할 수 있습니다. 따라서 Core Graphics를 사용하는 경우 메인 스레드에서 드로잉이 발생하는지 확인해야합니다. –
이것은 좋은 대답이지만보기가 그려지는 다른 스레드에서 콜백이 트리거되도록하는 것이 중요합니까? 적어도 OpenGL 렌더링을위한 것 같아요. – jheriko