การสร้างรหัสเนทีฟ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ด้วยความสามารถการสร้างรหัสเนทีฟของ Luau สคริปต์ด้านเซิร์ฟเวอร์ในเกมของคุณสามารถถูกคอมไพล์โดยตรงเป็นคำสั่งรหัสเครื่องที่ CPU ดำเนินการ แทนที่จะเป็นไบต์โค้ดปกติที่ VM ของ Luau ใช้งานอยู่ คุณสมบัตินี้สามารถใช้เพื่อปรับปรุงความเร็วในการดำเนินการสำหรับสคริปต์บางตัวบนเซิร์ฟเวอร์ โดยเฉพาะอย่างยิ่งสำหรับสคริปต์ที่มีการคำนวณทางตัวเลขมากโดยไม่ต้องเรียกใช้ไลบรารี Luau หรือ API ของ Roblox มากเกินไป

เปิดใช้งานการสร้างรหัสเนทีฟ

เพื่อเปิดใช้งานการสร้างรหัสเนทีฟสำหรับ Script ให้เพิ่มความคิดเห็น --!native ที่ด้านบน:¹


--!native
print("สวัสดีจากรหัสเนทีฟ!")

สิ่งนี้จะเปิดใช้งานการสร้างรหัสเนทีฟสำหรับฟังก์ชันทั้งหมดในสคริปต์ และบริบทระดับสูง หากได้รับการพิจารณาว่าเป็นประโยชน์ อีกทั้งไม่มีการเปลี่ยนแปลงเพิ่มเติมใดๆ พฤติกรรมของสคริปต์ที่ดำเนินการตามเนทีฟจะเหมือนกันกับก่อนหน้านี้ และต่างกันเพียงเรื่องประสิทธิภาพ ฟีเจอร์ทั้งหมดของภาษาจู้อูและ API ของ Roblox ยังคงได้รับการสนับสนุน

นอกจากนี้ คุณยังสามารถเปิดใช้งานการสร้างรหัสเนทีฟสำหรับฟังก์ชันแต่ละตัวได้โดยการเพิ่มแอตทริบิวต์ @native:


@native
local function f(x)
return (x + 1)
end
1 ในอนาคต สคริปต์บางตัวอาจเริ่มทำงานในโหมดเนทีฟโดยอัตโนมัติหากถือว่ามีประสิทธิภาพ แต่ในขณะนี้จำเป็นต้องมีความคิดเห็น --!native ที่วางด้วยมือ.

ข้อปฏิบัติที่ดีที่สุด

คำแนะนำต่อไปนี้จะช่วยคุณให้ได้รับประโยชน์สูงสุดจากการสร้างรหัสเนทีฟ:

  • ควรเปิดใช้งานฟีเจอร์นี้ภายในสคริปต์ที่ทำการคำนวณมากภายใน Luau โดยตรง หากคุณมีการดำเนินการทางคณิตศาสตร์มากมายเกี่ยวกับตารางและโดยเฉพาะอย่างยิ่งประเภท buffer สคริปต์นั้นอาจเป็นผู้สมัครที่ดี

  • เฉพาะ ฟังก์ชัน ของสคริปต์เท่านั้นที่จะถูกคอมไพล์ในรูปแบบเนทีฟ รหัสใน บริบท ชั้นนอกมักจะถูกดำเนินการเพียงครั้งเดียวและไม่ได้รับประโยชน์มากนักจากฟังก์ชันที่ถูกเรียกหลายครั้ง โดยเฉพาะอย่างยิ่งฟังก์ชันที่ถูกเรียกในทุกเฟรม

  • แนะนำให้คุณวัดเวลาที่สคริปต์หรือฟังก์ชันใช้ด้วยและโดยไม่ต้องคอมไพล์เป็นเนทีฟเพื่อตัดสินใจว่าเมื่อไหร่ควรใช้มัน เครื่องมือ Script Profiler สามารถวัดประสิทธิภาพของฟังก์ชันเพื่อช่วยให้คุณทำการตัดสินใจ

  • อาจเป็นการชักชวนให้ใส่ความคิดเห็น --!native ใน ทุก สคริปต์เพียงในกรณีที่บางสคริปต์จะทำงานได้เร็วขึ้น แต่การสร้างรหัสเนทีฟมีข้อเสียบางประการ:

    • ต้องใช้เวลาในการคอมไพล์รหัสซึ่งอาจทำให้เวลาเริ่มต้นของเซิร์ฟเวอร์นานขึ้น
    • ต้องใช้หน่วยความจำเพิ่มเติมเพื่อเก็บรหัสที่คอมไพล์ในรูปแบบเนทีฟ
    • มีการจำกัดจำนวนรหัสที่คอมไพล์เป็นเนทีฟทั้งหมดในเกม

