مع دعم Luau لإنشاء التعليمات البرمجية الأصلية، يمكن تجميع النصوص البرمجية من جانب الخادم في لعبتك مباشرةً إلى التعليمات الآلية التي تنفذها وحدات المعالجة المركزية، بدلاً من التعليمات البرمجية العادية التي تعمل عليها VM الخاصة بـ Luau. يمكن استخدام هذه الميزة لتحسين سرعة التنفيذ لبعض النصوص البرمجية على الخادم، وخاصةً تلك التي تحتوي على الكثير من الحسابات العددية دون استخدام الكثير من مكتبات Luau الثقيلة أو مكالمات واجهة برمجة التطبيقات Roblox.
تمكين إنشاء التعليمات البرمجية الأصلية
لتمكين إنشاء التعليمات البرمجية الأصلية لـ Script، أضف تعليق --!native في الأعلى:¹
--!nativeprint("مرحبا من التعليمات البرمجية الأصلية!")
يمكن أن يسمح هذا بإنشاء التعليمات البرمجية الأصلية لجميع الدوال في النص البرمجي، والنطاق العلوي، إذا كان ذلك مفيدًا. لا تتطلب أي تغييرات إضافية؛ سلوك النصوص البرمجية التي تنفذ محليًا هو نفسه تمامًا كما كان من قبل، والفرق هو فقط في الأداء. تظل جميع ميزات لغة Luau وجميع واجهات برمجة التطبيقات Roblox مدعومة.
بدلاً من ذلك، يمكنك تمكين إنشاء التعليمات البرمجية الأصلية لوظيفة فردية من خلال إضافة السمة @native:
@native
local function f(x)
return (x + 1)
end
أفضل الممارسات
ستساعدك النصائح التالية على الاستفادة القصوى من إنشاء التعليمات البرمجية الأصلية:
من الأفضل تمكين هذه الميزة داخل النصوص البرمجية التي تقوم بالكثير من الحسابات مباشرةً داخل Luau. إذا كان لديك الكثير من العمليات الرياضية على الجداول وخاصةً أنواع buffer، فقد يكون النص البرمجي مرشحًا جيدًا.
يُوصى بأن تقيس الوقت الذي يستغرقه نص برمجي أو دالة مع وبدون تجميع محلي لتحديد متى يكون من الأفضل استخدامه. يمكن لأداة مُحلل النص قياس أداء الدوال من أجل اتخاذ قرارات مستنيرة.
قد يكون من المغري وضع التعليق --!native في كل نص برمجي فقط في حال كانت بعض النصوص ستنفذ بشكل أسرع، لكن إنشاء التعليمات البرمجية الأصلية له بعض العيوب:
- وقت تجميع الشيفرة مطلوب مما قد يزيد من وقت بدء تشغيل الخوادم.
- يتم شغل ذاكرة إضافية لتخزين التعليمات البرمجية المجمعة محليًا.
- هناك حد للإجمالي المسموح به من التعليمات البرمجية المجمعة محليًا في اللعبة.
يمكن معالجة هذه المشاكل من خلال استخدام judicious لسمة @native.
الشيفرة التي يجب تجنبها
بينما ستتصرف جميع الميزات بنفس الطريقة مع أو بدون تمكين إنشاء التعليمات البرمجية الأصلية، فلن تعمل بعضها محليًا وقد تؤدي إلى انخفاض الأداء أو العودة للتنفيذ المفسر. تشمل هذه:
- استخدام وظائف Luau المدمجة المختلفة مثل math.asin() مع معايير غير رقمية.
- تمرير معلمات غير صحيحة الأنماط إلى الدوال المطبقة أنماط، على سبيل المثال استدعاء foo(true) عندما يتم إعلان foo كـ function foo(arg: string). تذكر دائمًا استخدام توصيفات الأنواع الصحيحة.
عند استخدام مُحلل النص، يمكنك مقارنة الوقت المستغرق بواسطة النسخة العادية من الدالة مقابل النسخة المجمعة محليًا. إذا لم تظهر دالة داخل نص برمجي --!native أو محددة بـ @native كما هي تنفذ محليًا، فقد تكون واحدة أو أكثر من العوامل من القائمة أعلاه تسبب انخفاض الأداء.
استخدم توصيفات الأنواع
يحاول إنشاء التعليمات البرمجية الأصلية استنتاج أكثر الأنواع احتمالًا لمتغير معين من أجل تحسين مسارات الشيفرة. على سبيل المثال، يُفترض أن a + b يتم تنفيذه على أرقام، أو أن جدولًا تم الوصول إليه في t.X. ومع ذلك، نظرًا لتحميل المشغل، قد تكون a و b جداول أو أنواع Vector3، أو قد يكون t نوع بيانات Roblox.
بينما سيقوم إنشاء التعليمات البرمجية الأصلية بدعم أي نوع، فإن التوقعات الخاطئة قد تؤدي إلى تفعيل فحوصات غير ضرورية، مما يؤدي إلى تنفيذ شيفرة أبطأ.
لحل بعض المشكلات الشائعة، يتم التحقق من توصيفات أنواع Luau على المعلمات الخاصة بالدوال، ولكن يُوصى بشكل خاص بتوصيف معلمات Vector3:
--!native
-- "v" يُفترض أن يكون جدولاً؛ تعمل الدالة ببطء بسبب فحوصات الجدول
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- "v" مُعلن أنها Vector3؛ يتم إنشاء الشيفرة المتخصصة للمتجهات
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end
أدوات الاستوديو
تدعم أدوات الاستوديو التالية النصوص البرمجية --!native والدوال @native.
تصحيح الأخطاء
يدعم تصحيح الأخطاء العامة debugging للنصوص البرمجية، لكن قد تكون النظرات المحلية/الترويسية غير مكتملة وتفتقد المتغيرات من إطارات صندوق الاتصال التي تعمل محليًا.
أيضًا لاحظ أنه عند تصحيح الأخطاء في الشيفرة المحددة للتجميع المحلي، فإن وضع نقاط التوقف سيعطل التنفيذ المحلي لتلك الدوال.
مُحلل النص
في مُحلل النص، تظهر الدوال التي تنفذ محليًا علامة <native> بجانبها:

إذا لم تظهر دالة موسومة بـ @native أو داخل نص برمجي --!native علامة <native>، فقد لا تكون تلك الدالة تعمل محليًا بسبب وضع نقاط التوقف، أو استخدام الشيفرة الممنوعة، أو عدم توافق توصيفات الأنواع.
الذاكرة في Luau
في مُحلل ذاكرة Luau، تُعرض الذاكرة التي تأخذها الدوال المحلية كعناصر [native] في الرسم البياني.

تحليل الحجم
تستهلك كل نص برمجي مُجمع محليًا ذاكرة. عندما يصل حجم الشيفرة المجمعة إلى حد محدد مسبقًا، يتوقف التجميع المحلي وتُنفذ الشيفرة المتبقية بشكل غير محلي. يجعل هذا من الضروري اختيار النصوص بعناية للتجميع المحلي.
لمراقبة حجم الشيفرة المحلية للوظائف والنصوص البرمجية الفردية:
- تأكد من أنك في عرض الخادم من خلال زر تبديل العميل/الخادم.
- استدعاء debug.dumpcodesize() من شريط الأوامر.
في نافذة الإخراج، سترى العدد الإجمالي للنصوص والدوال التي تم تجميعها محليًا حتى نقطة الاستدعاء، والذاكرة التي تستهلكها تعليماتهم البرمجية المحلية، وحدود حجم التعليمات البرمجية الأصلية. بعد الملخص، ستظهر لك جدول لكل نص برمجي مُجمع محليًا بترتيب تنازلي حسب حجم الشيفرة.

