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

Lập trình màn hình hoạt họa "woosh" trên Amiga

  • Amiga khi ra mắt vào năm 1985 đã mang đến sự kinh ngạc về đồ họa và âm thanh.
  • Việc hiển thị hình ảnh đầy màu sắc trên Amiga là khá đơn giản, nhưng trong bối cảnh game engine thì có nhiều thách thức.

Thách thức 1: Yêu cầu về RAM

  • Một chiếc Amiga 500 điển hình có 512KB "chip RAM" và 512KB RAM mở rộng.
  • Chỉ chip RAM mới có thể được dùng để hiển thị đồ họa và âm thanh nên có giá trị hơn.
  • Đồ họa nhân vật toàn màn hình (CG) là bitmap 320x240 dùng 32 màu và chiếm 48KB RAM khi chưa nén.
  • Để hỗ trợ nén tài sản, tác giả thêm định dạng nén ZX0; khi nén thì CG giảm xuống còn 8KB, đủ chấp nhận được.
  • Khi tài sản của level được tải, CG đã nén sẽ được nạp vào RAM mở rộng và được giải nén sang chip RAM ngay trước khi hiển thị.
  • Thay vì phải tìm 48KB chip RAM trống, tác giả tái sử dụng các phần khác của bộ nhớ màn hình.

Thách thức 2: Hiệu ứng "tách màn hình"

  • Ban đầu tác giả cân nhắc dùng hiệu ứng wipe dọc cho chuyển cảnh màn hình.
  • Tuy nhiên, để nó trông đẹp thì cần một gradient wipe phải điều chỉnh bảng màu ở mỗi scanline.
  • Hiệu ứng tách màn hình dễ triển khai hơn và trông ấn tượng hơn với người xem bình thường.
  • Hai tính năng đặc biệt của Amiga phối hợp với nhau để tạo ra hiệu ứng này:
    1. Coprocessor (copper) hoạt động song song với CPU và có thể được chỉ thị thay đổi các thanh ghi phần cứng tại những dòng cụ thể trên màn hình.
    2. Bộ nhớ màn hình có thể được chuyển tới bất kỳ đâu trong chip RAM bằng cách đặt con trỏ màn hình trong các thanh ghi phần cứng.

Thách thức 3: "Đường chuyển động"

  • Để hoàn thiện hiệu ứng hoạt họa, cần có những đường "woosh" trong nền.
  • Dùng sprite để vẽ các đường là lựa chọn tốt vì chúng có thể được vẽ và di chuyển độc lập với bộ nhớ màn hình.
  • Sprite trên Amiga rất hạn chế và phức tạp.

Màu của sprite

  • Sprite chia sẻ bitplane và bảng màu, nên tác giả muốn dùng ít màu nhất có thể.
  • Sprite chỉ dùng 3 màu, để lại 28 màu cho CG và 1 màu cho nền.
  • Các sprite khác nhau dùng những màu khác nhau trong bảng màu.

Tái sử dụng đồ họa sprite

  • 4 byte đầu tiên của đồ họa sprite là "bit điều khiển" cho biết vị trí và chiều cao của sprite.
  • Đây trở thành vấn đề khi muốn vẽ cùng một đồ họa ở nhiều vị trí khác nhau.
  • Thay vào đó, tác giả tạo 8 sprite giả chỉ chứa bit điều khiển và đặt con trỏ sprite tới các sprite giả này.

Sprite sẽ không được vẽ khi bitplane bị tắt

  • Trước khi CG chạm tới phần trên của màn hình, có rất nhiều khoảng trống giữa đỉnh màn hình và điểm bắt đầu của CG.
  • Nếu bitplane được kích hoạt trong thời gian này, dữ liệu rác sẽ bị vẽ lên màn hình.
  • Nếu tắt bitplane thì sprite cũng sẽ không được vẽ.
  • Giải pháp là chỉ bật đúng 1 bitplane và đặt con trỏ màn hình tới dữ liệu rỗng.

Kết luận

  • Ban đầu tác giả không chắc có nên đưa CG vào game hay không vì yêu cầu RAM.
  • Việc nén dữ liệu cho thấy phần chi phí bổ sung là rất hợp lý.
  • Tận dụng các đặc trưng độc đáo của phần cứng Amiga là điều đặc biệt thú vị.

GN⁺ nhận định:

  • Bài viết này cho thấy rất rõ năng lực xử lý đồ họa của máy tính Amiga và các kỹ thuật tối ưu bộ nhớ trong quá trình phát triển game.
  • Bài viết giải thích cách tận dụng nén dữ liệu và các tính năng đặc biệt của phần cứng để tạo ra hiệu ứng ấn tượng trong giới hạn tài nguyên.
  • Việc hiểu và khai thác phần cứng của những máy tính cổ điển như Amiga là chủ đề rất hấp dẫn với các nhà phát triển game retro hoặc những người quan tâm đến lịch sử máy tính.

1 bình luận

 
GN⁺ 2024-02-26
Ý kiến trên Hacker News
  • Tóm tắt bình luận về "Racing the beam":

    • Một người dùng cho biết họ rất hiểu kỹ thuật 'beam racing' và nhớ rằng đã dùng kỹ thuật này để tính thời gian CPU cho mỗi khung hình.
    • Họ nhắc đến việc dùng địa chỉ $dff180 để đặt màu ở rìa màn hình, và nói rằng đã học kỹ thuật này qua truyền miệng chứ không phải từ Internet.
    • Họ tự hỏi liệu hiện nay vẫn còn những người cố gắng khai thác tối đa bộ chipset này hay không, đồng thời băn khoăn về chân dung những người phát triển game cho máy tính Amiga.
    • Họ bày tỏ lời cảm ơn vì đã chia sẻ sự quan tâm dành cho Amiga.
  • Tóm tắt bình luận về cấu hình bộ nhớ của Amiga 500:

    • Một người dùng chỉ ra rằng Amiga 500 mặc định có 512kB chip RAM, và nhiều người dùng đã mở rộng thêm 512kB fast RAM.
    • Họ giải thích rằng phần RAM mở rộng này không thể được phần cứng đồ họa truy cập trực tiếp, và thực ra còn chậm hơn fast RAM đúng nghĩa.
  • Tóm tắt bình luận về tiềm năng của game console kiểu Nhật trên Amiga:

    • Một người dùng tự hỏi game console kiểu Nhật sẽ trông như thế nào trên Amiga, và đặt câu hỏi liệu Amiga có thiếu hiệu năng hay chỉ đơn giản là họ không thích thiết kế của phần lớn các trò chơi.
    • Họ lấy bản chuyển thể game Bonk do Factor 5 thực hiện làm ví dụ và khen họ là những nhà phát triển như phù thủy.
  • Tóm tắt bình luận về sức hấp dẫn của việc lập trình trong giới hạn:

    • Một người dùng bày tỏ rằng việc lập trình trong những ràng buộc như vậy là cực kỳ hấp dẫn.
  • Tóm tắt bình luận về trải nghiệm cá nhân với Amiga và việc chia sẻ cách tạo hoạt ảnh:

    • Một người dùng nói rằng chiếc Amiga họ từng dùng tạo cảm giác khác với trải nghiệm của những người khác, và cho biết họ không thấy quá hoài niệm khi so với Nintendo NES.
    • Dù vậy, họ vẫn thừa nhận rằng việc cho thấy những hoạt ảnh này được tạo ra như thế nào là điều rất tuyệt.