एनएसटीमर का उपयोग करने के अलावा आईफोन पर गेम लूप बनाने का बेहतर तरीका क्या है?

मैं आईफोन पर एक गेम प्रोग्रामिंग कर रहा हूं। मैं वर्तमान में अपने गेम अपडेट/रेंडर ट्रिगर करने के लिए एनएसटीमर का उपयोग कर रहा हूं। इसके साथ समस्या यह है कि (प्रोफाइलिंग के बाद) मैं अपडेट/रेंडर के बीच बहुत समय खो देता प्रतीत होता हूं और ऐसा लगता है कि मैं उस समय अंतराल के साथ करना चाहता हूं जिसे मैं एनएसटीमर में प्लग करता हूं।

तो मेरा सवाल यह है कि एनएसटीमर का उपयोग करने का सबसे अच्छा विकल्प क्या है?

प्रति जवाब एक विकल्प कृपया।

0
मैंने इंटरनेट पर कई उदाहरणों और शोध विकल्पों को देखा है। तो मैं पहले से ही कुछ विकल्प जानता हूँ। मैं वास्तव में क्या कर रहा हूं यह है कि अन्य लोग क्या सोचते हैं कि सबसे अच्छा विकल्प है? मैं एक बेहद छोटी परियोजना पर काम कर रहा हूं इसलिए किसी भी समय जांच पर बचाया गया एक बड़ी मदद होगी।
जोड़ा लेखक Ashley Davis, स्रोत
क्या आपने आईफोन डेवलपर उदाहरणों को देखा है? मुझे लगता है कि कुछ उदाहरण हैं (उदाहरण के लिए टच फाइटर या क्रैश लैंडिंग) जो कि रोशनी हो सकती है।
जोड़ा लेखक Mark Bessey, स्रोत

3 उत्तर

आप धागे के साथ बेहतर प्रदर्शन प्राप्त कर सकते हैं, इस तरह कुछ कोशिश करें:

- (void) gameLoop
{
    while (running)
    {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [self renderFrame];
        [pool release];
    }
}

- (void) startLoop
{
    running = YES;
#ifdef THREADED_ANIMATION
    [NSThread detachNewThreadSelector:@selector(gameLoop)
    toTarget:self withObject:nil];
#else
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f/60
    target:self selector:@selector(renderFrame) userInfo:nil repeats:YES];
#endif
}

- (void) stopLoop
{
    [timer invalidate];
    running = NO;
}

रेंडरफ्रेम विधि में आप फ्रेमबफर तैयार करते हैं, फ्रेम खींचते हैं और स्क्रीन पर फ्रेमबफर प्रस्तुत करते हैं। (पीएस विभिन्न प्रकार के गेम लूप और उनके पेशेवरों और विपक्षों पर एक महान लेख है।)

0
जोड़ा
@zoul: क्या THREADED_ANIMATION विकल्प पहले के संस्करणों के लिए भी काम करता है? मैंने सोचा कि मैंने पढ़ा है कि यह कहीं नहीं था।
जोड़ा लेखक Jonas Byström, स्रोत
@ टीसी: आप सही हैं, लेकिन पोस्टर ग्राफिक्स परत के बारे में कुछ भी नहीं कहता है। चूंकि हम गेम के बारे में बात कर रहे हैं, इसलिए मैंने ओपनजीएल माना, जहां ऐसी लूप बिना किसी समस्या के काम करती है।
जोड़ा लेखक zoul, स्रोत
आपका मतलब आईओएस संस्करण पहले है? हां, मैंने 2.x या 3.x के आसपास गेम में समान कोड का इस्तेमाल किया है।
जोड़ा लेखक zoul, स्रोत
-1। UIView थ्रेड-सुरक्षित नहीं है, इसलिए आपको इसे काम करने के लिए अन्य सामानों का पूरा समूह करना होगा। UIGraphics 4.0 के बाद से केवल थ्रेड-सुरक्षित है।
जोड़ा लेखक tc., स्रोत

मैं विशेष रूप से आईफोन के बारे में नहीं जानता, लेकिन मैं अभी भी मदद कर सकता हूं: लूप के अंत में बस एक निश्चित देरी में प्लग करने के बजाय, निम्न का उपयोग करें:

  • एक ताज़ा अंतराल निर्धारित करें जिसे आप खुश करेंगे और यह आपके मुख्य पाश के माध्यम से एक ही पास से बड़ा है।
  • लूप की शुरुआत में, जो भी रिज़ॉल्यूशन आपके पास उपलब्ध है और उसे स्टोर करें, का वर्तमान टाइमस्टैम्प लें।
  • लूप के अंत में, एक और टाइमस्टैम्प लें, और अंतिम टाइमस्टैम्प के बाद से समाप्त समय निर्धारित करें (लूप से पहले इसे प्रारंभ करें)।
  • अपने आदर्श फ्रेम समय के बीच अंतर के लिए नींद/देरी और फ्रेम के लिए पहले से ही समाप्त हो गया समय।
  • अगले फ्रेम पर, आप पिछले लूप की शुरुआत में टाइमस्टैम्प की तुलना करके नींद अंतराल में त्रुटियों की भरपाई करने का भी प्रयास कर सकते हैं। अंतर को स्टोर करें और इस लूप के अंत में नींद अंतराल से इसे घटाएं/घटाएं (नींद/देरी बहुत लंबी हो सकती है या बहुत छोटी हो सकती है)।

हो सकता है कि आप एक चेतावनी तंत्र चाहते हों जो आपको बताए कि क्या आप समय बहुत तंग हैं (i, ई, यदि आपकी मुआवजे के बाद आपकी नींद का समय 0 से कम है, तो इसका मतलब यह होगा कि आप प्रक्रिया के लिए अधिक समय ले रहे हैं आपकी फ्रेम दर अनुमति देता है)। प्रभाव यह होगा कि आपका गेम धीमा हो जाएगा। अतिरिक्त बिंदुओं के लिए, यदि आप यह पता लगाते हैं, तो आप थोड़ी देर के लिए प्रतिपादन को सरल बनाना चाहते हैं, जब तक कि आपके पास पर्याप्त अतिरिक्त क्षमता न हो।

0
जोड़ा

CADisplayLink का उपयोग करें, आप एक्ससीडीईई में उपलब्ध ओपनजीएल ईएस टेम्पलेट प्रोजेक्ट में कैसे देख सकते हैं (इस टेम्पलेट से शुरू होने वाली एक परियोजना बनाएं और ईएजीएलवीव क्लास को देखें, यह उदाहरण ओपन जीएल पर आधारित है, लेकिन आप केवल दूसरे के लिए कैडिसप्ले लिंक का उपयोग कर सकते हैं खेल के प्रकार

0
जोड़ा