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

مبتدئ  زيد خالد مشاركة 1

السلام عليكم ورحمةالله وبركاته،

اقوم بعمل plugin للـ XSI لربط جهاز Motion Capture. ولكني أواجه مشكلة في كون الـ XSI يصبح بطيئ جدا عند بدء التسجيل "Start Capture".

الـ plugin هي نفس مبدأ عمل الـ Mouse Driver الذي يأتي مع XSISDK. الفرق الوحيد هو هنه يعتحوي على 57 channels بدل 4.

في محاولة مني لمعرفة سبب البطئ فقد قمت بإعطاء أرقام عشوائية للـ XSI بدل من اخذ المعلومات من جهاز الـ Motion Capture. مع ذلك لم يطرأ تغيير على السرعة.

ملاحظة: انا استخدم DOM Interface.
ملاحظة 2: تأخذ السرعة بالإزدياد كلما الغينا تفعيل بعض الـ channels.


أرجو الإرشاد
وشكرا،
زيد

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

الاقتراح الأول هو استخدام الـ C++ API بدلاً من COM. في خبرة سابقة لي، كنت أستخدم وحدة الرياضيات بشكل مكثف عن طريق واجهة COM وقد كان البرنامج بطيئاً للغاية (عمليات مصفوفات لمهام لقط الحركة كذلك). لم تكن الـ C++ API متاحة آنذاك، لذا استبدلت جميع تلك العمليات بإجراءات ++C مكتوبة باليد وقد تحسن الأداء بشكل كبير. يستعمل XSI وحدات COM بكامل مواصفاتها، وكل نداء لأحد إجراءات أي COM Object له كلفة إضافية ثابتة (قد تتعدى الزمن المستغرق لتنفيذ العمليات داخل الإجراء ذاته). لذا، تفادي نداء COM سيحسن الأداء.
الاقتراح الثاني، هو حفظ القيم جانباً (إما في الذاكرة أو كتابتها مباشرة على ملف) ثم تلقيمها دقعة واحدة لـ XSI لاحقاً (بعد الانتهاء من التسجيل مثلاً). طبعاً عنا نخسر ميزة التحديث الفوري للحركة بما يوافق ما يلقطه الجهاز...

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

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

بعد بحث طويل، لم اجد طريقة للتعامل مع الـ channels الخاصة بـالـ device driver من خلال C++ API!

يمكنني الإتسغناء عن الـ مبدأ الـ channels. واستقبال اسماء الـعضام من خلال الخيارات options. ثم تغيير قيمها مباشرة من خلال الـ C++ API. طريقة لابأس بها ولكن سأتركها كخيار اخير.

هل يوجد طريقة ما لعمل devide driver واستخدام الـ channels بدن الاعتماد على COM؟

بالمناسبة، يبدو لي أن العبئ الأكبر لا يأتي من إستخدام الـ COM. فقيم الـ channels تتغير في كلا الحالات:

for (int i=0; i< NUM_CHANNELS; i++)
{
	CComVariant l_var(  frame->channel[i] );
	g_pDeviceinfo.m_pChannels[i]->put_Value(l_var);
}


في حالة إهمال channel معين في الـ xsi تزداد السرعة مع انه يجري تحديثها بصورة دائمية مما يفسر ان البطئ لا يأتي من ال device driver وانما في إستخدام الـ chanenls في xsi. ماذا ترى؟

ولكم جزيل الشكر،
زيد

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

بتاريخ Apr 18, 2007 23:55، قطب زيد خالد حاجبيه بشدة وهو يقول:

بعد بحث طويل، لم اجد طريقة للتعامل مع الـ channels الخاصة بـالـ device driver من خلال C++ API!

صحيح. الطريقة الوحيدة هي من خلال الـ COM. وهو أمر مقبول إذا كنا نتحدث عن عدد محدود من القنوات، لكن كم قناة مربوطة على الـ device في حالتك؟

وفي Apr 18, 2007 23:55، أعرب زيد خالد عن رأيه بالموقف كالآتي:

يمكنني الإتسغناء عن الـ مبدأ الـ channels. واستقبال اسماء الـعضام من خلال الخيارات options. ثم تغيير قيمها مباشرة من خلال الـ C++ API. طريقة لابأس بها ولكن سأتركها كخيار اخير.

طريقة لا بأس بها. على الأقل تستحق التجريب.

في Apr 18, 2007 23:55، قال زيد خالد بهدوء وتؤدة:

بالمناسبة، يبدو لي أن العبئ الأكبر لا يأتي من إستخدام الـ COM. فقيم الـ channels تتغير في كلا الحالات:

for (int i=0; i< NUM_CHANNELS; i++)
{
	CComVariant l_var(  frame->channel[i] );
	g_pDeviceinfo.m_pChannels[i]->put_Value(l_var);
}

في حالة إهمال channel معين في الـ xsi تزداد السرعة مع انه يجري تحديثها بصورة دائمية مما يفسر ان البطئ لا يأتي من ال device driver وانما في إستخدام الـ chanenls في xsi. ماذا ترى؟

المشكلة أن الحلقة أعلاه تقوم بالفعل بنداء COM لكل قناة، هناك كلفة تجهيز الـ CComVariant يمكنك تفاديها، لكنها لا تذكر مقارنة بالنداء الفعلي.

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

مبتدئ  زيد خالد مشاركة 5

شكرا جزيلا أخي وسام.

بالفعل فقد جربت الأقتراح الثاني ولم الحظ نتائج إيجابية!
أتضح لنا انه لايوجد خلل معين او حل اخر خاصة انه يوجد 57 channels.
ليس هناك حل الا القنوع بـ 10 FPS او إستخدام جهاز أسرع من هذه السلحفاة!

إنا لله وانا إليه راجعون،

وشكرا،
زيد