Với sự hỗ trợ của Luau cho việc tạo mã bản địa, các kịch bản bên máy trong trải nghiệm của bạn có thể được biên dịch trực tiếp vào các lệnh mã máy mà các CPU thực hiện, thay vì bytecode thông thường mà Luau VM hoạt động.Tính năng này có thể được sử dụng để cải thiện tốc độ thực hiện cho một số kịch bản trên máy chủ, đặc biệt là những kịch bản có nhiều phép tính số không sử dụng quá nhiều thư viện Luau nặng hoặc cuộc gọi API Roblox.
Bật sản xuất mã bản địa
Để bật sản xuất mã bản địa cho một Script , thêm bình luận --!native ở trên cùng:¹
--!bản địaprint("Hello from native code!")
Điều này cho phép tạo mã bản địa cho tất cả các chức năng trong kịch bản, và phạm vi cấp cao, nếu được coi là có lợi nhuận.Không cần thêm thay đổi; hành vi của các kịch bản được thực hiện bản địa chính xác giống như trước đây và chỉ có hiệu suất khác nhau.Tất cả các tính năng của ngôn ngữ Luau và tất cả các API Roblox vẫn được hỗ trợ.
Ngoài ra, bạn có thể bật sản xuất mã bản địa cho một chức năng cụ thể bằng cách thêm thuộc tính @native:
@native
local function f(x)
return (x + 1)
end
Tốt nhất các thực hành
Các lời khuyên sau đây sẽ giúp bạn có lợi nhất từ việc tạo mã bản địa:
Tốt nhất là bật chức năng này trong các tập lệnh thực hiện rất nhiều phép tính trực tiếp bên trong Luau.Nếu bạn có rất nhiều hoạt động toán học trên các bảng và đặc biệt là buffer loại, thì kịch bản có thể là một ứng viên tốt.
Chỉ chức năng của kịch bản được biên dịch bản địa.Mã trong phạm vi bên ngoài cao nhất thường chỉ được thực hiện một lần và không được hưởng nhiều như các chức năng được gọi nhiều lần, đặc biệt là những chức năng được gọi mỗi khung.
Khuyến nghị bạn đo thời gian một kịch bản hoặc chức năng mất với và không có biên dịch bản địa để phán xét khi nào tốt nhất nên sử dụng nó.Công cụ Nhà phân tích kịch bản có thể đo lường hiệu suất của chức năng để đưa ra quyết định có thông tin.
Nó có thể khiến bạn muốn đặt bình luận --!native vào mọi kịch bản chỉ trong trường hợp một số trong số chúng sẽ thực hiện nhanh hơn, nhưng việc tạo mã bản địa có một số hạn chế:
- Thời gian biên dịch mã là bắt buộc và có thể tăng thời gian khởi động của các máy chủ.
- Bộ nhớ dư được chiếm để lưu trữ mã được biên dịch nguyên bản.
- Có giới hạn về tổng số lượng mã được biên dịch nguyên bản trong một trải nghiệm.
Các vấn đề này có thể được giải quyết bằng cách sử dụng đặc tính @native một cách khôn ngoan.
Mã để tránh
Trong khi tất cả các tính năng sẽ hành xử giống nhau với hoặc không có sự bật xuất mã bản địa được bật, một số trong số chúng sẽ không chạy mặc định và có thể gây ra sự tối ưu hóa hoặc quay lại thực thi được giải thích.Chúng bao gồm:
- Sử dụng các chức năng Luau tích hợp như math.asin() với các tham số không phải là số.
- Chuyển tham số không được gõ đúng cách đến các chức năng được gõ, ví dụ như gọi foo(true) khi foo được tuyên bố là function foo(arg: string) .Hãy nhớ luôn luôn sử dụng đúng loại phân đoạn đúng .
Khi sử dụng Nhà phân tích kịch bản, bạn có thể so sánh thời gian mà một phiên bản thường của chức năng mất so với phiên bản được biên dịch bản địa.Nếu một chức năng bên trong một --!native kịch bản hoặc được đánh dấu bằng @native không có vẻ được thực thi mặc định, một hoặc nhiều yếu tố từ danh sách trên có thể kích hoạt giảm tối ưu hóa.
Sử dụng phân loại phản hồi
Các nỗ lực tạo mã bản địa cố gắng suy ra loại có khả năng nhất cho một biến cụ thể để tối ưu hóa đường dẫn mã.Ví dụ, cho rằng a + b được thực hiện trên các số, hoặc một bảng được truy cập trong t.X .Tuy nhiên, do quá tải cho phép tính toán, a và b có thể là bảng hoặc Vector3 loại, hoặc t có thể là một loại dữ liệu Roblox.
Trong khi tạo mã bản địa sẽ hỗ trợ bất kỳ đánh máynào, những lần dự đoán sai có thể kích hoạt các kiểm tra không cần thiết, dẫn đến thời gian thực thi mã chậm hơn.
Để giải quyết một số vấn đề phổ biến, Luau kiểm tra các phân đoạn bình luận trên các tham số chức năng, nhưng đặc biệt được khuyến nghị để ghi chú Vector3 các tham số:
--!bản địa
-- “v” được cho là là một bảng; chức năng thực hiện chậm hơn do kiểm tra bảng
local function sumComponentsSlow(v)
return v.X + v.Y + v.Z
end
-- “v” được tuyên bố là một Vector3; mã chuyên dụng cho vectơ được tạo ra
local function sumComponentsFast(v: Vector3)
return v.X + v.Y + v.Z
end
Công cụ phát triển Studio
Các công cụ Studio sau đây được hỗ trợ cho --!native các kịch bản và @native chức năng.
Gỡ lỗi
Gỡ lỗi chung của các tập lệnh được hỗ trợ, nhưng các quan điểm cho người dùng địa phương/giá trị tăng có thể không hoàn chỉnh và thiếu biến từ các khung xử lý cuộc gọi đang thực hiện ngay lập tức.
Hãy lưu ý rằng khi gỡ lỗi mã được chọn cho biên dịch bản địa, đặt điểm dừng sẽ vô hiệu hóa biên dịch bản địa cho các chức năng đó.
Nhà phân tích kịch bản
Trong Nhà phân tích kịch bản, chức năng thực hiện bản địa hiển thị <native> bên cạnh chúng:

