في 07/ذو الحجة/1431 09:26 م، عقد فراس أسعد حاجبيه بتفكير وقال:
و لذا فأنا أقوم بتعلم المزيد عن الحوسبة المتجهة، و لكنها مختلفة عن البرمجة متعددة المسارات لأن معالج الرسوميات مصمم للقيام بعملية واحدة على بيانات كثيرة في نفس الوقت، و لذا فأن هذا النوع من البرمجة أسهل قليلا حيث أن كل برنامج يتم معالجته على رأس أو بكسل على حدة دون القلق بشأن التواصل و التزامن بين وحدات المعالجة المختلفة. لقد قمت بكتابة خوارزمية A* بشكل متوازي باستخدام واجهة MPI كمشروع لمادة البرمجة المتوازية و لكن لم أستطع الحصول على نتائج جيدة لأن طبيعة الخوارزمية لا تستفيد كثيراََ من البرمجة المتوازية (العثور على طريق معين إلى نقطة ما) و لو كنت كتبت البرنامج بشكل إستكشافي (العثور على طريق إلى أقرب نقطة من عدة نقاط) بحيث كل مسار يبحث في طريق مختلف لكنت حصلت على نتائج أفضل.وفي 07/ذو الحجة/1431 09:26 م، قال فراس أسعد متحمساً:
لقد قمت باستعمال طابور queue من أوامر الرسم. مسار المنطق يقوم بإضافة الأوامر إلى نهاية الطابور يينما مسار الرسوميات يقوم بمعالجة هذه الأوامر واحداََ تلو الآخر. هناك بعض التأخير لأنني لا أستطيع السماح لمسارين أن يستعملا الطابور في وقت واحد و لكن بشكل عام فإن النتيجة أفضل كثيراََ من استعمال مسار واحد.وفي 07/ذو الحجة/1431 09:26 م، ظهر شبح ابتسامة على وجه فراس أسعد وهو يقول:
أحب كيف أن الفصل بين المنطق و الرسوميات قد جعل تصميم المحرك أكثر... وحدوية (هل هذا هو المصطلح المناسب ل ؟modular design).أما في 07/ذو الحجة/1431 09:26 م، فقد تنهد فراس أسعد بارتياح وهو يرد:
البلايستيشن 3 مثال على نظام يتطلب البرمجة المتوازية حيث معالج الخلية أو سل Cell Processor يحتوي 8 أو 7 معالجات متخصصة كما أتذكر مما قرأت و تحتاج لتوزيع العمل على هذه المعالجات للحصول على نتائج جيدة (يقولون أن لعبة غران توريزمو 5 تقوم برسم 60 إطار بحجم 1080 في كل ثانية، هذا شيء مخيف!). إكس بوكس 360 لديه 3 معالجات و يستفيد من البرمجة متعددة المسارات أيضاََ.في 07/ذو الحجة/1431 09:26 م، غمغم فراس أسعد باستغراب قائلاً:
كم ترون فالكاتب يقول أن محركات الألعاب الحديثة أشبه بأنظمة التشغيل من حيث التعقيد و تقسيم المهام.في 16 نوفمبر 2010 04:21 م، غمغم وسام البهنسي باستغراب قائلاً:
هذا مثير للاهتمام. ربما خوارزمية "المحيط-أولاً" (breadth-first) أنسب للتطبيق في هذه الحالة؟بتاريخ 16 نوفمبر 2010 04:21 م، قطب وسام البهنسي حاجبيه بشدة وهو يقول:
هذا مشابه للحل الذي استخدمتُه في مشروع وحدة رسم الخرائط (مشابهة لجوجل إيرث). حيث يجب أن يستمر الرسم وتستمر الحركة أثناء تحميل الموارد والصور وتحسين جودتها. لكن الطابور في حالتي لم يكن مؤلفاً من أوامر، وإنما من "أسطر برمجية" يتم تكديسها في طابور يستهلكه مسار الرسم. الميزة الجميلة في هذا الأسلوب هي أن الكود الذي تريد أن تنفذه في المسار الثاني يقبع مع نفس كود الإجراء الذي يولد الأمر، وبالتالي فإن متابعة الكود سهلة وواضحة.وفي 16 نوفمبر 2010 04:21 م، أعرب وسام البهنسي عن رأيه بالموقف كالآتي:
لا تغرنك الأرقام. الكثير من الألعاب ترسم بدقة أقل وتقوم بتحجيم الصورة النهائية لتغطي 1080 بيكسل ارتفاعاً. بين البلايستيشن 3 والإكس بوكس 360، في EA (والكثير من الشركات الأخرى) توجد إشاعة تقول: برمج لعبتك لتعمل بالسرعة المطلوبة على البلايستيشن 3 ونحن نضمن لك أن تعمل بسرعة مكافئة أو أسرع على الإكس بوكس 360. تحقق هذا في لعبة بيرن آوت بارادايس Burnout Paradise وكانت النتيجة مرضية.في 10/ذو الحجة/1431 03:03 م، غمغم فراس أسعد باستغراب قائلاً:
مما فهمته من كلامك فأعتقد أننا نتحدث عن شيء مشابه. الأوامر التي تكلمتُ عنها هي كائنات تنحدر من واجهة DrawCommand و التي لديها وظيفة معالجة process().// هذا الحدث يتم نداؤه عند الانتهاء من تحميل بيانات من الإنترنت
void StreamManager::OnDataLoaded(int streamID)
{
// جلب خصائص البيانات المحملة
void *data = getStreamData(streamID);
uint dataSize = getStreamSize(streamID);
DataType type = getStreamType(streamID);
if (type == Type_Image)
{
// تم تحميل صورة. أرسلها لمسار الرسم كي يتم إنشاؤها على جهاز دايركت ثري دي
BEGIN_RENDER_COMMAND_3PARAM(int,streamID,void*,data,uint,dataSize)
{
// نحن الآن في مسار الرسم. فلننشئ الإكساء الذي سيحفظ الصورة
Texture *texture = renderer->createSquareTexture(dataSize);
void *textureData = texture->lock(); // قفل الإكساء
memcpy(textureData,data,dataSize); // ملؤه بالبيانات
texture->unlock(); // فك القفل
renderer->setGlobePatchImage(streamID,texture); // تسجيل الصورة مع نظام الرسم لتظهر في اللقطة القادمة
}
END_RENDER_COMMAND;
// نحن في المسار الرئيسي هنا... عند هذا السطر تكون الأسطر أعلاه قد دخلت في طابور التنفيذ
// لكنها لم تنفذ بعد بالضرورة...
}
}
بتاريخ 10/ذو الحجة/1431 03:03 م، قطب فراس أسعد حاجبيه بشدة وهو يقول:
ماذا عنك يا أخ وسام. هلا حدثتنا المزيد عن خبرتك الشخصية مع المحركات متعددة المسار. الأمر يتحول إلى كابوس كما قلت و لكن لا مفر من التعامل مع المسارات المتعددة. لقد قرأت أن العديد من الألعاب تستخدم مساراََ خاصاََ بالفيزياء، إضافة إلى حوض للمسارات thread pool حيث يتم اضافة أوامر إليه ليتم تنفيذها في نفس الوقت. مكتبة OpenMP مستخدمة في بعض البرامج حيث يمكنك استعمال أوامر قبل المعالجة preprocessor directives لتقول مثلا أن حلقة for القادمة يجب تنفيذها بشكل متوازي.....