ด้วยความสามารถการสร้างรหัสเนทีฟของ Luau สคริปต์ด้านเซิร์ฟเวอร์ในเกมของคุณสามารถถูกคอมไพล์โดยตรงเป็นคำสั่งรหัสเครื่องที่ CPU ดำเนินการ แทนที่จะเป็นไบต์โค้ดปกติที่ VM ของ Luau ใช้งานอยู่ คุณสมบัตินี้สามารถใช้เพื่อปรับปรุงความเร็วในการดำเนินการสำหรับสคริปต์บางตัวบนเซิร์ฟเวอร์ โดยเฉพาะอย่างยิ่งสำหรับสคริปต์ที่มีการคำนวณทางตัวเลขมากโดยไม่ต้องเรียกใช้ไลบรารี Luau หรือ API ของ Roblox มากเกินไป
เปิดใช้งานการสร้างรหัสเนทีฟ
เพื่อเปิดใช้งานการสร้างรหัสเนทีฟสำหรับ Script ให้เพิ่มความคิดเห็น --!native ที่ด้านบน:¹
--!nativeprint("สวัสดีจากรหัสเนทีฟ!")
สิ่งนี้จะเปิดใช้งานการสร้างรหัสเนทีฟสำหรับฟังก์ชันทั้งหมดในสคริปต์ และบริบทระดับสูง หากได้รับการพิจารณาว่าเป็นประโยชน์ อีกทั้งไม่มีการเปลี่ยนแปลงเพิ่มเติมใดๆ พฤติกรรมของสคริปต์ที่ดำเนินการตามเนทีฟจะเหมือนกันกับก่อนหน้านี้ และต่างกันเพียงเรื่องประสิทธิภาพ ฟีเจอร์ทั้งหมดของภาษาจู้อูและ API ของ Roblox ยังคงได้รับการสนับสนุน
นอกจากนี้ คุณยังสามารถเปิดใช้งานการสร้างรหัสเนทีฟสำหรับฟังก์ชันแต่ละตัวได้โดยการเพิ่มแอตทริบิวต์ @native:
@native
local function f(x)
return (x + 1)
end
ข้อปฏิบัติที่ดีที่สุด
คำแนะนำต่อไปนี้จะช่วยคุณให้ได้รับประโยชน์สูงสุดจากการสร้างรหัสเนทีฟ:
ควรเปิดใช้งานฟีเจอร์นี้ภายในสคริปต์ที่ทำการคำนวณมากภายใน Luau โดยตรง หากคุณมีการดำเนินการทางคณิตศาสตร์มากมายเกี่ยวกับตารางและโดยเฉพาะอย่างยิ่งประเภท buffer สคริปต์นั้นอาจเป็นผู้สมัครที่ดี
แนะนำให้คุณวัดเวลาที่สคริปต์หรือฟังก์ชันใช้ด้วยและโดยไม่ต้องคอมไพล์เป็นเนทีฟเพื่อตัดสินใจว่าเมื่อไหร่ควรใช้มัน เครื่องมือ Script Profiler สามารถวัดประสิทธิภาพของฟังก์ชันเพื่อช่วยให้คุณทำการตัดสินใจ
อาจเป็นการชักชวนให้ใส่ความคิดเห็น --!native ใน ทุก สคริปต์เพียงในกรณีที่บางสคริปต์จะทำงานได้เร็วขึ้น แต่การสร้างรหัสเนทีฟมีข้อเสียบางประการ:
- ต้องใช้เวลาในการคอมไพล์รหัสซึ่งอาจทำให้เวลาเริ่มต้นของเซิร์ฟเวอร์นานขึ้น
- ต้องใช้หน่วยความจำเพิ่มเติมเพื่อเก็บรหัสที่คอมไพล์ในรูปแบบเนทีฟ
- มีการจำกัดจำนวนรหัสที่คอมไพล์เป็นเนทีฟทั้งหมดในเกม
ปัญหาเหล่านี้สามารถจัดการได้โดยการใช้แอตทริบิวต์ @native อย่างระมัดระวัง
รหัสที่ควรหลีกเลี่ยง
แม้ว่าฟีเจอร์ทั้งหมดจะทำงานได้เหมือนกันทั้งเปิดหรือปิดการสร้างรหัสเนทีฟ แต่บางฟีเจอร์อาจไม่สามารถทำงานในรูปแบบเนทีฟและอาจทำให้เกิด de-optimization หรือกลับไปใช้การดำเนินการแบบแปลได้ สิ่งเหล่านี้รวมถึง:
- การใช้ฟังก์ชันที่สร้างอยู่ภายในของ Luau ที่หลากหลายเช่น math.asin() กับอาร์กิวเมนต์ที่ไม่ใช่ตัวเลข
- การส่งพารามิเตอร์ที่มีประเภทไม่ถูกต้องไปยังฟังก์ชันที่มีประเภท เช่นการเรียก foo(true) เมื่อ foo ถูกประกาศเป็น function foo(arg: string) อย่าลืมใช้ การระบุประเภท ให้ถูกต้องเสมอ
เมื่อใช้ Script Profiler คุณสามารถเปรียบเทียบเวลาที่ใช้โดยฟังก์ชันเวอร์ชันธรรมดาเทียบกับฟังก์ชันที่คอมไพล์ในรูปแบบเนทีฟ หากฟังก์ชันภายในสคริปต์ --!native หรือที่มีหมายเหตุ @native ไม่ปรากฏว่าเป็นการดำเนินการแบบเนทีฟ สาเหตุหนึ่งหรือหลายประการจากรายการข้างบนอาจทำให้เกิด de-optimization
ใช้การระบุประเภท
การสร้างรหัสเนทีฟจะพยายามอนุมานประเภทที่เป็นไปได้มากที่สุดสำหรับตัวแปรที่กำหนดเพื่อให้สามารถเพิ่มประสิทธิภาพเส้นทางการทำงานได้ ตัวอย่างเช่น สมมุติว่า 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
เครื่องมือใน Studio
เครื่องมือใน Studio ต่อไปนี้ได้รับการสนับสนุนสำหรับสคริปต์ --!native และฟังก์ชัน @native
การดีบัก
การ ดีบัก ทั่วไปของสคริปต์ได้รับการสนับสนุน แต่การมองเห็นสำหรับตัวแปรท้องถิ่น/ค่าที่ประหยัดอาจไม่ครบถ้วนและอาจขาดตัวแปรจาก กรอบสแต็คการเรียก ที่กำลังดำเนินการในโหมดเนทีฟ
ในขณะเดียวกันเมื่อทำการดีบักโค้ดที่เลือกสำหรับการคอมไพล์แบบเนทีฟ การตั้ง จุดพัก จะทำให้การดำเนินการเชิงเนทีฟสำหรับฟังก์ชันเหล่านั้นถูกปิดการใช้งาน
Script Profiler
ใน Script Profiler ฟังก์ชันที่ดำเนินการในรูปแบบเนทีฟจะแสดง <native> ถัดจากพวกเขา:

หากฟังก์ชันที่มีหมายเหตุ @native หรืออยู่ภายในสคริปต์ --!native ไม่แสดงหมายเหตุ <native> ฟังก์ชันนั้นอาจไม่ทำงานในรูปแบบเนทีฟเนื่องจากการตั้ง จุดพัก การใช้ รหัสที่ไม่แนะนำ หรือการระบุ ประเภทที่ไม่ตรงกัน
หน่วยความจำของ Luau
ในโปรไฟล์ Luau heap หน่วยความจำที่ใช้โดยฟังก์ชันเนทีฟจะแสดงเป็น [native] ในกราฟ

การวิเคราะห์ขนาด
สคริปต์ที่คอมไพล์ในรูปแบบเนทีฟทุกตัวต้องใช้หน่วยความจำ เมื่อขนาดของรหัสที่คอมไพล์ไปถึงขีดจำกัดที่กำหนด ขบวนการคอมไพล์ในรูปแบบเนทีฟจะหยุดลงและรหัสที่เหลือจะทำงานในโหมดที่ไม่ได้คอมไพล์ในรูปแบบเนทีฟ นี่ทำให้ต้องเลือกสคริปต์ที่เหมาะสมสำหรับการสร้างรหัสเนทีฟ
เพื่อการติดตามขนาดรหัสเนทีฟของฟังก์ชันและสคริปต์แต่ละรายการ:
- ให้แน่ใจว่าคุณอยู่ในมุมมอง Server ผ่านปุ่ม client/server toggle.
- เรียกใช้ debug.dumpcodesize() จาก Command Bar.
ในหน้าต่าง Output คุณจะเห็นจำนวนทั้งหมดของสคริปต์และฟังก์ชันที่ถูกคอมไพล์ในรูปแบบเนทีฟขึ้นไปจนถึงจุดที่เรียกใช้ รวมถึงหน่วยความจำที่ใช้โดยรหัสเนทีฟของพวกเขา และขนาดรหัสเนทีฟสูงสุด หลังจากสรุป คุณจะเห็นตารางสำหรับสคริปต์ที่ถูกคอมไพล์ในรูปแบบเนทีฟแต่ละรายการในลำดับขนาดรหัสจากมากไปน้อย