ปัญหาเหล่านี้สามารถจัดการได้โดยการใช้แอตทริบิวต์ @native อย่างระมัดระวัง

รหัสที่ควรหลีกเลี่ยง

แม้ว่าฟีเจอร์ทั้งหมดจะทำงานได้เหมือนกันทั้งเปิดหรือปิดการสร้างรหัสเนทีฟ แต่บางฟีเจอร์อาจไม่สามารถทำงานในรูปแบบเนทีฟและอาจทำให้เกิด de-optimization หรือกลับไปใช้การดำเนินการแบบแปลได้ สิ่งเหล่านี้รวมถึง:

  • การใช้การเรียก getfenv()/setfenv() ที่เลิกใช้งาน
  • การใช้ฟังก์ชันที่สร้างอยู่ภายในของ 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> ถัดจากพวกเขา:

ตัวอย่างของฟังก์ชันเนทีฟที่ติดธงใน Script Profiler

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

หน่วยความจำของ Luau

ในโปรไฟล์ Luau heap หน่วยความจำที่ใช้โดยฟังก์ชันเนทีฟจะแสดงเป็น [native] ในกราฟ

ตัวอย่างของการใช้งานหน่วยความจำเนทีฟที่ติดธงในโปรไฟล์ Luau Heap

การวิเคราะห์ขนาด

สคริปต์ที่คอมไพล์ในรูปแบบเนทีฟทุกตัวต้องใช้หน่วยความจำ เมื่อขนาดของรหัสที่คอมไพล์ไปถึงขีดจำกัดที่กำหนด ขบวนการคอมไพล์ในรูปแบบเนทีฟจะหยุดลงและรหัสที่เหลือจะทำงานในโหมดที่ไม่ได้คอมไพล์ในรูปแบบเนทีฟ นี่ทำให้ต้องเลือกสคริปต์ที่เหมาะสมสำหรับการสร้างรหัสเนทีฟ

เพื่อการติดตามขนาดรหัสเนทีฟของฟังก์ชันและสคริปต์แต่ละรายการ:

  1. ให้แน่ใจว่าคุณอยู่ในมุมมอง Server ผ่านปุ่ม client/server toggle.
  2. เรียกใช้ debug.dumpcodesize() จาก Command Bar.

ในหน้าต่าง Output คุณจะเห็นจำนวนทั้งหมดของสคริปต์และฟังก์ชันที่ถูกคอมไพล์ในรูปแบบเนทีฟขึ้นไปจนถึงจุดที่เรียกใช้ รวมถึงหน่วยความจำที่ใช้โดยรหัสเนทีฟของพวกเขา และขนาดรหัสเนทีฟสูงสุด หลังจากสรุป คุณจะเห็นตารางสำหรับสคริปต์ที่ถูกคอมไพล์ในรูปแบบเนทีฟแต่ละรายการในลำดับขนาดรหัสจากมากไปน้อย

ตัวอย่างของขนาดรหัสเนทีฟที่แสดงในหน้าต่าง Output.

สำหรับแต่ละสคริปต์ ข้อความที่แสดงจะบอกจำนวนฟังก์ชันที่ถูกคอมไพล์และการใช้หน่วยความจำขนาดรหัสเนทีฟ ทุกฟังก์ชันจะถูกแสดงตามลำดับของขนาดรหัสเนทีฟ โดยฟังก์ชันที่ไม่มีชื่อจะแสดงเป็น [anonymous] และสคริปต์ทั้งหมดจะแสดงเป็น [top level] ในคอลัมน์สุดท้าย เปอร์เซ็นต์จะถูกคำนวณตามขนาดรหัสเนทีฟสูงสุด โปรดทราบว่าขนาดรหัสเนทีฟของฟังก์ชันจะถูกรายงานอย่างถูกต้อง แต่การใช้หน่วยความจำของสคริปต์จะถูกปัดขึ้นไปที่ขนาดหน้าใกล้เคียงที่สุด

ข้อจำกัดและการแก้ไขปัญหา