Nếu một chức năng được đánh dấu @native hoặc bên trong một --!native kịch bản không hiển thị đánh dấu <native> thì chức năng đó có thể không được thực thi ngay lập tức do điểm dừng phá vỡ , sử dụng mã bị loại bỏ , hoặc không phù hợp với loại đánh dấu annotation .
Đối tượng Luau堆
Trong profiler Luau heap, bộ nhớ được lấy bởi các chức năng bản địa hiển thị như [native] các yếu tố trong đồ thị.

Phân tích kích thước
Mọi kịch bản được biên dịch nguyên bản tiêu thụ bộ nhớ.Khi kích thước của mã được biên dịch đạt đến giới hạn được xác định trước, biên dịch bản địa dừng lại và mã còn lại được chạy không chính xác.Điều này làm cho việc chọn cẩn thận các kịch bản quan trọng để biên dịch bản địa.
Để theo dõi kích thước mã bản địa của các chức năng và kịch bản riêng lẻ:
- Hãy chắc chắn rằng bạn đang ở trong View máy chủ thông qua nút chuyển đổi khách hàng/máy chủ.
- Gọi debug.dumpcodesize() từ Thanh lệnh.
Trong cửa sổ Xuất, bạn sẽ thấy tổng số lượng các kịch bản và chức năng đã được biên dịch nguyên bản cho đến điểm kích hoạt, bộ nhớ được tiêu thụ bởi mã bản địa của chúng, và giới hạn kích thước mã bản địa.Sau phần tóm tắt, bạn sẽ thấy một bảng cho mỗi kịch bản được biên dịch theo thứ tự giảm dần về kích thước mã.

