2 điểm bởi GN⁺ 2024-12-22 | 1 bình luận | Chia sẻ qua WhatsApp

Tại sao việc này khó

  • Vấn đề về tốc độ của Bash: Bash rất chậm nên nếu chạy lệnh cho mỗi pixel thì không thể đạt tốc độ khung hình phù hợp. Nó không thể duy trì trạng thái màn hình trong bộ nhớ, và việc truy cập qua mảng hoặc chuỗi tốn nhiều thời gian.
  • Hạn chế toán học: Bash không hỗ trợ số thực điểm động và cũng không có thư viện hàm toán học. Tất cả phép tính đều được thực hiện bằng số nguyên và được mở rộng theo 100000.
  • Vấn đề đồ họa terminal: Dùng ký tự Unicode nửa khối để biểu diễn pixel, nhân đôi độ phân giải theo chiều dọc. Cần biết màu của pixel kề cận, nhưng Bash không thể lưu trạng thái.
  • Vấn đề khác:
    • Khó cập nhật toàn bộ terminal cùng lúc.
    • Hầu hết terminal không dành cho trò chơi điện tử, nên việc xử lý đầu vào phím theo thời gian thực là khó khăn.
    • Cần nhiều dữ liệu để tô đầy terminal bằng màu.
    • Bash không in nhiều chuỗi nhiều dòng cùng một lần.
    • Các chuẩn ECMA48, VT100, VT200, Xterm đều phức tạp và khó nắm bắt.
    • Tính toán toán học gặp khó khăn.

Hỏi đáp

  • Q: Khi thay đổi kích thước cửa sổ có lỗi
    • A: Hãy mở một issue.
  • Q: CPU quá nóng hoặc máy tính cũ chậm
    • A: Hãy thử đặt biến môi trường FPS dưới 30.
  • Q: Code không chạy trên Bash dưới phiên bản 5
    • A: Đúng.
  • Q: Đây có phải code thuần Bash không?
    • A: Không. Nó sẽ gọi stty để tắt echo khi khởi động và gọi lại khi thoát để bật echo trở lại.

1 bình luận

 
GN⁺ 2024-12-22
Ý kiến trên Hacker News
  • Vì game này không phải thực sự là 3D, cách vẽ pixel bằng cách chỉ chạy ray tracing một lần cho mỗi cột thật rất khéo léo

    • Lặp lại chuỗi "vẽ pixel này rồi di chuyển xuống" bao nhiêu lần cần thiết để vẽ bầu trời, cỏ và các đối tượng thực trên terminal
    • Tôi đang nghĩ đến việc làm một engine render voxel cho các môi trường bị giới hạn khác, và có vẻ dự án này có thể hữu ích cho điều đó
  • Nếu bạn muốn biết có raycaster viết bằng MS Batch không, có thể xem tại liên kết GitHub

  • Mình nghĩ Bash khá chậm nên không phù hợp cho scripting hoặc sử dụng tương tác

    • Một số bản phân phối Linux phổ biến cũng không dùng Bash làm shell cho scripting
  • Khó chịu khi stty đòi fork

    • Dự án tiếp theo có thể sẽ tìm được cách gọi các ioctl cần thiết bằng Bash và rowhammer mà không cần fork
  • Mình vẫn không hiểu lý do phải dùng một shell vẫn rất chậm như vậy

    • Bởi vì hầu hết ứng dụng chỉ cần ghi vào stdout và stderr, nên mình tin rằng có thể hiển thị văn bản nhanh hơn trên màn hình
  • Tôi không ngờ Bash có thể làm được việc này

    • Tôi từng nghĩ rằng mình khá thành thạo Bash, nhưng cách cài đặt này thật sự khiến bất ngờ
    • Kiến thức toán học của tôi chưa tốt, nhưng chỉ nhìn thôi cũng thấy vui
  • Raycaster awk 9 năm trước cũng đáng để nhắc tới

    • Có thể kiểm tra qua liên kết GitHub
  • Thật tiếc không thể chạy được dự án này

    • Không rõ lý do, nhưng phần xem được lưu vào một file tên buffered rồi thoát ngay lập tức
  • Mã chỉ có khoảng 300 dòng nhưng vẫn rất ấn tượng

    • Dự án này rất hợp lòng tôi
  • Thử thách này thật sự tuyệt vời

    • Thật không thể tin rằng nó lại có thể