سؤال

أنا أعمل على لعبة تمرير ثنائية الأبعاد لجهاز iPhone.لدي خلفية صورة كبيرة، على سبيل المثال 480 × 6000 بكسل، ولا يظهر سوى جزء منها (تساوي شاشة واحدة بالضبط، 480 × 320 بكسل).ما هي أفضل طريقة للحصول على مثل هذه الخلفية على الشاشة؟

لقد قمت حاليًا بتقسيم الخلفية إلى عدة مواد (للتغلب على الحد الأقصى لحجم المادة) ورسم الخلفية بأكملها في كل إطار كشريط مثلث محكم.يتم التمرير عن طريق ترجمة مصفوفة عرض النموذج.تم ضبط صندوق المقص على حجم النافذة، 480 × 320 بكسل.ليس المقصود أن يكون هذا سريعًا، أردت فقط رمزًا صالحًا للعمل قبل أن أبدأ في التحسين.

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

يجب أن يكون رسم الخلفية سهلاً مثل نسخ حوالي 480 × 320 بكسل من جزء من VRAM إلى آخر، أو بعبارة أخرى، بسرعة فائقة.ما هي أفضل طريقة للاقتراب من هذا الأداء؟

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

المحلول

هذه هي الطريقة السريعة للقيام بذلك.الأشياء التي يمكنك القيام بها لتحسين الأداء:

  • جرب تنسيقات نسيج مختلفة.من المفترض أن تحتوي مستندات SDK على تفاصيل حول التنسيق المفضل، ومن المفترض أن يكون الحجم الأصغر هو الأفضل.
  • قم بإزالة البلاط الموجود خارج الشاشة بنفسك تمامًا
  • قم بتقسيم الصورة إلى أنسجة أصغر

أفترض أنك ترسم بمستوى تكبير 1:1؛هل هذا هو الحال؟

يحرر: أُووبس.بعد أن قرأت سؤالك بعناية أكبر، لا بد لي من تقديم نصيحة أخرى: التوقيتات التي تم إجراؤها على جهاز المحاكاة لا قيمة لها.

نصائح أخرى

الحل السريع :

  • قم بإنشاء مصفوفة هندسية من المربعات (يفضل أن تكون رباعية) بحيث يكون هناك صف/عمود واحد على الأقل من المربعات خارج الشاشة على جميع جوانب المنطقة القابلة للعرض.

  • خريطة القوام لجميع تلك البلاط.

  • بمجرد أن يكون أحد البلاطات خارج المنطقة القابلة للعرض، يمكنك تحرير هذا النسيج وربط نسيج جديد.

  • قم بتحريك البلاط باستخدام وحدة عرض البلاط وارتفاعه كموضع (بحيث يعيد البلاط وضعه عند نقطة البداية عندما يتحرك طولًا واحدًا بالضبط).تذكر أيضًا إعادة رسم خريطة للأنسجة أثناء تلك العملية.يتيح لك ذلك تحميل شبكة صغيرة جدًا/ذاكرة نسيج صغيرة جدًا في أي وقت.والذي أعتقد أنه مهم بشكل خاص في GL ES.

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

فيما يلي رابط لمحرك البلاط GL (وليس ES).لم أستخدمه بنفسي لذا لا أستطيع أن أضمن وظائفه ولكن قد يكون قادرًا على مساعدتك: http://www.mesa3d.org/brianp/TR.html

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