الشبكة العربية لمطوري الألعاب

خبير مدير وسام البهنسي مشاركة 1

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

 
نريد فقط  الحصول على الرقم الأول CPU والذي يمثل الزمن الذي بذله المعالج المركزي في إداء حسابات اللعبة من تحديث ورسم.
 
زمن التنفيذ 5 أيام كحد أقصى.
 
بعد إنجاز التعديلات، ارفعها على كود بليكس. كي تستطيع رفعها يجب أن تراسلنا باسم المستخدم الخاص بك في موقع كود بليكس كي نعطيك سماحية رفع التعديلات.
 
نحن بانتظارك...
 
السلام عليكم

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير مدير وسام البهنسي مشاركة 2

مؤيد، يمكنك قراءة الموضوع التالي لأخذ فكرة عن الموضوع أيضاً:
 
http://www.agdn-online.com/communities.aspx?view=posts&threadid=391

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير  أحمد عزالدين مشاركة 3

السلام عليكم

لقد بمحاولة تنفيذ المهمة وقمت برفع الكود
برجاء مراجعة ما تم تنفيذه واخباري ان كان ذلك المطلوب أم لا؟

اللعبة تعمل بنبض ثابت طول الوقت وهو 60 اطار في الثانية بشكل افتراضي
لقد قمت باضافة سطرين في ال game constructor وقمت بالغائهم مؤقتاً
ويمكن أن نقوم بتفعيلهم وذلك لنلاحظ التغير في القيم التي يتم عرضها

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير مدير وسام البهنسي مشاركة 4

السلام عليكم،
 
أحمد، عداد الأداء يقوم بحساب الزمن المستغرق لإنجاز حسابات ورسم لقطة كاملة في اللعبة. بما أن اللعبة حالياً لا تقوم بأية مهام تذكر، فمن المتوقع أن يعطي عداد الأداء زمناً صغيراً جداً يقترب من الصفر، وليس 16 ميللي ثانية.
 
عداد الأداء لا دخل له بموضوع نبض اللعبة، والذي -كما قد لاحظت- تقوم XNA بتثبيته لـ 60 لقطة في الثانية مبدئياً.
 
طريقة حساب الأداء تتم ببساطة عن طريق قياس فرق الزمن قبل وبعد إنجاز حسابات اللقطة.
 
ثانياً، يجب أن تعلم أن الهادم Destructor في #C يختلف في وظيفته عنه في ++C. اقرأ هذه المقالة لتعرف الفرق:
http://www.c-sharpcorner.com/UploadFile/chandrahundigam/UnderstandingDestructors11192005021208AM/UnderstandingDestructors.aspx
 
بدلاً من ذلك عليك استخدام واجهة IDisposable وكتابة إجراء Dispose خاص بك ووضع عمليات التنظيف فيه. ثم تستطيع استدعاء هذا الإجراء على الغرض متى ما أردت تحرير الموارد.
 
أرجو القيام بهذه التصحيحات إن أمكن.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  بلال بوزيــــــــاني مشاركة 5

السلام عليكم
 
أريد فقط التنويه على أمر ولا ادري ان كان هذا هو  المكان الصحيح  أو الأفضل ان افرد له موضوع خاص به , لاكن  على العموم سوف أستغل هذه  الفرصة مادام أخي وسام  طرح بعض الملاحظات .
 
بخصوص الصنف   XnaArabicTextRender  لاحظت من الإخوة  الكرام  انهم يستعملون هذا الصنف لكتابة الحروف اللاتنية او أرقام فقط , هذا و الله أعلم طريقة ليست بجيدة  و الافضل في رأيي عند إرادة كتابة حروف  لاتنية فقط أو أرقام فقط , إستعمال spriteBatch.DrawString , لاني أظن أنه بإستعمال هذا الاخير يكون أنجع  و افضل بكثير من أستعمال XnaArabicTextRender  .
 
فالصنف XnaArabicTextRender  يعتمد في عمله على  +GDI  و بتالي عند ارادة الكتابة بالعربية أو عربية ممزوجة  باللاتنية  يستعمل هذا الصنف .
 
