مكتبة للسماح لكتابة البرامج النصية للوحدة في الكود الأصلي: C ، C ++ ، التجميع.
يهدف هذا المشروع إلى منحك بديلاً قابلاً للتطبيق لـ C#. البرمجة النصية في C ++ ليست مناسبة لجميع أجزاء كل مشروع ، لكنها الآن خيار.
يتطلب تغيير سطر واحد من رمز C# إنشاء بناء جديد للعبة. تميل أوقات بناء Android النموذجية إلى 10 دقائق على الأقل لأن IL2CPP يجب أن يتم تشغيله ومن ثم يجب تجميع كمية ضخمة من C ++.
باستخدام C ++ ، يمكننا تجميع اللعبة كمساعد C ++ في حوالي ثانية واحدة ، وتبديل المكون الإضافي في APK ، ثم تثبيت اللعبة وتشغيلها على الفور. هذه دفعة إنتاجية ضخمة!
C ++ يجمع بسرعة أكبر بكثير من C#. تبني تدريجي عندما يتغير ملف واحد فقط- يمكن أن يكون البناء الأكثر شيوعًا- أسرع 15x من C#. يضيف تجميع أسرع مع مرور الوقت إلى مكاسب الإنتاجية. أوقات التكرار الأسرع تجعل البقاء في "تدفق" البرمجة.
جامع القمامة Unity إلزامي ولديه الكثير من المشاكل. إنه بطيء ، يعمل على الخيط الرئيسي ، ويجمع جميع القمامة في آن واحد ، ويجد الكومة ، ولا يقلل من الكومة. لذا فإن لعبتك ستختبر "عوامل الإطار" ، وفي النهاية ستنفد الذاكرة والتعطل.
هناك حاجة إلى قدر كبير من الجهد للعمل حول GC ويصعب الحفاظ على الكود الناتج. ويشمل ذلك تقنيات مثل تجمعات الكائنات ، والتي تجعل دليل إدارة الذاكرة بشكل أساسي. يجب عليك أيضًا تجنب أنواع قيمة الملاكمة مثل int إلى أنواع المدارة مثل object ، وليس استخدام حلقات foreach في بعض المواقف ، والعديد من مسلسلات أخرى.
لا يحتوي C ++ على جامع القمامة المطلوب ويتميز بإدارة الذاكرة الأوتوماتيكية الاختيارية عبر أنواع "المؤشر الذكي" مثل المشاركين. إنه يوفر بدائل ممتازة لجامع القمامة البدائي في Unity.
أثناء استخدام بعض واجهات برمجة التطبيقات .NET لا يزال ينطوي على إنشاء القمامة ، يتم احتواء المشكلة على واجهات برمجة التطبيقات فقط بدلاً من أن تكون مشكلة منتشرة لجميع التعليمات البرمجية الخاصة بك.
باستخدام C ++ مباشرة ، يمكنك الحصول على تحكم كامل على الكود الذي ستنفذه وحدة المعالجة المركزية. من الأسهل بكثير إنشاء التعليمات البرمجية الأمثل باستخدام برنامج التحويل البرمجي C ++ مقارنةً بمترجم C# ، IL2CPP ، وأخيراً برنامج التحويل البرمجي C ++. قم بقطع الرجل المتوسط ويمكنك الاستفادة من جوادات التحويل البرمجي أو التجميع لكتابة رمز الجهاز مباشرة باستخدام ميزات وحدة المعالجة المركزية القوية مثل SIMD و AES AES من أجل مكاسب الأداء الضخمة.
C ++ هي لغة أكبر بكثير من C# وسوف يفضل بعض المطورين الحصول على المزيد من الأدوات تحت تصرفهم. فيما يلي بعض الاختلافات:
بينما يحول IL2CPP C# إلى C ++ بالفعل ، فإنه يولد الكثير من النفقات العامة. هناك العديد من المفاجآت إذا قرأت من خلال C ++ التي تم إنشاؤها. على سبيل المثال ، هناك النفقات العامة لأي وظيفة باستخدام متغير ثابت ويتم تخزين مؤشرتين إضافيتين في بداية كل فئة. وينطبق الشيء نفسه على جميع أنواع الميزات مثل sizeof() ، والشيكات الفارغة الإلزامية ، وما إلى ذلك. بدلاً من ذلك ، يمكنك كتابة C ++ مباشرة ولا تحتاج إلى العمل حول IL2CPP.
C ++ هي اللغة القياسية لألعاب الفيديو بالإضافة إلى العديد من الحقول الأخرى. من خلال البرمجة في C ++ ، يمكنك بسهولة نقل مهاراتك ورمزك من وإلى المشاريع غير الوالية. على سبيل المثال ، يمكنك تجنب القفل باستخدام نفس اللغة (C ++) التي تستخدمها في محركات Unreal أو Lumberyard.
GameObject go;
Transform transform = go.GetTransform();
Vector3 position(1.0f, 2.0f, 3.0f);
transform.SetPosition(position);
MonoBehaviour في C ++ void MyScript::Start()
{
String message("MyScript has started");
Debug::Log(message);
}
#if TARGET_OS_ANDROID )جوهر هذا المشروع هو مولد رمز. يقوم بإنشاء رمز C# و C ++ يسمى "Bindings" الذي يجعل C# APIs متاحًا لرمز لعبة C ++. وهو يدعم مجموعة واسعة من ميزات اللغة:
classstructenumAction )decimalget set مثل obj.x )get set مثل obj[x] )add remove المندوبين)int إلى object والعكس بالعكس)out refلاحظ أن مولد الرمز لا يدعم بعد:
Array string object (مثل GetHashCode )params الضمنية (AKA "var args") المارة لتكوين مولد الرمز ، افتح Unity/Assets/NativeScriptTypes.json وألاحظ الأمثلة الحالية. أضف إلى هذا الملف لفضح المزيد من واجهات برمجة تطبيقات C# من الوحدة أو .NET أو DLLs المخصصة إلى رمز C ++ الخاص بك.
لتشغيل مولد الرمز ، اختر NativeScript > Generate Bindings من محرر الوحدة.
ستشهد جميع المشاريع تقريبًا فوزًا صافيًا للأداء عن طريق تقليل جمع القمامة ، والقضاء على IL2CPP النفقات العامة ، والوصول إلى الآلات والتجميع المترجم. مكالمات من C ++ إلى C# تتحمل فقط عقوبة أداء بسيطة. في حالة نادرة أن جميع الكود تقريبًا هو المكالمات إلى .NET APIs ، قد تواجه خسارة صافية في الأداء.
مقال الاختبار والمعايير
مقالة التحسينات
عند استخدام البرمجة النصية في C ++ ، يتم استخدام C# فقط كطبقة "ملزمة" بحيث يمكن للوحدة استدعاء وظائف C ++ ويمكن للوظائف C ++ استدعاء واجهة برمجة تطبيقات الوحدة. يتم استخدام مولد الرمز لإنشاء معظم هذه الروابط وفقًا لاحتياجات مشروعك.
جميع التعليمات البرمجية الخاصة بك ، بالإضافة إلى بعض الارتباطات ، ستكون موجودة في مكون إضافي C ++ "الأصلي". عند تغيير رمز C ++ الخاص بك ، ستقوم بإنشاء هذا البرنامج المساعد ثم تقوم بتشغيل اللعبة في المحرر أو في بناء تم نشره (على سبيل المثال إلى جهاز Android). لن يكون هناك أي رمز C# لتجميع الوحدة إلا إذا قمت بتشغيل مولد الرمز ، وهو أمر نادر الحدوث.
يبدو أن سير عمل C# القياسي مثل هذا:
مع C ++ ، يبدو سير العمل هكذا:
Unity/Assets إلى دليل Assets مشروع الوحدة الخاص بكNativeScriptTypes.json وحدد أجزاء من الوحدة و .NET و APIs المخصصة التي تريد الوصول إليها من C ++.Unity/Assets/CppSource/Game/Game.cpp و Unity/Assets/CppSource/Game/Game.h لإنشاء لعبتك. يتم توفير بعض رمز المثال ، ولكن لا تتردد في حذفه. يمكنك إضافة المزيد من ملفات C ++ ( .cpp ) وملفات الرأس ( .h ) هنا مع نمو لعبتك./Applications/Utilitiescd /path/to/your/build/directorycmake -G MyGenerator -DCMAKE_TOOLCHAIN_FILE=/path/to/your/project/CppSource/iOS.cmake /path/to/your/project/CppSource . استبدل MyGenerator بالمولد الذي تختاره. لمشاهدة الخيارات ، قم بتنفيذ cmake --help وانظر إلى القائمة في الأسفل. تتضمن الخيارات الشائعة "Unix Makefiles" للبناء من سطر الأوامر أو "Xcode" لاستخدام IDE من Apple.make إذا اخترت Unix Makefiles كمولد أو فتح NativeScript.xcodeproj وانقر فوق Product > Build إذا اخترت Xcode. /Applications/Utilitiescd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . استبدل MyGenerator بالمولد الذي تختاره. لمشاهدة الخيارات ، قم بتنفيذ cmake --help وانظر إلى القائمة في الأسفل. تتضمن الخيارات الشائعة "Unix Makefiles" للبناء من سطر الأوامر أو "Xcode" لاستخدام IDE من Apple. إزالة -DEDITOR=TRUE للبناء المستقل.make إذا اخترت Unix Makefiles كمولد أو فتح NativeScript.xcodeproj وانقر فوق Product > Build إذا اخترت Xcode. cd /path/to/your/build/directorycmake -G "Visual Studio VERSION YEAR Win64" -DEDITOR=TRUE /path/to/your/project/CppSource . استبدل VERSION YEAR بإصدار Visual Studio الذي تريد استخدامه. لمشاهدة الخيارات ، قم بتنفيذ cmake --help وانظر إلى القائمة في الأسفل. على سبيل المثال ، استخدم "Visual Studio 15 2017 Win64" لـ Visual Studio 2017. أي إصدار ، بما في ذلك المجتمع ، يعمل بشكل جيد. إزالة -DEDITOR=TRUE للبناء المستقل. إذا كنت تستخدم Visual Studio 2019 ، فقم بتنفيذ cmake -G "Visual Studio 16" -A "x64" -DEDITOR=TRUE /path/to/your/project/CppSource بدلاً من ذلك.NativeScript.sln وانقر فوق Build > Build Solution . cd /path/to/your/build/directorycmake -G "MyGenerator" -DEDITOR=TRUE /path/to/your/project/CppSource . استبدل MyGenerator بالمولد الذي تختاره. لمشاهدة الخيارات ، قم بتنفيذ cmake --help وانظر إلى القائمة في الأسفل. الخيار الأكثر شيوعًا هو "Unix Makefiles" للبناء من سطر الأوامر ، ولكن هناك خيارات IDE أيضًا. إزالة -DEDITOR=TRUE للبناء المستقل.make إذا اخترت Unix Makefiles كمولدك. cd /path/to/your/build/directorycmake -G MyGenerator -DANDROID_NDK=/path/to/android/ndk /path/to/your/project/CppSource . Replace MyGenerator with the generator of your choice. لمشاهدة الخيارات ، قم بتنفيذ cmake --help وانظر إلى القائمة في الأسفل. لإنشاء بناء لأي منصة أخرى غير Android ، حذف -DANDROID_NDK=/path/to/android/ndk .make إذا اخترت Unix Makefiles كمولدك. للتحديث إلى إصدار جديد من هذا المشروع ، قم بالكتابة فوق دليل Assets/NativeScript لمشروع Unity مع دليل Unity/Assets/NativeScript لهذا المشروع وإعادة تشغيل مولد الرمز.
مقالات للمؤلف تصف تطوير هذا المشروع.
جاكسون دونستان
لا تتردد في الشوكة وإرسال طلبات السحب أو ببساطة إرسال مشكلة للميزات أو إصلاحات الأخطاء.
جميع التعليمات البرمجية مرخصة ، مما يعني أنه يمكن استخدامه بسهولة في التطبيقات التجارية وغير التجارية.
يتم ترخيص جميع الكتابة CC بحلول 4.0 ، مما يعني أنه يمكن استخدامه طالما يتم إعطاء الإسناد.