Dự án đưa game PS2 lên trình duyệt bằng cách biên dịch lại sang WebAssembly, không cần trình giả lập
Một lập trình viên đã phát triển thành công phương pháp chạy game PlayStation 2 trực tiếp trên trình duyệt web mà không cần trình giả lập truyền thống. Dự án biên dịch trước mã máy của chip Emotion Engine sang C++, sau đó sang WebAssembly, kết hợp với việc tái hiện hệ điều hành và phần cứng PS2 để render đồ họa bằng WebGPU.

Dự án đưa game PS2 lên trình duyệt bằng cách biên dịch lại sang WebAssembly, không cần trình giả lập
Một dự án mã nguồn mở mang tên PS2 Web Recomp đang gây chú ý trong cộng đồng công nghệ khi chứng minh rằng có thể chạy game PlayStation 2 ngay trên trình duyệt web mà không cần đến trình giả lập truyền thống. Thay vì mô phỏng phần cứng theo thời gian thực, dự án biên dịch trước mã máy của game sang C++, rồi sang WebAssembly, và render đồ họa bằng WebGPU.
Điểm đáng chú ý là Gran Turismo 4 — một trong những tựa game nặng nhất trên hệ máy này — đã chạy được từ màn hình khởi động, qua menu, đến các cuộc đua với đầy đủ âm nhạc và hiệu ứng âm thanh, ở tốc độ 50 khung hình mỗi giây trên GPU tích hợp của laptop.
Giao diện game PS2 chạy trên trình duyệt web
Cách tiếp cận: Biên dịch lại thay vì giả lập
Phương pháp cốt lõi của dự án là biên dịch lại tĩnh (static recompilation). Công cụ eerecomp đọc file thực thi của game, phân tích luồng điều khiển để tìm ra các hàm, rồi sinh mã C++ tương ứng theo từng đơn vị 16 KiB mã khách.
Mã đầu ra vẫn giữ nguyên những đặc thù của chip R5900 trên PS2, bao gồm thanh ghi 128-bit, các lệnh đa phương tiện, khe trễ rẽ nhánh (branch delay slot), và đơn vị xử lý vector 0 dùng như bộ đồng xử lý. Đặc biệt, đơn vị dấu phẩy động của PS2 không có giá trị vô cực hay số dưới chuẩn, và làm tròn khác chuẩn IEEE — những chi tiết tưởng như nhỏ nhặt này lại ảnh hưởng trực tiếp đến hành vi của game.
Bên cạnh đó, dự án còn tái hiện một nhân PS2 thu gọn: các luồng, semaphore, trình xử lý ngắt cho bộ điều khiển DMA và tín hiệu xóa dọc, cùng kênh SIF kết nối CPU chính với bộ xử lý vào/ra. Bộ xử lý vào/ra chạy chính các module IRX của game — trình điều khiển âm thanh, mã truyền phát đĩa, và trình điều khiển tay cầm cùng thẻ nhớ — trên một trình thông dịch CPU R3000.
Đĩa game được đọc qua các yêu cầu HTTP Range, nghĩa là chỉ có file thực thi được tải về trước, không cần tải toàn bộ dữ liệu game.
Xử lý đồ họa và âm thanh
Phần lớn công việc đồ họa 3D của game PS2 diễn ra trong các vi chương trình mà game tải lên đơn vị vector 1. Các vi chương trình này chạy với phép toán dấu phẩy động chính xác đến từng bit theo chuẩn PS2, đồng thời mô phỏng độ trễ đường ống của các cờ MAC, trạng thái và clip — vì game lập trình dựa trên những độ trễ này.
Về đồ họa, 4 MB bộ nhớ video của chip Graphics Synthesizer được đặt trên GPU với đúng cách bố trí xen kẽ nguyên bản, và việc vẽ được thực hiện bằng các compute shader WebGPU. Tam giác được phân vào các ô (tile) và rasterize theo đúng quy tắc của GS về texturing, bảng màu, hòa trộn alpha, kiểm tra độ sâu và alpha đích. Nhờ mọi thứ nằm trong bộ nhớ GS, các hiệu ứng render vào texture hay diễn giải lại framebuffer như bảng màu đều hoạt động giống như trên máy console thật.
Âm thanh được tái hiện qua chip SPU2 với 48 giọng ADPCM, đường bao ADSR và DMA truyền phát mà game dùng cho nhạc, đưa ra qua AudioWorklet. Phim trong game được giải mã bằng một bản tái hiện của IPU — bộ giải mã MPEG-2 của PS2.
Bài học tối ưu hiệu năng
Quá trình phát triển dự án mang lại nhiều bài học thú vị về tối ưu hóa. Cuộc đua đầu tiên chỉ chạy được 3 khung hình mỗi giây, với rasterizer phần mềm và trình thông dịch cho đơn vị vector 1. Sau khi chuyển GS sang compute shader WebGPU và biên dịch trước các chương trình đơn vị vector, con số này tăng lên khoảng 70 khung hình mỗi giây.
Một phát hiện đáng chú ý: phiên bản đầu tiên của renderer GPU gửi khoảng 650 lệnh compute dispatch mỗi khung hình, vì mỗi lần tải texture hay bảng màu đều chia cắt lô tam giác xung quanh nó. Việc đưa các thao tác tải lên trước những tam giác không phụ thuộc vào chúng đã giảm con số này xuống còn khoảng 80.
Đặc biệt, Gran Turismo 4 tải lên cùng 3 MB texture trong mỗi khung hình của cuộc đua. Vì bộ nhớ GS được hoán đổi giữa các khung hình, không thể bỏ qua các thao tác tải này, nhưng một bộ nhớ đệm 16 MB trên GPU giúp phần lớn trong số đó được phục vụ mà không cần truyền lại từ WebAssembly sang GPU — cắt giảm khoảng 60% dữ liệu gửi mỗi khung hình.
Ngay cả cách lập lịch của trình duyệt cũng đóng vai trò quan trọng. Các lệnh gọi setTimeout lồng nhau bị giới hạn ở 4 mili-giây, nên vòng lặp giả lập giờ đây nhường quyền qua MessageChannel thay thế, và việc chuyển giả lập vào một worker riêng giúp ổn định tốc độ ở mức 50 khung hình mỗi giây.
God of War II: Bài kiểm tra độ bền của dự án
God of War II được đưa lên theo cùng quy trình, và nó đã phát hiện hai lỗi mà Gran Turismo 4 chưa từng kích hoạt: một lỗi trong bộ biên dịch lại và một lỗi về thời điểm của đơn vị vector. Ban đầu game chạy trong im lặng hoàn toàn, vì trình điều khiển âm thanh của nó dựa vào một bộ định thời phần cứng của bộ xử lý vào/ra mà dự án chưa triển khai.
Sau đó là một loạt lỗi khác: các đa giác phẳng khổng lồ phủ khắp màn hình, rồi game crash khi danh sách render vượt quá bộ nhớ và ghi đè lên chính các trình xử lý xóa dọc của nó. Truy vết danh sách liên kết bị hỏng bằng watchpoint phần cứng dẫn đến lỗi trong bộ biên dịch lại: khi một lệnh rẽ nhánh là lệnh cuối cùng của đơn vị 16 KiB, nhánh không lấy rẽ nhánh tiếp tục ở đơn vị kế tiếp tại khe trễ thay vì sau nó, khiến lệnh đó chạy hai lần.
Hiện tại chỉ có hai game được đưa lên thành công. Một game khác nhiều khả năng sẽ dừng lại ở một system call hoặc một hàm thư viện IOP chưa được triển khai.
Tự chuyển game của bạn
Dự án cung cấp script port.sh để tự động hóa toàn bộ quy trình. Yêu cầu cài đặt gồm git, CMake, Ninja, trình biên dịch C++20, Python 3 và 7-Zip nếu file đĩa ở định dạng .7z. Mọi thứ đã được chạy thử trên Linux x86-64.
Quy trình hoạt động như sau: script đọc file đĩa, lấy chương trình khởi động từ file SYSTEM.CNF, dịch mã máy sang C++, rồi chạy game ở chế độ headless vài lần để phát hiện các hàm mà phân tích tĩnh không thấy được. Mỗi lần chạy, script ghi lại các địa chỉ chưa tìm thấy, thêm chúng làm điểm vào và dịch lại — lặp cho đến khi một lần chạy hoàn tất mà không có địa chỉ mới nào. God of War II mất khoảng 3 phút 30 giây để đi từ file ISO đến trang web hoàn chỉnh trên laptop 8 nhân.
Yêu cầu trình duyệt và lưu game
Trang web cần WebGPU cho renderer GPU. Chrome và Edge đã hỗ trợ trên Windows và macOS. Trên Linux, tính năng này bị tắt mặc định trong Chrome và Chromium, người dùng cần bật thủ công qua các cờ chrome://flags/#enable-unsafe-webgpu và chrome://flags/#enable-vulkan rồi khởi động lại trình duyệt.
Về điều khiển, bàn phím ánh xạ các nút mặt sang Z (chéo), X (tròn), A (vuông) và S (tam giác); các nút vai sang Q, W, 1 và 2; start và select sang Enter và Backspace; phím điều hướng sang các phím mũi tên. Tay cầm chơi game hoạt động qua Gamepad API của trình duyệt, điện thoại có nút điều khiển trên màn hình.
Trang web cũng đặt một thẻ nhớ ảo vào khe 1 và lưu trong bộ nhớ trình duyệt, giúp tiến trình chơi không mất khi tải lại trang. Người dùng có thể xuất thẻ nhớ thành file .ps2 theo định dạng PCSX2 dùng, hoặc nhập file như vậy vào lại — cho phép thẻ nhớ di chuyển giữa các trình duyệt.
Khía cạnh pháp lý
Dự án không bao gồm bất kỳ dữ liệu game nào. Repository chỉ chứa mã gốc và mã bên thứ ba theo giấy phép riêng. Mã C++ được sinh ra và file WebAssembly được build là bản dịch của file thực thi game, do đó thuộc quyền sở hữu của chủ sở hữu game — người dùng nên giữ chúng trên máy của mình và không công bố.
Người dùng cần tự cung cấp file đĩa của game mà mình sở hữu hợp pháp. Gran Turismo, God of War và PlayStation là thương hiệu của Sony Interactive Entertainment; dự án này không liên kết cũng không được Sony, Polyphony Digital, Santa Monica Studio hay bất kỳ nhà phát hành game nào bảo trợ.
Mã nguồn của dự án được phát hành theo giấy phép MIT, với một số phần giữ thông báo BSD 2 điều khoản từ dự án Play!.
Bài viết liên quan

Công nghệ
Nộp đơn xin việc lẽ ra nên khó hơn. Thật đấy
25 tháng 8, 2026

Công nghệ
Mô hình AI hàng đầu giỏi Vật lý đến đâu? Nghiên cứu mới chỉ ra các bài kiểm tra hiện hành đang đánh giá sai
16 tháng 9, 2026

Công nghệ
Trò chơi chiến tranh về việc làm mờ mặt trời: Khi địa chính trị lấn át khoa học
12 tháng 10, 2026