Viết một trò chơi điện tử từ đầu như năm 1987
Những gì chúng ta sẽ làm
- Phiên bản thứ 11 của giao thức X ra đời vào năm 1987.
- X11 là mô hình có từ trước khi GPU xuất hiện nên không thực sự phù hợp với phần cứng ngày nay.
- Mọi hệ thống Unix đều có máy chủ X, và trên macOS cũng như Windows cũng có thể chạy ứng dụng Linux GUI.
- Giao thức X11 tương đối đơn giản, và có thể bắt đầu chỉ bằng cách tạo socket.
- Với các ứng dụng 2D, có thể hoạt động mà không cần tương tác với GPU.
Xác thực
- Trong bài viết trước, tác giả đã kết nối với máy chủ X mà không cần xác thực.
- Giờ đây đã hỗ trợ giao thức xác thực X.
- Lý do là vì một số môi trường desktop dùng XWayland yêu cầu xác thực.
- Việc xác thực được xử lý bằng cơ chế MIT-MAGIC-COOKIE-1.
Mở cửa sổ
- Mở UNIX domain socket để giao tiếp với máy chủ X.
- Thiết lập kết nối với máy chủ thông qua bắt tay X11.
- Tạo graphics context và tạo cửa sổ.
- Dùng lệnh gọi
map_window để hiển thị cửa sổ.
Tải tài nguyên
- Tải các hình ảnh cần cho trò chơi và chuyển đổi chúng sang định dạng ảnh của X11.
- Tạo Pixmap, tải ảnh lên, rồi sao chép phần cần thiết vào cửa sổ.
Ý kiến của GN⁺
- Sự đơn giản của X11: Giao thức X11 tương đối đơn giản nên có thể giao tiếp trực tiếp qua socket. Điều này giúp các kỹ sư mới bắt đầu hiểu được những khái niệm cơ bản của lập trình mạng và GUI.
- Khả năng tối ưu hóa: Có thể dùng các bộ đệm ngoài màn hình như Pixmap để chỉ tải ảnh lên một lần, sau đó sao chép lại rất nhanh. Đây là một ví dụ hay về tối ưu hiệu năng.
- Ưu điểm của ngôn ngữ Odin: Ngôn ngữ Odin cung cấp các tính năng giúp xử lý đơn giản những tác vụ phức tạp như quản lý bộ nhớ. Điều này cho phép lập trình hiệu quả hơn.
- Hỗ trợ hệ thống cũ: Cách làm này vẫn có thể hoạt động trên các hệ thống cũ. Điều này hữu ích khi cần chạy phần mềm trong nhiều môi trường khác nhau.
- Tài nguyên học tập: Việc trực tiếp làm việc với các giao thức mức thấp như X11 giúp hiểu sâu hơn về cách GUI vận hành bên trong. Điều này có thể góp phần nâng cao kỹ năng kỹ thuật của kỹ sư.
1 bình luận
Ý kiến trên Hacker News
Bình luận đầu tiên: PC năm 1987 có 1~2MB RAM, còn Super NES có 128KB RAM. Khi đó người ta đã tạo được các tệp thực thi nhỏ hơn rất nhiều so với chương trình của Microsoft. Liên kết
Bình luận thứ hai: X11 tuy đã cũ, nhưng nếu chỉ triển khai những chức năng cơ bản cần cho phát triển game thì không cần bận tâm đến phần còn lại. Dùng Xlib sẽ giúp làm việc dễ hơn.
Bình luận thứ ba: Đã phát triển một bản sao Minesweeper cho DOS PC bằng Turbo Pascal. Ở các màn lớn, đã gặp vấn đề với thuật toán đệ quy và đã thêm tính năng chọn vị trí bắt đầu an toàn.
Bình luận thứ tư: Phát triển game vào năm 1987 khó hơn bây giờ rất nhiều. DOS không hỗ trợ đa nhiệm nên quy trình làm việc cực kỳ kém hiệu quả. Liên kết
Bình luận thứ năm: Đã thất vọng vì kích thước tệp wasm của engine Godot tối thiểu là 50MB. Đặc biệt với các game 2D đơn giản thì cần tối ưu hơn. Nhưng nhìn chung vẫn rất ấn tượng.
Bình luận thứ sáu: Đã bắt đầu thấy hứng thú với ngôn ngữ Odin. Odin, giống Zig, truyền bộ cấp phát bộ nhớ vào hàm, nhưng có cơ chế xử lý thuận tiện hơn.
Bình luận thứ bảy: Minesweeper trên Windows 3.1 có mã cheat. Khi nhập một tổ hợp phím nhất định, có thể phân biệt được ô an toàn với ô có bom.
Bình luận thứ tám: Dùng thư viện như SDL thì hầu như không có overhead, đồng thời có thể hỗ trợ nhiều hệ điều hành. Nếu dùng SDL 1.x legacy thì còn có thể hỗ trợ cả các bản Linux cũ.
Bình luận thứ chín: Tệp thực thi Mines cho Windows của Simon Tatham có kích thước khoảng 180KiB. Liên kết