สำหรับแต่ละสคริปต์ ข้อความที่แสดงจะบอกจำนวนฟังก์ชันที่ถูกคอมไพล์และการใช้หน่วยความจำขนาดรหัสเนทีฟ ทุกฟังก์ชันจะถูกแสดงตามลำดับของขนาดรหัสเนทีฟ โดยฟังก์ชันที่ไม่มีชื่อจะแสดงเป็น [anonymous] และสคริปต์ทั้งหมดจะแสดงเป็น [top level] ในคอลัมน์สุดท้าย เปอร์เซ็นต์จะถูกคำนวณตามขนาดรหัสเนทีฟสูงสุด โปรดทราบว่าขนาดรหัสเนทีฟของฟังก์ชันจะถูกรายงานอย่างถูกต้อง แต่การใช้หน่วยความจำของสคริปต์จะถูกปัดขึ้นไปที่ขนาดหน้าใกล้เคียงที่สุด
ข้อจำกัดและการแก้ไขปัญหา
การคอมไพล์รหัสเป็นคำสั่งสำหรับ CPU เฉพาะต้องการหน่วยความจำเก็บข้อมูลเพิ่มเติม นอกจากนี้ การเพิ่มประสิทธิภาพสำหรับฟังก์ชันที่ซับซ้อนอาจใช้เวลานานเกินไปในการดำเนินการ หากมีการเข้าถึงขีดจำกัดภายในจะมีรายงานข้อผิดพลาดในหน้าต่าง Output ของ Studio รวมถึง:
ฟังก์ชัน 'f' ที่บรรทัด 20 ใช้คำสั่งในบล็อกโค้ดเดียวกันเกิน 64K
ข้อผิดพลาดนี้หมายความว่าบล็อกโค้ดเดียวภายในฟังก์ชันใช้คำสั่งมากกว่า 64K สามารถหลีกเลี่ยงได้โดยการทำให้ฟังก์ชันเรียบง่ายขึ้นหรือโดยการแบ่งออกเป็นฟังก์ชันขนาดเล็กแต่ละรายการ
ฟังก์ชัน 'f' ที่บรรทัด 20 เกินขีดจำกัดบล็อกโค้ดของฟังก์ชัน
ข้อผิดพลาดนี้หมายความว่าฟังก์ชันหนึ่งมีบล็อกโค้ดภายในมากกว่า 32K บล็อกโค้ด โค้ดภายในมีลำดับที่ไม่ได้แม่นยำกับบล็อกการควบคุมในสคริปต์ของคุณ แต่ข้อผิดพลาดนี้สามารถหลีกเลี่ยงได้โดยการทำให้การควบคุมเรียบง่ายขึ้นในฟังก์ชันหรือโดยการแบ่งออกเป็นฟังก์ชันขนาดเล็กแต่ละรายการ
ฟังก์ชัน 'f' ที่บรรทัด 200 เกิดขีดจำกัดคำสั่งทั้งหมดของโมดูล
ข้อผิดพลาดนี้หมายความว่าในทั้งหมด ฟังก์ชันได้ถึงจำกัด 1 ล้านคำสั่งสำหรับทั้งสคริปต์ ในบางกรณี ฟังก์ชันที่รายงานอาจมีคำสั่งเป็นจำนวนมาก หรือการจำกัดอาจได้รับการเข้าถึงโดยฟังก์ชันก่อนหน้าในสคริปต์ เพื่อหลีกเลี่ยงปัญหานี้แนะนำให้ย้ายฟังก์ชันที่มีขนาดใหญ่โดยเฉพาะไปยังสคริปต์แยกที่ไม่ได้คอมไพล์ในรูปแบบเนทีฟ หรือใช้ @native กับฟังก์ชันอื่นๆ คุณสามารถลองทำเครื่องหมายสคริปต์แยกนั้นด้วย --!native แต่ 1 ล้านคำสั่งใช้หน่วยความจำมากและคุณอาจเกินขีดจำกัดของหน่วยความจำ
ฟังก์ชัน 'f' ที่บรรทัด 20 พบกับความล้มเหลวภายใน
หรือ
ข้อผิดพลาดภายใน: การสร้างรหัสเนทีฟล้มเหลว (การลด Assembly)
บางครั้งฟังก์ชันมีโค้ดที่ซับซ้อนที่คอมไพเลอร์รหัสเนทีฟไม่สามารถจัดการได้ในขณะนั้น เพื่อหลีกเลี่ยงข้อผิดพลาดนี้ ให้ตรวจสอบการแสดงออกที่ซับซ้อนในโค้ดและแบ่งออกหรือทำให้เรียบง่ายลง แต่ก็ควรพิจารณาเปิดรายงานข้อบกพร่องพร้อมตัวอย่างโค้ดที่ล้มเหลวด้วยเหตุนี้
เกินขีดจำกัดการจัดสรรหน่วยความจำสำหรับการสร้างรหัสเนทีฟ
ข้อผิดพลาดนี้หมายความว่าขีดจำกัดหน่วยความจำโดยรวมสำหรับข้อมูลรหัสเนทีฟได้ถูกเข้าถึง เพื่อหลีกเลี่ยงสิ่งนี้ให้ลองลบ --!native ออกจากสคริปต์ที่ใช้หน่วยความจำมากขึ้น เพื่อให้สามารถใส่สคริปต์ที่มีขนาดเล็กมากขึ้นอยู่ภายใต้ขีดจำกัดได้ นอกจากนี้ ให้ย้ายฟังก์ชันขนาดใหญ่หรือฟังก์ชันที่เรียกใช้น้อยไปยังโมดูลที่แยกไม่ใช่เนทีฟ