การคอมไพล์รหัสเป็นคำสั่งสำหรับ CPU เฉพาะต้องการหน่วยความจำเก็บข้อมูลเพิ่มเติม นอกจากนี้ การเพิ่มประสิทธิภาพสำหรับฟังก์ชันที่ซับซ้อนอาจใช้เวลานานเกินไปในการดำเนินการ หากมีการเข้าถึงขีดจำกัดภายในจะมีรายงานข้อผิดพลาดในหน้าต่าง Output ของ Studio รวมถึง:

ฟังก์ชัน 'f' ที่บรรทัด 20 ใช้คำสั่งในบล็อกโค้ดเดียวกันเกิน 64K

ข้อผิดพลาดนี้หมายความว่าบล็อกโค้ดเดียวภายในฟังก์ชันใช้คำสั่งมากกว่า 64K สามารถหลีกเลี่ยงได้โดยการทำให้ฟังก์ชันเรียบง่ายขึ้นหรือโดยการแบ่งออกเป็นฟังก์ชันขนาดเล็กแต่ละรายการ

ฟังก์ชัน 'f' ที่บรรทัด 20 เกินขีดจำกัดบล็อกโค้ดของฟังก์ชัน

ข้อผิดพลาดนี้หมายความว่าฟังก์ชันหนึ่งมีบล็อกโค้ดภายในมากกว่า 32K บล็อกโค้ด โค้ดภายในมีลำดับที่ไม่ได้แม่นยำกับบล็อกการควบคุมในสคริปต์ของคุณ แต่ข้อผิดพลาดนี้สามารถหลีกเลี่ยงได้โดยการทำให้การควบคุมเรียบง่ายขึ้นในฟังก์ชันหรือโดยการแบ่งออกเป็นฟังก์ชันขนาดเล็กแต่ละรายการ

ฟังก์ชัน 'f' ที่บรรทัด 200 เกิดขีดจำกัดคำสั่งทั้งหมดของโมดูล

ข้อผิดพลาดนี้หมายความว่าในทั้งหมด ฟังก์ชันได้ถึงจำกัด 1 ล้านคำสั่งสำหรับทั้งสคริปต์ ในบางกรณี ฟังก์ชันที่รายงานอาจมีคำสั่งเป็นจำนวนมาก หรือการจำกัดอาจได้รับการเข้าถึงโดยฟังก์ชันก่อนหน้าในสคริปต์ เพื่อหลีกเลี่ยงปัญหานี้แนะนำให้ย้ายฟังก์ชันที่มีขนาดใหญ่โดยเฉพาะไปยังสคริปต์แยกที่ไม่ได้คอมไพล์ในรูปแบบเนทีฟ หรือใช้ @native กับฟังก์ชันอื่นๆ คุณสามารถลองทำเครื่องหมายสคริปต์แยกนั้นด้วย --!native แต่ 1 ล้านคำสั่งใช้หน่วยความจำมากและคุณอาจเกินขีดจำกัดของหน่วยความจำ

ฟังก์ชัน 'f' ที่บรรทัด 20 พบกับความล้มเหลวภายใน

หรือ
ข้อผิดพลาดภายใน: การสร้างรหัสเนทีฟล้มเหลว (การลด Assembly)

บางครั้งฟังก์ชันมีโค้ดที่ซับซ้อนที่คอมไพเลอร์รหัสเนทีฟไม่สามารถจัดการได้ในขณะนั้น เพื่อหลีกเลี่ยงข้อผิดพลาดนี้ ให้ตรวจสอบการแสดงออกที่ซับซ้อนในโค้ดและแบ่งออกหรือทำให้เรียบง่ายลง แต่ก็ควรพิจารณาเปิดรายงานข้อบกพร่องพร้อมตัวอย่างโค้ดที่ล้มเหลวด้วยเหตุนี้

เกินขีดจำกัดการจัดสรรหน่วยความจำสำหรับการสร้างรหัสเนทีฟ

ข้อผิดพลาดนี้หมายความว่าขีดจำกัดหน่วยความจำโดยรวมสำหรับข้อมูลรหัสเนทีฟได้ถูกเข้าถึง เพื่อหลีกเลี่ยงสิ่งนี้ให้ลองลบ --!native ออกจากสคริปต์ที่ใช้หน่วยความจำมากขึ้น เพื่อให้สามารถใส่สคริปต์ที่มีขนาดเล็กมากขึ้นอยู่ภายใต้ขีดจำกัดได้ นอกจากนี้ ให้ย้ายฟังก์ชันขนาดใหญ่หรือฟังก์ชันที่เรียกใช้น้อยไปยังโมดูลที่แยกไม่ใช่เนทีฟ

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