بالنسبة لكل نص برمجي، تعرض الإخراج عدد الدوال المجمعة واستهلاك ذاكرة التعليمات البرمجية المحلية. ثم يتم سرد كل دالة بترتيب تنازلي حسب حجم التعليمات البرمجية المحلية، مع عرض الوظائف المجهولة كـ [مجهول] والنصوص البرمجية الكاملة كـ [المستوى الأعلى]. في العمود الأخير، يتم حساب النسبة المئوية بالنسبة لحد حجم التعليمات البرمجية المحلية. لاحظ أن حجم التعليمات البرمجية المحلية للدوال يتم الإبلاغ عنه بدقة، ولكن يتم تقريب استهلاك الذاكرة للنصوص البرمجية إلى أقرب حجم صفحة.
الحدود واستكشاف الأخطاء وإصلاحها
يتطلب تجميع التعليمات البرمجية إلى تعليمات لوحدة معالجة مركزية معينة ذاكرة تخزين إضافية. بالإضافة إلى ذلك، قد تستغرق التحسينات للدوال المعقدة وقتًا طويلاً جدًا. قد يؤدي الوصول إلى حد داخلي إلى الإبلاغ عن خطأ في نافذة الإخراج في الاستوديو، بما في ذلك:
الدالة 'f' عند السطر 20 تجاوزت حد تعليمات كتل الشيفرة الواحدة
يعني هذا الخطأ أن كتلة واحدة من الشيفرة داخل دالة استخدمت أكثر من 64K من التعليمات. يمكن تجنب ذلك عن طريق تبسيط الدالة أو تقسيمها إلى دوال أصغر منفصلة.
الدالة 'f' عند السطر 20 تجاوزت حد كتل الشيفرة للدالة
يعني هذا الخطأ أن دالة واحدة تحتوي على أكثر من 32K من الكتل الداخلية للشيفرة. لا تتطابق الكتل الداخلية للشيفرة بالضبط مع كتل تدفق التحكم في نصك، ولكن يمكن تجنب هذا الخطأ عن طريق تبسيط تدفق التحكم في الدالة أو تقسيمها إلى دوال أصغر منفصلة.
الدالة 'f' عند السطر 200 تجاوزت الحد الإجمالي للتعليمات الخاصة بالوحدة
يعني هذا الخطأ أنه، في المجمل، وصلت الدالة إلى حد 1 مليون تعليمات للنص البرمجي بأكمله. في بعض الحالات، قد تحتوي الدالة المعنية نفسها على الكثير من التعليمات، أو قد يتم الوصول إلى الحد بواسطة دوال سابقة في النص البرمجي. لتجنب هذه المشكلة، يُوصى إما بنقل الدوال الكبيرة إلى نص برمجي غير محلي منفصل أو استخدام @native على الدوال الأخرى. يمكنك أيضًا محاولة وسم ذلك النص البرمجي المنفصل بـ --!native، ولكن 1 مليون تعليمات تتطلب الكثير من الذاكرة وقد تتجاوز الحد المسموح به للذاكرة.
الدالة 'f' عند السطر 20 واجهت فشلًا داخليًا في التخفيض (أو)
خطأ داخلي: فشل إنشاء التعليمات البرمجية الأصلية (تخفيض التجميع)
في بعض الأحيان تحتوي دالة على أجزاء معقدة من الشيفرة التي لا يمكن لمجمع التعليمات البرمجية الأصلية حاليًا التعامل معها. لتجنب هذا الخطأ، تحقق من التعبيرات المعقدة في الشيفرة وقم بتبسيطها أو تقسيمها، ولكن فكر أيضًا في فتح تقرير خطأ مع مثال الشيفرة التي فشلت لهذا السبب.
تم الوصول إلى حد تخصيص الذاكرة لإنشاء التعليمات البرمجية الأصلية
يعني هذا الخطأ أنك قد وصلت إلى الحد العام لذاكرة بيانات التعليمات البرمجية الأصلية. لتجنب ذلك، حاول إزالة --!native من النصوص البرمجية الأكثر استهلاكًا للذاكرة، مما يسمح لمزيد من النصوص البرمجية الأصغر بالملاءمة تحت الحد. بدلاً من ذلك، انقل الدوال الكبيرة أو النادرة الاستدعاء إلى وحدة غير محلية منفصلة.