1 điểm bởi GN⁺ 2024-04-19 | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

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_enabled và thiết lập các biến screen_bounds cùng frame_bounds theo 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_initialize dù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.

Chưa có bình luận nào.