طريقة أسرع للتكرار من خلال مجموعة خشنة؟
سؤال
أرغب في التكرار من خلال صفيف يغطي كل بكسل على شاشتي. بمعنى آخر:
for (int y = 598; y > 0; y--)
{
for (int x = 798; x > 0; x--)
{
if (grains[x][y])
{
spriteBatch.Draw(Grain, new Vector2(x,y), Color.White);
}
}
}
... نسيج بلدي هو صورة 1x1 بكسل يتم رسمها على الشاشة عندما تكون قيمة الصفيف صحيحة. إنه يعمل لائقًا - ولكن هناك بالتأكيد تأخر كلما غطيت الشاشة. هل هناك طريقة أفضل لإنجاز ما أحاول تحقيقه؟
المحلول
بدلاً من استخدام العفاريت الفردية x x y ، قم بإنشاء صورة واحدة ، وضبط البكسل بشكل مناسب. ثم فقط عرض الصورة بأكملها كملمس على Sprite واحد.
على الأرجح صفيف خشنة ليس المشكلة - بالأحرى ما يقرب من نصف ملايين العفاريت.
نصائح أخرى
المشكلة هي أنك تنفق الكثير من وقت وحدة المعالجة المركزية داخل طريقة الرسم في كل إطار. سيتم دائمًا استدعاء طريقة السحب في مثيل اللعبة الخاص بك قدر الإمكان ، سواء في الوقت المحدد أم لا. بالنظر إلى ذلك ، فأنت تريد دائمًا التأكد من أنك تقضي وقتًا قليلًا هناك قدر الإمكان ، مما يعني أنك تريد وضع معظم العمل على وحدة معالجة الرسومات.
المتداخلة من أجل الحلقات وكذلك جميع المكالمات spriteBatch.Draw
سوف تستخدم وحدة المعالجة المركزية أبطأ بكثير ، خاصة عندما تصبح حلقةك أكبر وأكبر ، مما يعني تأخير الرسم.
إذا كنت ترغب في إجراء حسابات لكل بكسل ، لكل سحب ، كل إطار ، فإن أفضل طريقة للقيام بذلك هي وضع العمل على وحدة معالجة الرسومات واستخدام ظلال بكسل. يمكنك إنجاز مشكلتك الخاصة من خلال إنشاء نسيج واحد الحجم الذي تريده وتمرير مجموعة إلى التظليل الذي يحمل معلومات "ON أو OFF" ، من بين طرق أخرى لتحقيق نفس الهدف.