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

موهوب  16mofed84 مشاركة 1

لدي مجموعه من المثلثات


class Triangle
{
boundingSphere..
int I1;
int I2;
int I3;

eVertex P1;//my vertex ..other class.
eVertex P2;
eVertex P3;


}

الترتيب الذي استخدمه :
فحص(1) كل مثلث اذا كان يتلامس مع الكميرا فارسمه
فحص(2) كل مثلث الزاويه بين عموده و بين الكميرا > # (check if triangle CW )

الترتيب الثالث هو :
تحويل من triangle list to triangle strips ???
لتقليل من عدد الvertices المرسومه ..
فكيف يمكن تنفيذه بدون خفض سرعه التحويل بين Lists او arrays كبيره ؟ بأسرع طريقه
وشكرا سلفاً☺

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

وفي 23/شوال/1432 01:58 م، قال 16mofed84 متحمساً:

فحص(1) كل مثلث اذا كان يتلامس مع الكميرا فارسمه
فحص(2) كل مثلث الزاويه بين عموده و بين الكميرا > # (check if triangle CW )

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


وفي 23/شوال/1432 01:58 م، ظهر شبح ابتسامة على وجه 16mofed84 وهو يقول:

تحويل من triangle list to triangle strips ???لتقليل من عدد الvertices المرسومه ..

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

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

http://www.plunk.org/~grantham/public/meshifier/show.html




 ومن إنفيديا:

http://www.nvidia.com/object/nvtristrip_library.html

بالتوفيق

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

موهوب  16mofed84 مشاركة 3

الفحصين الاولين رفعا السرعه من 12fps ال 22
فرق شاسع

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

في 23/شوال/1432 02:38 م، غمغم 16mofed84 باستغراب قائلاً:

الفحصين الاولين خفضا السرعه من 12fps ال 22فرق شاسع

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

افعل ذلك وسيتحسن الأداء أكثر بكثير من 12 أو 22 لقطة في الثانية ☺

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

موهوب  16mofed84 مشاركة 5

مشكور جدا سأجربها غدا وسأرد جواب
ولكن هل ال triangle strips faster than triangle lists?

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

في 23/شوال/1432 02:46 م، قال 16mofed84 بهدوء وتؤدة:

لكن هل ال triangle strips faster than triangle lists?

نظرياً نعم، عملياً لا. السبب يكمن في أن استخدام قوائم المثلثات الحرة المفهرسة (indexed triangle-lists) تستفيد من ميزة الـ Post-Transform Cache التي تدعمها كافة معالجات الرسوميات المعاصرة. حيث يقوم المعالج بحفظ نواتج معالجة آخر 16 رأس (أو أكثر أحياناً) في مخزن صغير، وإعادة استخدام هذه النواتج إن أمكن عند رسم مثلث يستعمل رؤوس مشتركة مع مثلثات أخرى سبقت معالجتها.

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

موهوب  16mofed84 مشاركة 7

الفحصين الاولين رفعا السرعه من 5 الى 7 على 7000 مثلث (مع رسم كل مثلث على حده)
مع الطريقتك رفعت الى 14 على 7000 مثلث !

7000 مثلث هو المنظر العام و 1000 منظر قريب لذا ستكون السرعه مناسبه مشكور جدا جدا ..فقد رفعت معنوياتي

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

وفي 24/شوال/1432 06:31 ص، قال 16mofed84 متحمساً:

الفحصين الاولين رفعا السرعه من 5 الى 7 على 7000 مثلث (مع رسم كل مثلث على حده)
مع الطريقتك رفعت الى 14 على 7000 مثلث !

هذا غير كافي. 7000 مثلث هو رقم هزيل جداً. يجب أن تحصل على أداء مثل 250 لقطة في الثانية أو أكثر. هل يمكنك أن ترسل كود الرسم الجديد؟

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

موهوب  16mofed84 مشاركة 9

اعلم ان هذا الرقم قليل و لكنه بسبب كرت الشاشه
Intel GMA X3500
384 MB
داخلي ..
يدعم DXD 10 ولكني لا استخدمه بسبب windows xp..حاليا

اعتقد بانه مصمم لشخص عادي ...ليس مبرمج ولا للاعب العاب

ما دمت مصر على المساعده فلا بأس ..(ولكني اكتفي بهذا ولا اريد ان اغلبك..)

الملف لا زال قيد التطوير

http://www.4shared.com/file/8e0yxxmQ/Desktop.html

 ..و لدي خطه اعمل عليها ..ولحد الان انا امشي كما خطط و بشكل افضل مما توقعت فشكرا لكل من ساعدني و لهذا الموقع☺

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

أما في 25/شوال/1432 10:15 ص، فقد تنهد 16mofed84 بارتياح وهو يرد:

اعلم ان هذا الرقم قليل و لكنه بسبب كرت الشاشه
Intel GMA X3500
384 MB
داخلي ..
يدعم DXD 10 ولكني لا استخدمه بسبب windows xp..حاليا

اعتقد بانه مصمم لشخص عادي ...ليس مبرمج ولا للاعب العاب

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

استخدامك للإجراء GraphicsDevice.DrawUserIndexedPrimitives هو أفضل بكثير من رسم كل مثلث على حدة كما كنتَ تفعل سابقاً. لكن هذا الأسلوب يبقى بطيئاً جداً أيضاً مقارنة بالطريقة القياسية. فهذين الأسلوبين يقومان بإرسال معلومات المثلثات من الذاكرة الرئيسية في كل مرة يتم رسمهم.
 
البديل الصحيح هو حفظ معلومات المثلثات على ذاكرة معالج الرسوميات وإصدار أمر الرسم ليستعمل تلك المعلومات. في XNA يترجم هذا الكلام لاستخدام الإجراء GraphicsDevice.DrawIndexedPrimitives بدلاً من غيره (لاحظ غياب User من اسم الإجراء). حاول استخدام هذا الإجراء وعُد لنا بالنتائج...

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