के लिए कैडिसप्ले लिंक का वैकल्पिक आईओएस है मैक ओएस एक्स में कैडिसप्ले लिंक है, सीवीडिस्प्ले लिंक है, लेकिन मुझे इसका उपयोग करने का कोई तरीका नहीं मिल रहा है, सभी उदाहरण OpenGL से संबंधित हैं।मैक ओएस एक्स
मैं इस कस्टम 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];
}
मुझे पता है कि मैं एक का उपयोग कर सकते है एनएसटीमर, लेकिन इसमें समान सटीकता नहीं है
वेटर्न [(__bridge एसपीवीडियो व्यू *) डिस्प्ले लिंक कॉन्टेक्स्ट रेंडरटाइम: इनऑटपुटटाइम]; 'मुझे यह लाइन समझ में नहीं आया, मुझे लगता है कि एसपीवीडियो व्यू के बजाय मुझे माईव्यू का उपयोग करना चाहिए, लेकिन मुझे समझ में नहीं आता कि मुझे रेंडरटाइम के बजाय क्या उपयोग करना चाहिए । क्या आप मुझे इस कार्यों के उद्देश्य (दोनों रेंडर कॉलबैक और रेंडरटाइम) के बारे में बता सकते हैं? – AR89
@ AR89 - क्योंकि CVDisplayLink एक कॉलबैक फ़ंक्शन लेता है, एक विधि नहीं, यह आपके ऊपर है कि आप अपनी कक्षा में उचित विधि पर कॉल करें। उपर्युक्त में, मैं जिस कक्षा का उपयोग कर रहा था वह एसपीवीडियो व्यू है, और मेरे पास एक तरीका है जो आउटपुटटाइम टाइमस्टैम्प में लेता है। आप उस टाइमस्टैम्प का उपयोग यह निर्धारित करने के लिए करेंगे कि क्या आप अभी तक अपना प्रदर्शन अपडेट आग लगाना चाहते हैं। एक तरफ, मैं यह भी बता सकता हूं कि आपको इसका उपयोग करके प्रदर्शन अपडेट से सावधान रहना चाहिए, क्योंकि यह कॉलबैक पृष्ठभूमि थ्रेड पर होता है, इसलिए आपको कोर ग्राफिक्स का उपयोग करते हुए यह सुनिश्चित करना होगा कि आपका चित्र मुख्य थ्रेड पर होता है। –
यह एक अच्छा जवाब है, लेकिन क्या यह महत्वपूर्ण है कि आप कॉलबैक को एक अलग थ्रेड पर ट्रिगर किए जा रहे हैं जहां एक दृश्य खींचा जाएगा? मुझे लगता है कि यह कम से कम OpenGL प्रतिपादन के लिए हो सकता है। – jheriko