سؤال

وأنا أعمل على لعبة RTS في C ++ التي تستهدف الأجهزة المحمولة (باندورا). للإشارة، فإن باندورا يحتوي على معالج ARM واحد في ~ 600MHZ ويدير لينكس. نحاول تسوية على نظام عابرة رسالة جيدة (داخليا وخارجيا)، وهذا هو منطقة جديدة بالنسبة لي.

ومما قد يساعد على إعطاء مثال على الرسالة التي ترغب في تمرير. وحدة قد تجعل هذه الدعوة لتحميل نماذجها في الذاكرة:

وsendMessage("model-loader", "load-model", my_model.path, model_id );

في المقابل، يمكن أن الوحدة يتوقع نوعا من رسالة تحتوي على كائن نموذج لMODEL_ID وجه الخصوص، ومن ثم يمكن تمريرها إلى نظام الرسومات. يرجى ملاحظة أن هذه دالة SendMessage هي بأي حال من الأحوال النهائي. وهو يعكس فقط فهمي الحالي لنظم رسالة عابرة، والتي ربما تكون غير صحيحة:)

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

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

وMPI يبدو أن شعبية للرسالة التي تمر لكن من المؤكد يشعر وكأنه مبالغة على ما نريد. هذا الرمز هو لم يذهب للمس كتلة أو عليك القيام به حساب الثقيل.

وهو محل تقدير كبير أي نظرة ثاقبة ما هي الخيارات المتاحة لدينا لتحقيق ذلك.

هل كانت مفيدة؟

المحلول

والشبكة وسيتم استخدام قفل كذلك. وسيكون فقط حيث لا يمكنك رؤيتها، في نواة نظام التشغيل.

ما أود القيام به هو خلق الخاصة الكائن قائمة انتظار الرسائل التي يمكنك إعادة كتابة كما كنت في حاجة إليها. تبدأ بسيطة وجعله أفضل حسب الحاجة. وبهذه الطريقة يمكن أن تجعل من استخدام أي تطبيق تريد من وراء الكواليس دون تغيير بقية التعليمات البرمجية.

وبحث في العديد من تطبيقات المحتملة التي قد ترغب في القيام به في المستقبل وتصميم API الخاص بك بحيث يمكنك التعامل مع كل منهم بكفاءة إذا قررت تنفيذها في تلك الشروط.

إذا كنت تريد رسالة فعالة حقا يمر نظرة على بعض من تصميم النوية microkernel L4 مفتوحة المصدر. هؤلاء الرجال وضع <م> الكثير من الوقت في رسالة سريعة عابرة.

نصائح أخرى

وبما أن هذا هو منصة صغيرة، قد يكون من المفيد توقيت كلا النهجين.

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

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

وأنا أتفق مع توصية زان لتمرير الرسائل في الذاكرة كلما أمكن ذلك.

وسبب واحد هو أنه يمكنك تمرير كائنات معقدة C ++ دون الحاجة إلى حشد وunmarshal (تسلسل وإلغاء تسلسل) لهم.

وتكلفة حماية انتظار رسالتك مع إشارة على الأرجح ستكون أقل من تكلفة صنع الشبكات المكالمات التعليمات البرمجية.

إذا كنت حماية انتظار رسالتك مع بعض خوارزمية خالية من قفل (باستخدام عمليات نووية كما ألمح إلى نفسك) يمكنك تجنب الكثير مفاتيح سياق داخل وخارج النواة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top