Trò chơi Game Boy Advance được viết bằng Zig
(jonot.me)Vì sao lại viết trò chơi Game Boy Advance bằng Zig
-
Sức hấp dẫn của Game Boy Advance
Game Boy Advance có một CPU hiện đại (ARM 32-bit, nhiều thanh ghi), nhưng lại sử dụng trình kết xuất dựa trên tile kiểu cũ. Cách này tương tự với phương thức mà NES đã dùng từ thập niên 80. Đây là một trong những hệ thống dựa trên tile cuối cùng của Nintendo, đồng thời cung cấp nhiều tính năng như biến đổi affine, độ trong suốt và hiệu ứng sprite. -
Lý do chọn ngôn ngữ Zig
Ban đầu dự án Game Boy Advance được khởi động bằng C++, nhưng trò chơi hoàn chỉnh đầu tiên lại được viết bằng Zig. Dù Zig vẫn đang ở bản beta và là ngôn ngữ được tạo ra 15 năm sau khi Game Boy Advance phát hành, nó vẫn cung cấp các tính năng rất phù hợp cho lập trình nhúng.
Chuỗi công cụ
-
Linux và devKitPro
Khi sử dụng Linux, tác giả gặp khó khăn với việc quản lý gói và từng phải dùng devKitPro khi tạo cảnh 3D cho Nintendo DS. Bộ này bao gồm chuỗi công cụ GCC, thư viện và các công cụ phát triển. Tuy nhiên, việc phải cài đặt qua trình quản lý gói của ArchLinux khá phiền phức. -
Ưu điểm của Zig
Zig giúp cross-compile dễ dàng và không cần thiết lập một trình quản lý gói phức tạp. Hệ thống build của Zig thực hiện build bằng cách chạy hàmbuildtrong tệpbuild.zig. Điều này giúp đơn giản hóa quy trình build và giảm lỗi.
Packed Structs
- Tầm quan trọng của Packed Structs
Game Boy Advance điều khiển phần cứng thông qua thanh ghi thay vì các lệnh gọi API cấp cao.packed structcủa Zig tối ưu bố cục bộ nhớ để việc điều khiển phần cứng trở nên dễ dàng hơn. Đây là một tính năng đặc biệt hữu ích cho lập trình Game Boy Advance.
Comptime
- Thực thi mã tại thời điểm biên dịch
Zig cung cấp khả năng thực thi mã ngay tại thời điểm biên dịch. Nhờ đó, dữ liệu có thể được nén từ lúc biên dịch thay vì phải nén khi chạy. Tính năng này của Zig giúp việc nén dữ liệu trở nên đơn giản hơn.
Thư viện chuẩn
- Thư viện chuẩn linh hoạt của Zig
Thư viện chuẩn của Zig hỗ trợ generic và cho phép các hàm cấp phát bộ nhớ nhận memory allocator làm tham số. Điều này cho phép sử dụng các cơ chế cấp phát bộ nhớ tùy biến. Thư viện chuẩn của Zig vì thế vẫn có thể được dùng linh hoạt ngay cả trong môi trường có ràng buộc phần cứng.
Vấn đề
-
Inline assembly
Zig có hỗ trợ inline assembly, nhưng chỉ cho phép một đầu ra. Điều này gây vấn đề khi các hàm BIOS của GBA cần xuất ra nhiều giá trị. -
Mã Thumb / mã ARM
CPU của Game Boy Advance hỗ trợ cả chế độ ARM và chế độ Thumb. Trong Zig, không thể chỉ định tường minh chế độ ARM hay Thumb. -
Bộ nhớ kỳ lạ
Bộ nhớ video của Game Boy Advance không thể được ghi theo đơn vị 8-bit, và điều này có thể làm đồ họa bị hỏng. Zig tối ưu khi sao chép bộ nhớ bằng cách dùngmemcpy, nhưng điều đó có thể xung đột với “bộ nhớ kỳ lạ” của GBA.
1 bình luận
Ý kiến Hacker News
volatiletrong tài liệu Zig mà vẫn không giải quyết được thì nên báo cáo lỗi cho trình biên dịchmemcpy. Người viết chỉ nghĩ tối ưu hóa này sẽ diễn ra trong không gian người dùng, và đã kỳ vọng tùy chọn-nostdlibcó thể tự động xử lý việc này