سؤال

لقد صنعت لعبة تستخدم العديد من الموقتات في جميع أنحاء الكود. ومع ذلك ، يتعين على المؤقت التعامل مع العديد من المهام في مثل هذا الوقت الصغير مما يؤدي إلى المشكلة حيث توجد تأخر في لعبتي. على سبيل المثال ، يعمل المؤقت الخاص بي على فاصل (0.05) ويحتاج إلى رسم وتحديث العديد من الصور على الشاشة. هل هناك أي طريقة يمكنني من خلالها توزيع تدفق العمل بحيث يعمل البرنامج أكثر سلاسة؟

شكرًا

كيفن

هل كانت مفيدة؟

المحلول

أود استخدام NSThread بدلا من NSTimer. لقد حققت المزيد من النجاح في هذا المجال باستخدام NSThread لأنه يعمل على موضوع مستقل ولا يتم إطلاقه من سلسلة واجهة المستخدم الرئيسية. في حلقة الخيط ينامه لمدة 1/20 (0.05) من الثانية. نظرًا لأن الخيط لا يعمل على مؤشر ترابط واجهة المستخدم ، فلا ينبغي أن يبطئ جميع مهامه. ومع ذلك ، فهي لا تعمل على واجهة المستخدم التي سيتعين عليك الاتصال بها performSelectorOnMainThread للحصول على واجهة المستخدم لتحديث من موضوع الخلفية هذا. لقد وضعت قفلًا على طريقة التحديث الخاصة بي (منطقية بسيطة) تقول إذا لم يحدث آخر تحديث واجهة المستخدم ، فقط تخطي هذا. ثم إذا نفاد وقت المعالجة ، فأنا فقط أسقط إطارًا أو اثنين هنا وهناك. أقوم أيضًا بالكثير من التحقق لمعرفة ما إذا كان أي شيء قد تغير بالفعل قبل إعادة الرسم.

نصائح أخرى

حل بسيط: الخندق nstimer.

انقل رمز إعادة رسمك إلى طريقة واحدة ، ثم استخدم CADisplayLink. المشكلة في استخدام الخاص بك NSTimer النهج هو أن كل شيء يجري إعادة رسمه بسرعة كبيرة أو بطيئة للغاية بالنسبة للشاشة. باستخدام CadisplayLink ، يمكنك مزامنة رمز إعادة الرسم مع معدل تحديث الشاشة. كل ما عليك فعله هو لمس الكود الخاص بك حتى يمكن أن يتعامل مع عدم الاتصال في وقت محدد.

ونعم ، تحقق للتأكد من أنك لا تحتاج إلى إعادة الرسم كما قال آران مولهولاند أعلاه. فقط تأكد من أن الشيكات لا تستغرق طالما إعادة الرسم.

وتذكر تحسين الكود الخاص بك. كثيراً. استخدم Ivars للوصول إلى الكائنات ، ولكن الخاصية بأكملها (Self.myObject =) لتعيين كائناتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top