deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

God of War PSP oyunları WebAssembly'ye yeniden derlenerek emülatörsüz tarayıcıda çalışıyor

Statik yeniden derleme projesi, PSP God of War oyunlarının MIPS kodunu WebAssembly'ye çeviriyor; her iki oyun da emülatör yerine HLE kernel ve WebGL2 renderer ile masaüstü tarayıcılarında 60 fps'e varan hızda çalışıyor.

God of War PSP oyunları WebAssembly'ye yeniden derlenerek emülatörsüz tarayıcıda çalışıyor

Ready at Dawn'ın iki God of War PSP oyunu da artık arkasında emülatör olmadan bir web tarayıcısında çalışıyor. Projenin GitHub deposu snuri00/psp-web-recomp'a göre, oyunların özgün MIPS makine kodu önceden C++'a çevriliyor, WebAssembly'ye derleniyor ve WebGL2 üzerinden çizim yapan, PSP'nin işletim sisteminin ve grafik donanımının kompakt bir yeniden uygulamasına bağlanıyor. Bu çalışma Hacker News ana sayfasında yer aldı. God of War: Chains of Olympus, Chrome ve Firefox'ta bir dizüstü bilgisayarda, şimdiye kadar ölçülen sahnelerde açılıştan menülere, ara sahneler ve dövüşlere kadar saniyede 60 kareyle, PSP'nin doğal çözünürlüğünün dört katına kadar çözünürlükte ve ekrandaki dokunmatik kontrollerle telefonlarda oynanıyor. Müzik, konuşma ve ses efektleri çalışıyor; filmler şimdilik atlanıyor.

Port nasıl çalışıyor

Yeniden derleme işini PSPRecomp üstleniyor; şifresi çözülmüş çalıştırılabilir dosyayı analiz ediyor, fonksiyonlarını tespit ediyor ve her biri 16 KiB misafir kod içeren çeviri birimleri halinde C++ üretiyor; üretilen kod bir register file ve PSP'nin belleğinin bir modeli üzerinde çalışıyor. Proje, PSPRecomp'a yamalar ve onun için yeni bir web profili hedefi ekliyor.

Oyunun PSP'nin işletim sisteminden istediği her şey üst düzey emülasyonla karşılanıyor: semaforlu, event flag'li ve callback'li kooperatif thread'ler, bellek bölümleri, disk verisini HTTP Range istekleri üzerinden aktaran böylece yalnızca çalıştırılabilir dosyanın önceden indirildiği bir dosya sistemi, ayrıca kontrolcü, ses, kayıt verisi ve diyalog yönetimi. Misafir zamanı kareler halinde ilerliyor; dolayısıyla oyun, ana makine ne kadar hızlı olursa olsun sabit bir 60 Hz görüyor.

Grafik tarafında, PSP grafik motorunun display list'leri CPU'da çözümleniyor — vertex formatları, skinning, aydınlatma, doku üretimi, kırpma ve arka yüz ayıklama — ve bir WebGL2 renderer'a toplanıyor. Framebuffer'lar, VRAM'deki konumlarına göre anahtarlanan render target'lara dönüşüyor; piksel formatını yeniden yorumlama, PSP'nin stencil-in-alpha özelliği, sis ve block transfer gibi davranışlar GPU'da ele alınıyor. Ses, PSP'nin 32 sesli ADPCM sentezleyicisinin bir yeniden uygulamasından, FFmpeg ile ATRAC3+ kod çözümünden ve bir AudioWorklet mixer'dan geliyor. Gerçek donanımdaki gibi grafik motoru, OffscreenCanvas ile ayrı bir worker thread'de çalışıyor; böylece bir karenin maliyeti ikisinin toplamı değil, iki thread'den meşgul olanınki oluyor.

6 fps'ten 60'a

