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

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

السلام عليكم،
 
أخي خالد، طريقة التواصل المثلى هي عن طريق هذه الشبكة كي تعم المعلومات للجميع بدلاً من استعمال البريد الإلكتروني مباشرة أو المرسال الفوري.
 
فيما يلي تعليقاتي على الكود الذي أرسلته، وسنعتمد هذا الموضوع لمتابعة مهام البرمجة في اللعبة.
 
* التزامك بنظام التسمية الخاص بالجافا ممتاز. حافظ عليه.
 
* تقسيم الوظائف على الأصناف جيد. هناك بعض الأمور التي يمكن وضعها في أماكن أكثر مناسبة، لكن سندعها لما بعد.
 
* حركة الجزيئات جميلة جداً. طريقة نزول "الجنود" جيدة. أعتقد أنك تعني أنهم ينحدرون على حبال وصولاً إلى سطح السفينة؟ 😒
 
* اللعبة في وضعها الحالي بطيئة جداً رغم أنها لا تفعل الكثير، ولذلك أسباب عدة سأسردها الآن وعليك الاستفادة منها لإصلاح الأداء من الآن فصاعداً.
 
* ابتعد عن متغيرات الفاصلة العائمة!!! بصراحة لا أعلم كيف استطعت استخدامها من الأساس، فهي غير مدعومة على الإصدار الأول من MIDP. بدلاً من ذلك استخدم متغيرات الفاصلة الثابتة للحسابات العشرية. أنصح بمكتبة MathFP لهذه المهمة.
 
* ابتعد عن الاستثناءات قدر المستطاع!!! فهي بطيئة للغاية عندما تحدث. بدلاً من ذلك استخدم القيم المرجعة لإعادة حالات الخطأ في الإجراءات التي تعمل بشكل دوري أثناء اللعب (كـ SpawnParticle مثلاً).
 
* ابتعد عن استخدام new قدر المستطاع!!! بدلاً من ذلك أعد تكرير الأغراض بعد إنشائها أول مرة، لا سيما تلك الدائمة الوفاة والانبعاث، وأنا أعني نظام الجزيئات بشكل رئيس هنا.
 
* استخدم القوائم المرتبطة لحفظ الجزيئات بدلاً من مصفوفة دائمة النمو والتقلص وفقاً لتغير عدد الجزيئات.
 
* وهذه أهم النقاط: يجب ثم يجب ثم يجب أن تضع عداد الأداء ليظهر دائماً على الشاشة لتعرف مستوى الأداء على الجهاز! وأنا لا أعني عداد FPS فهو غير مناسب، وإنما عداد لمدة تنفيذ دورة كاملة في حلقة اللعبة (وحدته الميللي ثانية).
 
* أخيراً وليس آخراً، احصر عدد اللقطات في الثانية الواحدة إلى 15 لقطة. مثل هذه اللعبة لا تحتاج أكثر من ذلك.
 
آسف على القائمة الطويلة، أعلم أن أمامك الكثير من العمل لكن هذه ملاحظات هامة للغاية كي تعمل اللعبة على الأجهزة الفعلية. ولا تنسى من آن لآخر تجريب اللعبة على موبايلك الخاص ☺
 
بانتظار حل هذه النقاط...

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

مبتدئ  خالد مغربي مشاركة 2

حسنا سأعمل على هذه التعديلات اليوم إن شاء الله
 
سأحتاج إلى السؤال عن بعض الأمور التي لم أفهمها حالما أواجهها، لذلك تحملوني 😳

خالد مغربي

مبتدئ  خالد مغربي مشاركة 3

لقد قمت بإجراء جزء من التعديلات المطلوبة. أهمها التخلص من متغيرات float والانتقال للفاصلة الثابتة. كما أنني الآن أستخدم القوائم المترابطة لحفظ الجزيئات وأتفادى إنشاء الجزيئات كلياً باستخدام new. وبصراحة أحسست فوراً بفرق الأداء. ☺
 
شكراً لك وسام على النصائح الغالية!  فعلاً ثقتي بهذه الشبكة كانت في محلها!  😄
 



في 12 يوليو 2010 01:48 ص، عقد وسام البهنسي حاجبيه بتفكير وقال:

* وهذه أهم النقاط: يجب ثم يجب ثم يجب أن تضع عداد الأداء ليظهر دائماً على الشاشة لتعرف مستوى الأداء على الجهاز! وأنا لا أعني عداد FPS فهو غير مناسب، وإنما عداد لمدة تنفيذ دورة كاملة في حلقة اللعبة (وحدته الميللي ثانية).

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


do {
  curState.simulate();
  Graphics g = this.getGraphics();
  curState.render(g);
  this.flushGraphics();
} while (!exit && (curState != null));
 
فهل فقط أضيف أمر نوم sleep في النهاية بعد إنهاء الرسم؟ أم أن هناك أمور أخرى؟ فلاحظت عندما أضع


 Thread.sleep(15L);
 
اللعبة تصبح أبطأ لكن سرعتها غير متجانسة. فأحياناً تسرع وأحياناً تبطئ. فما الأسلوب الأمثل؟
 
شكراً

خالد مغربي

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

بتاريخ 01/شعبان/1431 04:53 م، قطب خالد مغربي حاجبيه بشدة وهو يقول:

اللعبة تصبح أبطأ لكن سرعتها غير متجانسة. فأحياناً تسرع وأحياناً تبطئ. فما الأسلوب الأمثل؟

هذا لأن زمن "النوم" ثابت. بينما الصحيح هو أن يتغير وفقاً للزمن الزائد عن الحاجة. هذا يعني أنك أولاً بحاجة لقياس الزمن المستغرق لإنجاز حسابات اللقطة، ثم تطرح الرقم من الزمن الكامل المسموح للقطة الواحدة. الرقم الناتج هو ما يجب تمريره لإجراء النوم.
 
مثال: قررنا أن اللعبة تعمل بسرعة 15 لقطة في الثانية. هذا يعني أننا نملك 66.67 ميلي ثانية كزمن أقصى لتنفيذ لقطة من لقطات اللعبة.
 
الآن، نقوم بتنفيذ اللقطة، ونحسب الزمن المستغرق لذلك. فنجد مثلاً أنه 20 ميلي ثانية. هذا يعني أن لدينا زمن زائد بمقدار 46.67 ميلي ثانية، نستطيع أن ننام في هذه الأثناء ريثما يحين وقت اللقطة القادمة، فيصبح النداء:


 Thread.sleep(46L);
 
طبعاً لا يسمح بالأرقام العشرية في إجراء sleep لكن لا مشكلة، فالفرق ضئيل جداً ولن يشكل أزمة ☺  
أرجو أن تكون الأمور واضحة الآن...
 
بالمناسبة، قد يكون هذا الموضوع ذا عون لك في المهمة:
 
http://www.agdn-online.com/communities.aspx?view=posts&threadid=391

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