حساب الحساب في C# - باستخدام Getters/Setters مقابل تعديل المصفوفات مباشرة وسرعات الصب

StackOverflow https://stackoverflow.com/questions/3018536

سؤال

كنت سأكتب منشورًا طويلًا ، لكنني سأغليه هنا:

أحاول محاكاة نمط المدرسة القديمة في NES عبر XNA. ومع ذلك ، فإن FPS الخاص بي بطيء ، في محاولة لتعديل 65 ألف بكسل لكل إطار. إذا قمت فقط بتدوين جميع وحدات البكسل 65k وقمت بتعيينها على بعض الألوان التعسفية ، أحصل على 64 إطارًا في الثانية. الكود الذي قمت به للبحث عن الألوان التي يجب وضعها في مكان ، أحصل على 1 إطارًا في الثانية.

أعتقد أنه بسبب الكود المصنوع من كائني.

في الوقت الحالي ، لدي أشياء مقسمة إلى حوالي ستة فصول ، مع getters/setters. أظن أنني على الأقل أتصل بـ 360k getters لكل إطار ، وأعتقد أنه كثير من النفقات العامة. تحتوي كل فئة على المصفوفات/أو 1D أو 2D التي تحتوي على تعدادات مخصصة أو int أو color أو vector2d ، بايت.

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

أنا أيضًا لست قلقًا بشأن انتهاكات الوصول ، لأن أي محاولات للحصول على/تعيين البيانات في المصفوفات ستتم في كتل. على سبيل المثال ، سيتم إجراء جميع الكتابة إلى المصفوفات قبل الوصول إليها من أي بيانات.


أما بالنسبة للالتصاب ، فقد ذكرت أنني أستخدم التعدادات المخصصة ، int ، color ، و vector2d ، بايت. ما هي أنواع البيانات الأسرع في الاستخدام والوصول في .NET Framework ، XNA ، Xbox ، C#؟ أعتقد أن الصب المستمر قد يكون سبب التباطؤ هنا.

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

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

المحلول

هناك عرض تقديمي رائع من GDC 2008 يستحق القراءة إذا كنت مطور XNA. تسمى فهم أداء إطار عمل XNA.

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

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

(جانبا: فيما يتعلق بما هو سريع: إن عدد عدد الأعداد الصحيحة والرياضيات العائمة سريعة للغاية - بشكل عام ، يجب ألا تستخدم جداول البحث. تعد مكالمات الوظائف سريعة جدًا - لدرجة أن نسخ الهياكل الكبيرة عند مرورها سيكون أكثر أهمية. ستقوم JIT بتضمين getters والمستقلين البسيطين - على الرغم من أنه يجب ألا تعتمد عليها لتدفق أي شيء آخر في حلقات ضيقة جدًا - مثل بليتر.)

ومع ذلك - حتى لو تم تحسينها - تمتص الهندسة المعمارية الحالية. ما تفعله الذباب في وجه كيفية عمل وحدة معالجة الرسومات الحديثة. يجب أن تقوم بتحميل العفاريت الخاصة بك على وحدة معالجة الرسومات الخاصة بك والسماح لها بتركيب المشهد الخاص بك.

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

ال آثار العفريت عينة XNA هي مكان جيد للبدء.

نصائح أخرى

هل قمت بتعيين الكود لتحديد مكان التباطؤ؟ قبل أن تذهب لإعادة كتابة طلبك ، يجب أن تعرف على الأقل الأجزاء التي يجب إعادة كتابتها.

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

هل تحدد لونًا ومثل كل بكسل أو شيء من هذا القبيل؟ إذا كان هذا هو الحال ، فأعتقد أنك يجب أن تفكر حقًا في الهندسة المعمارية. ابدأ في استخدام العفاريت التي ستسريع الأمور.

تعديل

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

كما هو الحال مع أي مشكلة في الأداء ، يجب عليك تعريف التطبيق لتحديد الاختناقات بدلاً من محاولة التخمين. أشك بجدية في أن getters والمستقبين هم جذر مشكلتك. التحويل البرمجي دائمًا يكاد يكون هذا الأنواع من الوظائف. أنا أيضًا أشعر بالفضول لما لديك ضد الرياضيات. ضرب اثنين من الأعداد الصحيحة ، على سبيل المثال ، هو واحد من أسرع الأشياء التي يمكن للكمبيوتر القيام بها.

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