ما هي أفضل طريقة لإنشاء حلقة لعبة على iPhone غير استخدام NSTimer؟

أنا أقوم ببرمجة لعبة على iPhone. أنا حاليا باستخدام NSTimer لتحريك بلدي تحديث اللعبة/تقديم. المشكلة في هذا هو أنه (بعد التوصيف) يبدو لي أن أفقد الكثير من الوقت بين التحديثات/المناقصات ويبدو أن هذا في الغالب متعلق بالفاصل الزمني الذي أقوم بتوصيله إلى NSTimer.

لذلك سؤالي هو ما هو أفضل بديل لاستخدام NSTimer؟

بديل واحد لكل إجابة من فضلك.

0
وأضاف تحرير
الآراء: 1
لقد نظرت في العديد من الأمثلة وبحثت البدائل على شبكة الإنترنت. لذلك أنا أعرف بالفعل هناك بعض البدائل. ما أنا بعده هو ما يعتقده الآخرون أن البديل الأفضل هو؟ أنا أعمل في مشروع قصير للغاية لذا فإن أي وقت يتم توفيره في التحقيق سيكون مساعدة كبيرة.
وأضاف المؤلف Ashley Davis, مصدر
هل نظرت إلى أمثلة مطوري iPhone؟ أعتقد أن هناك بعض الأمثلة (Touch Fighter أو CrashLanding ، على سبيل المثال) التي قد تكون مضاءة.
وأضاف المؤلف 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;
}

في الطريقة renderFrame يمكنك إعداد framebuffer ، رسم إطار وتقديم framebuffer على الشاشة. (ملاحظة: هناك مقالة رائعة على أنواع مختلفة من حلقات الألعاب وإيجابياتها وسلبياتها.)

0
وأضاف
zoul: هل يعمل THREADED_ANIMATION البديل أيضًا للإصدارات السابقة؟ اعتقدت أنني قرأت أنه لم يكن في مكان ما.
وأضاف المؤلف Jonas Byström, مصدر
tc: أنت على حق ، لكن الملصق لا يقول أي شيء عن طبقة الرسومات التي يستخدمها. بما أننا نتحدث عن الألعاب ، فقد افترضت OpenGL ، حيث تعمل هذه الحلقة دون مشاكل.
وأضاف المؤلف zoul, مصدر
تقصد إصدارات iOS السابقة؟ نعم ، أنا haved استخدام رمز مماثل في الألعاب حول 2.x أو 3.x.
وأضاف المؤلف zoul, مصدر
-1. UIView غير آمن بخيط ، لذلك تحتاج إلى القيام بمجموعة كاملة من الأشياء الأخرى لجعلها تعمل. UIGraphics فقط مؤشر ترابط آمن منذ 4.0.
وأضاف المؤلف tc., مصدر

لا أعرف عن جهاز iPhone على وجه الخصوص ، ولكن قد أظل قادرًا على المساعدة: بدلاً من مجرد توصيل تأخير ثابت في نهاية الحلقة ، استخدم ما يلي:

  • حدد فاصل زمني للتحديث يكون سعيدًا به ويكون أكبر من مسار واحد خلال الحلقة الرئيسية.
  • في بداية الحلقة ، اتخذ طابعًا زمنيًا حاليًا مهما كان القرار المتاح لديك وحفظه.
  • في نهاية الحلقة ، خذ طابعًا زمنيًا آخر ، وحدد الوقت المنقضي منذ آخر طابع زمني (تهيئة هذا قبل الحلقة).
  • سكون/تأخر الاختلاف بين وقت الإطار المثالي والوقت المنقضي مسبقًا لهذا الإطار.
  • في الإطار التالي ، يمكنك حتى محاولة التعويض عن عدم الدقة في فترة النوم بمقارنة الطابع الزمني في بداية الحلقة السابقة. قم بتخزين الفرق وإضافة/طرحه من فترة النوم في نهاية هذه الحلقة (قد يستغرق النوم/التأخير وقتًا طويلاً أو قصيرًا جدًا). ​​

قد ترغب في الحصول على آلية تنبيه تتيح لك معرفة ما إذا كان توقيتك ضيقًا للغاية (i، e ، إذا كان وقت نومك بعد كل التعويض أقل من 0 ، مما يعني أنك تستغرق وقتًا أطول في المعالجة من معدل الإطار الخاص بك يسمح). سيكون التأثير هو أن لعبتك تبطئ. للحصول على نقاط إضافية ، قد ترغب في تبسيط العرض لبعض الوقت ، إذا اكتشفت حدوث ذلك ، حتى تحصل على سعة احتياطية كافية مرة أخرى.

0
وأضاف

استخدم CADisplayLink ، يمكنك العثور على كيفية في مشروع قالب OpenGL ES المقدم في XCODE (إنشاء مشروع يبدأ من هذا القالب وإلقاء نظرة على فئة EAGLView ، يستند هذا المثال إلى GL المفتوح ، ولكن يمكنك استخدام CADisplayLink فقط للأخرى نوع من الألعاب

0
وأضاف