سؤال

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

نظرًا لأنه تطبيق في الوقت الفعلي، أحتاج إلى نوع من المهام المتعددة لهذه البرامج النصية.من الناحية المثالية، أريد ذلك بحيث يستدعي تطبيق c++ وظيفة البرنامج النصي التي تستمر بعد ذلك في التشغيل (ضمن مؤشر ترابط c++) حتى نقطة توقف مؤقت (Wait(x))، أو تعود.في حالة الانتظار، يجب حفظ الحالة جاهزة لإعادة تشغيل البرنامج النصي في المرة التالية التي يتكرر فيها التطبيق بعد انتهاء المدة.

تحتاج البرامج النصية أيضًا إلى أن تكون قادرة على استدعاء أساليب فئة c++، ومن الأفضل استخدام فئات c++ بدلاً من وظائف الغلاف العادية حول فئات c++.

لا أرغب في قضاء وقت طويل في تنفيذ ذلك، لذا يُفضل استخدام لغة برمجة نصية موجودة بدلاً من كتابة لغتي الخاصة.سمعت أنه يمكن دمج Python وLua في تطبيق C++، لكنني لا أعرف كيفية القيام بذلك لتحقيق أهدافي.

  • يجب أن تكون البرامج النصية قادرة على استدعاء وظائف c++
  • يجب أن تكون البرامج النصية قادرة على "الإيقاف المؤقت" عند استدعاء وظائف معينة (على سبيل المثال.انتظر)، وسيتم إعادة تشغيله مرة أخرى بواسطة مؤشر ترابط c++
  • يجب أن يكون سريعًا - هذا تطبيق في الوقت الفعلي ومن المحتمل أن يكون هناك الكثير من البرامج النصية قيد التشغيل.

من المحتمل أن أتمكن من إنشاء كود تعدد المهام بسهولة إلى حد ما، بشرط إمكانية حفظ البرامج النصية وإعادة تشغيلها (ربما من خلال مؤشر ترابط مختلف عن النص الأصلي).

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

المحلول

يمكنك استخدام Lua أو Python.لوا أكثر "خفيفة الوزن" من بايثون.إنها تحتوي على مساحة ذاكرة أصغر من لغة بايثون، وفي تجربتنا كان من الأسهل دمجها (قد يختلف عدد الأميال التي يقطعها الأشخاص في هذه النقطة).يمكنه دعم مجموعة من البرامج النصية التي تعمل في وقت واحد.تدعم Lua، على الأقل، إيقاف/بدء سلاسل المحادثات بالطريقة التي تريدها.

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

لقد قمنا ببناء Lua في التطبيقات على منصات متعددة (Win32 وXbox360 وPS3).وأعتقد أنه سيعمل على x64.اقتراح استخدام Luabind جيد.لقد انتهينا من كتابة الواجهة الخاصة بنا بين الاثنين، وعلى الرغم من أنها ليست معقدة للغاية، فإن الحصول على رمز الغراء هذا سيوفر لك الكثير من الوقت وربما تفاقم المشكلة.

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

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

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

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

نصائح أخرى

يمكنني أن أوصي بشدة بإلقاء نظرة على لوابيند.إنه يجعل من السهل جدًا دمج Lua في كود C++ الخاص بك والعكس.من الممكن أيضًا الكشف عن فئات C++ بأكملها لاستخدامها في Lua.

أفضل رهان لك هو تضمين lua (www.lua.org) أو python (www.python.org).يتم استخدام كلاهما في صناعة الألعاب وكلاهما يصل إلى وظائف "C" الخارجية بسهولة نسبيًا مع وجود ميزة lua هنا (لأن أنواع البيانات أسهل في الترجمة بين lua وC).سيكون التواصل مع كائنات C++ أكثر صعوبة من جانبك، ولكن يمكنك البحث عن كيفية القيام بذلك على Google، أو في منتديات مناقشة lua أو python.

أتمنى أن يساعد ذلك!

يمكنك بالتأكيد أن تفعل ما تريد باستخدام بايثون. فيما يلي المستندات الخاصة بتضمين Python في التطبيق. أنا متأكد من أن لوا ستعمل أيضًا، لكني أقل دراية بها.

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

نلقي نظرة على Boost.Python مكتبة.يبدو أنه يجب أن يكون الأمر واضحًا إلى حد ما لفعل ما تريد.

نلقي نظرة على جرعة كبيرة.لقد استخدمته للتفاعل مع بايثون، لكنه يدعم العديد من اللغات الأخرى.

صوت آخر لوا.إنه صغير وسريع ولا يستهلك الكثير من الذاكرة (بالنسبة للألعاب، أفضل رهان لك هو تخصيص مخزن مؤقت كبير عند التهيئة وإعادة توجيه كافة تخصيصات ذاكرة Lua هناك).لقد استخدمنا tolua لإنشاء الارتباطات، ولكن هناك خيارات أخرى، معظمها أصغر/أسهل في الاستخدام (IMO) من Boost.python.

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

يمكنك أيضًا تضمين البرامج النصية C/C++ باستخدام الفصل.لقد كنت أستخدمه في مشروع لعبة أعمل عليه، وهو يعمل بشكل جيد.مزيج جميل من القوة والقدرة على التكيف.

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