Đối với mỗi kịch bản, kết quả hiển thị số lượng chức năng được biên dịch và sự tiêu thụ bộ nhớ mã bản địa.Mỗi chức năng sau đó được liệt kê theo thứ tự giảm dần kích thước mã bản địa, với các chức năng ẩn được hiển thị là [anonymous] và toàn bộ kịch bản được hiển thị là [top level] .Trong cột cuối cùng, tỷ lệ được tính với giới hạn kích thước mã bản địa.Lưu ý rằng kích thước mã bản địa của chức năng được báo cáo chính xác nhưng tiêu thụ bộ nhớ cho các kịch bản được làm tròn lên kích thước trang gần nhất.
Giới hạn và giải quyết sự cố
Biên dịch mã thành hướng dẫn cho một CPU cụ thể yêu cầu thêm bộ nhớ lưu trữ.Ngoài ra, tối ưu hóa cho các chức năng phức tạp có thể mất quá nhiều thời gian để thực hiện.Việc đánh một giới hạn nội bộ sẽ báo cáo một lỗi trong cửa sổ Xuất của Studio, bao gồm:
Chức năng 'f' tại dòng 20 vượt giới hạn lệnh khối mã đơn
Lỗi này có nghĩa là một khối mã duy nhất bên trong chức năng sử dụng hơn 64K lệnh.Điều này có thể tránh được bằng cách đơn giản hóa chức năng hoặc chia nó thành các chức năng nhỏ hơn.
Chức năng 'f' tại dòng 20 vượt giới hạn mã chức năng
Lỗi này có nghĩa là một chức năng duy nhất chứa nhiều hơn 32K khối mã nội bộ.Các khối mã nội bộ không chính xác phù hợp với các khối dòng điều khiển trong kịch bản của bạn, nhưng lỗi này có thể tránh được bằng cách đơn giản hóa dòng điều khiển trong chức năng hoặc chia nó thành các chức năng nhỏ hơn.
Chức năng 'f' tại dòng 200 vượt giới hạn tổng số lệnh mô-đun
Lỗi này có nghĩa là, trong tổng cộng, chức năng đã đạt đến giới hạn 1 triệu lệnh cho toàn bộ kịch bản.Trong một số trường hợp, chức năng báo cáo có thể có rất nhiều hướng dẫn, hoặc giới hạn có thể đã được đạt đến bởi các chức năng trước đó trong kịch bản.Để tránh vấn đề này, được khuyến nghị di chuyển các chức năng đặc biệt lớn vào một kịch bản riêng không phải bản địa hoặc sử dụng @native trên các chức năng khác.Bạn cũng có thể thử đánh dấu kịch bản riêng biệt đó với --!native , nhưng 1 triệu lệnh chiếm rất nhiều bộ nhớ và bạn có thể vượt quá giới hạn bộ nhớ.
*Chức năng 'f' ở dòng 20 gặp sự cố giảm thấp nội bộ *(hoặc) Lỗi nội bộ: Tạo mã bản địa thất bại (thấp hơn tập hợp)
Đôi khi chức năng có chứa các bit mã phức tạp mà người biên dịch mã bản địa hiện không thể xử lý.Để tránh lỗi này, kiểm tra các biểu hiện phức tạp trong mã và chia chúng ra hoặc đơn giản hóa chúng, nhưng cũng xem xét mở báo cáo lỗi với ví dụ của mã đã thất bại vì lý do này.
Giới hạn phân bổ bộ nhớ đã đạt được cho việc tạo mã bản địa
Lỗi này có nghĩa là giới hạn bộ nhớ tổng cho dữ liệu mã bản địa đã được đạt đến.Để tránh điều này, hãy thử xóa --!native từ các kịch bản sử dụng nhiều bộ nhớ hơn, cho phép các kịch bản nhỏ hơn phù hợp với giới hạn.Ngoài ra, di chuyển các chức năng lớn hoặc không được gọi thường xuyên sang một mô-đun riêng không phải bản địa.