Lập trình màn hình hoạt họa "woosh" trên Amiga
(dansalva.to)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:
- 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. - 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.
- Coprocessor (
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
Ý kiến trên Hacker News
Tóm tắt bình luận về "Racing the beam":
Tóm tắt bình luận về cấu hình bộ nhớ của Amiga 500:
Tóm tắt bình luận về tiềm năng của game console kiểu Nhật trên Amiga:
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:
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: