Halo 2 HD phá vỡ giới hạn của Xbox nguyên bản
Bài đăng blog này trình bày toàn bộ công việc đã được thực hiện để bổ sung hỗ trợ độ phân giải HD cho Halo 2 trên Xbox nguyên bản. Từ việc vá game, chỉnh sửa phần cứng của máy Xbox cho đến viết các công cụ tùy chỉnh để benchmark hiệu năng, mục tiêu của dự án này là vượt qua giới hạn của cả hai và xem có thể đi xa đến đâu.
- Người bạn "doom" đã reverse engineering và nghiên cứu phần cứng lẫn phần mềm của Xbox nguyên bản trong vài năm qua
- Nhờ bo mạch CPU interposer tùy chỉnh của anh ấy, có thể thay CPU Pentium 3 mặc định bằng một biến thể Pentium 3 1.4Ghz và ép xung lên tới khoảng ~2Ghz
- Anh ấy cũng đã viết các bản vá tùy chỉnh cho kernel Xbox để vá nóng các phép tính thời gian của game theo thời gian thực cho CPU nhanh hơn
- Kết hợp với các nâng cấp phần cứng khác như RAM và SSD, họ bắt đầu gọi nó là "god box"
- doom muốn có người tạo bản vá độ phân giải HD đúng nghĩa cho các game phổ biến ở 720p và đã nhờ tôi
- Tôi chấp nhận lời đề nghị với điều kiện GPU cũng được ép xung, và anh ấy đã làm điều đó rồi cung cấp chiếc console "GENESIS-3"
Render ở chế độ HD
- Cần thay đổi kích thước của D3D front/back buffer
- Cần chỉnh sửa các hàm _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds, rasterizer_device_initialize
- Khi 720p được kích hoạt, cần đặt
g_progressive_scan_enabledvà thiết lập các biếnscreen_boundscùngframe_boundstheo chế độ video - Đặt thêm các cờ cho tham số trình bày D3D tùy theo chế độ video là progressive hay interlaced
Sử dụng bộ nhớ D3D hiệu quả
- Xbox sử dụng kiến trúc bộ nhớ hợp nhất, trong đó CPU và GPU chia sẻ cùng một RAM
- Halo 2 tạo render target theo cách thủ công thay vì dùng các hàm do D3D cung cấp
- Halo 2 dùng khoảng 25 render target khác nhau nhưng chỉ cấp phát 4-5 buffer duy nhất để tiết kiệm bộ nhớ
- Hàm
rasterizer_primary_targets_initializedùng các kích thước hardcode 640x480 để tạo thêm render target và texture view - Vì vậy sau khi thay đổi kích thước back/front/depth buffer, cần hook hàm này và sửa lại kích thước
Thay đổi kích thước các rasterizer target
- Render target texture accumulator (
texaccum) phải khớp với độ phân giải của back buffer - Hàm
rasterizer_targets_initializeđang hardcode kích thước của texture accumulator - Hook hàm
_rasterizer_alloc_and_create_render_targetđể thay đổi kích thước cho khớp với kích thước back buffer
Ý kiến của GN⁺
- Đây là một thử thách kỹ thuật cực kỳ khó, nhưng có thể thực hiện được nhờ hiểu biết sâu sắc của Ryan về engine Halo 2 và chuyên môn của doom về phần cứng Xbox
- Việc hot-patch kernel Xbox cho các bản vá HD và ép xung là một giải pháp thực sự ấn tượng và sáng tạo. Đây là cách hay để vượt qua các giới hạn vật lý của phần cứng
- Kết quả cuối cùng rất ấn tượng, nhưng vẫn còn chỗ để cải thiện, đặc biệt là ở việc giảm hiện tượng texture pop-in và cải thiện thời gian tải
- Việc xác nhận rằng rendering bị giới hạn bởi GPU là một insight quan trọng. Có thể giảm nút thắt cổ chai bằng cách dùng cache texture lớn hơn với thêm RAM
- Có nhiều cách để tối ưu thêm rendering engine, như điều chỉnh góc FOV của camera, tối ưu hệ thống LOD và dùng cơ chế nén model/texture hiệu quả hơn
- Thực hiện mức độ reverse engineering này cho một game console đời cũ là điều vô cùng ấn tượng. Đây là một thành tựu lớn cho cộng đồng game retro
Chưa có bình luận nào.