İlk oynanabilir sürüm saniyede 6 kareyle çalışıyordu ve projenin yazısı, 60'a giden yolun çoğunun renderer'ı hızlandırmaktan değil, zamanın gerçekte nereye gittiğini bulmaktan geldiğini açıkça belirtiyor. En büyük tek kazanç: God of War framebuffer'ını dikey boşluğu beklemeden değiştiriyor; bu yüzden oyun ekrana ulaşan her kare için kabaca sekiz kare çiziyordu. Tek bir boşluk içinde iki kez değişim yapan bir thread'i bir sonrakine kadar tutmak — PPSSPP emülatörünün de kullandığı bir hile — tek başına, görüntülenen kare başına işi sekiz kat azalttı.

Birkaç diğer bulgu tarayıcıya özgüydü. WebAssembly'de saati std::chrono ile okumak clock_gettime ve bir BigInt dönüşümü üzerinden JavaScript'e geçiyor; bunu her primitive başına yapan profil zamanlayıcıları, yalnızca profil sırasında performance.now() okuyacak şekilde değiştirilene kadar bir karenin yaklaşık üçte birini tüketiyordu. Firefox, her WebGL buffer yüklemesini GPU sürecine kopyalıyor ve her değişiklikten sonra bir index buffer'ı yeniden doğruluyor; bu yüzden paylaşılan 4 MB'lık index ring, her çizime kendi küçük buffer'ı verilene kadar Firefox'u 3 fps'e düşürdü. Ve God of War'ın yansıtılan gölgeleri için PSP'nin stencil-in-alpha kanalını taklit etmek, başlangıçta 4× çözünürlükte kare başına 60 milyon ekstra piksele mal oluyordu; gerçekten değişen dikdörtgenleri ve stencil değerlerini izlemek bunu yaklaşık 7 milyona indirdi.

İkinci bir oyun pipeline'ı kanıtlıyor

Ghost of Sparta, aynı scriptler değiştirilmeden kullanılarak bir ZIP arşivinden oynanabilir bir sayfaya dönüştü, sonra açılışta takıldı. Sebep, PSP'nin DRM bayrağını taşıyan ve KIRK şifreleme motoruyla çözülen 176 baytlık bir dosyaydı — pratikte KIRK'ın kasasından üç anahtarlı AES-128, bir CMAC başlık denetimi ve counter-mode veri — ve proje bunu artık uyguladı. Bir beyaz gökyüzü hatası, opaklığı global ambient ışığın alfa kanalından gelen bir bulut katmanına dayanıyordu; aydınlatma kodunun atladığı bir etkendi bu. Performans ayarı gerekmedi: kareler 6–8 ms tutuyor ve oyun doğal çözünürlüğün üç katında 55–60 fps çalışıyor.

Depoda oyun verisi yok; kendi oyununuzun bir disk kalıbını siz sağlıyorsunuz ve scriptler onu yerel olarak bir web sayfasına dönüştürüyor. Portlama için git, CMake, Ninja, bir C++20 derleyicisi ve Python 3 gerekiyor; oyun başına kabaca 2 GB disk alanı yeterli. Depoya göre God of War, 8 çekirdekli bir dizüstünde ZIP'ten oynanabilir sayfaya yaklaşık dört dakikada gidiyor.

Neden önemli

Statik yeniden derleme, kapalı kaynaklı bir konsol ikili dosyasını sıradan web koduna dönüştürüyor; hem dinamik emülasyonun kare başına ek yükünden hem de tarayıcıların çalışma zamanı kod üretimine getirdiği kısıtlamalardan kaçınıyor. Ayrıca modern tarayıcı yığınının — WebAssembly, WebGL2, worker thread'ler, AudioWorklet — dizüstü ve telefonlarda el konsolu oyununu 60 fps ile sürdürebildiğini gösteriyor. Sınırlar dürüstçe belirtilmiş: yalnızca iki oyun ayaklandırılmış, ikisi de aynı motor üzerine kurulu Ready at Dawn yapıtları ve başka bir stüdyodan bir oyun büyük olasılıkla uygulanmamış bir sistem çağrısında ya da desteklenmeyen bir grafik özelliğinde duracaktır. Yine de tekniğin bir gösterimi olarak bunu geçmek zor ve depo, başkalarının ek oyunları denemesi için araçları sunuyor.

  • #webassembly
  • #emulation
  • #browser-gaming
  • #webgl
  • #static-recompilation