هذا مابدا لي و الله أعلم , رغم اني سمعت ولست متأكد تماما و يرجى التحقق ان بدا من نضام Vista أصبحت +GDI  تعتمد على DirectX .
 
أخوكم بلال.

خبير  أحمد عزالدين مشاركة 6

السلام عليكم

شكراً أخي وسام على التنويه بخصوص المهدمات في سي شارب ، حيث أنني قد نسيت أن مجمع النفايات GC هو من يقوم بالتحكم في حالة متى يقوم بحذ أي كائن من الذاكرة ، وان وضع كود داخل المهدم ، لن يتيح لنا معرفة في أي وقت سيتم استدعاؤه ، وأننا لو أردنا أن نتحكم في بعض الموارد الحساسة فيجب أن نستخدم الواجهة IDisposable كما ذكرت

لقد قمت بالتعديل الان☺ 😄

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

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير مدير وسام البهنسي مشاركة 7

بتاريخ 28/شعبان/1431 04:03 م، قطب ahmed ezz حاجبيه بشدة وهو يقول:

لقد قمت بالتعديل الان☺ 😄

هناك تفريعة غريبة في سجل التعديلات. ناتجها تعديلات تحوي إجراء DisposeRendering أو شيء من هذا القبيل، بدلاً من استعمال إجراء Dispose الموروث من واجهة IDisposable.
 
أعتقد أنك لا بد وقد لاحظت أن الأداء في العداد الأخير دائماً يعطي صفر، وهو غير معقول. في الحقيقة، القيم مكممة بشكل كبير بين 10 و 20 ميللي ثانية. مما يعني أن أية عمليات تتم في وقت أقل من ذلك لن تظهر إطلاقاً في العداد.
 
لذلك، فقد قمتُ باستخدام عداد QueryPerformanceCounter العتيد لقياس الأداء كما يجب. الجانب السيء الوحيد لاستخدامه أنه دقيق زيادة عن اللزوم، وسترى تقلباً كبيراً في القيم بين اللقطة والأخرى، مما يزيد من صعوبة التعرف على زمن تنفيذ اللقطة. لكن هذا هو الواقع، فهناك العديد من العوامل التي تتسبب بإبطاء الأداء خارجة عن نطاق البرنامج نفسه.
 
العداد الحالي يعطيك الزمن بالميللي ثانية وأجزائها. اللون الأخضر يعني أن الأمور جيدة، أما إن كان النص باللون الأحمر فيعني أنك تجاوزت الحد المسموح به في هذه اللقطة وبالتالي ستصبح اللعبة أبطأ.
 
كامل نظام عداد الأداء يمكن فصله عندما نريد طرح اللعبة في النهاية، وذلك عن طريق إزالة المعرف SHOW_PERFORMANCE من إعدادات المشروع.
 


وفي 28/شعبان/1431 03:36 م، أعرب بلال بوزيــــــــاني عن رأيه بالموقف كالآتي:

بخصوص الصنف   XnaArabicTextRender  لاحظت من الإخوة  الكرام  انهم يستعملون هذا الصنف لكتابة الحروف اللاتنية او أرقام فقط , هذا و الله أعلم طريقة ليست بجيدة  و الافضل في رأيي عند إرادة كتابة حروف  لاتنية فقط أو أرقام فقط , إستعمال spriteBatch.DrawString , لاني أظن أنه بإستعمال هذا الاخير يكون أنجع  و افضل بكثير من أستعمال XnaArabicTextRender  .

صحيح. عداد الأداء يظهر لنا أن زمن حساب ورسم القائمة الرئيسية يستغرق 6 ميللي ثانية، وهذا كثير جداً بالنسبة للقطة فارغة لا تظهر بها سوى بضعة أسطر نصوص. 
سنحتاج لتحسين أداء رسام النصوص العربية لاحقاً إن تحول إلى عقبة في طريقنا. لكن الآن دعونا نكمل بناء اللعبة. ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز