Orijinal Xbox'ın sınırlarını aşan Halo 2 HD
Bu blog yazısı, orijinal Xbox sürümündeki Halo 2'ye HD çözünürlük desteği eklemek için yapılan tüm çalışmaları ele alıyor. Oyun yamalarından Xbox konsolunun donanım modifikasyonlarına ve performans kıyaslaması için özel araçlar yazmaya kadar, bu projenin amacı her ikisinin de sınırlarını aşmak ve ne kadar ileri gidilebileceğini görmekti.
- "doom" adlı arkadaşım son birkaç yıldır orijinal Xbox'ın donanım ve yazılımını tersine mühendislik ile inceliyor ve araştırıyordu
- Onun özel CPU interposer kartını kullanarak stok Pentium 3 CPU'yu 1.4Ghz'lik modifiye bir Pentium 3 CPU ile değiştirebildik ve ~2Ghz'e kadar hız aşırtma yapabildik
- Ayrıca daha hızlı CPU için oyunun zamanlama hesaplamalarını gerçek zamanlı yamalamak amacıyla Xbox çekirdeği için özel yamalar da yazdı
- RAM ve SSD gibi diğer donanım yükseltmeleriyle birleştirince buna "god box" demeye başladık
- doom, popüler oyunlar için 720p'de düzgün HD çözünürlük yamaları yapacak birini arıyordu ve bana ulaştı
- Ben de GPU hız aşırtması şartıyla teklifi kabul ettim; o da bunu yapıp "GENESIS-3" konsolunu sağladı
HD olarak işlemek
- D3D ön/arka buffer boyutlarını değiştirmek gerekiyor
- _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds, rasterizer_device_initialize fonksiyonlarını değiştirmek gerekiyor
- 720p etkin olduğunda g_progressive_scan_enabled ayarlanmalı ve video moduna göre screen_bounds ile frame_bounds değişkenleri belirlenmeli
- Video modunun progressive mi yoksa interlaced mi olduğuna bağlı olarak D3D sunum parametrelerine ek bayraklar ayarlanmalı
D3D belleğini verimli kullanmak
- Xbox, CPU ve GPU'nun aynı RAM'i paylaştığı birleşik bellek mimarisi kullanıyor
- Halo 2, render target'ları D3D'nin sağladığı fonksiyonlarla değil manuel olarak oluşturuyor
- Halo 2 yaklaşık 25 farklı render target kullanıyor ancak bellekten tasarruf etmek için yalnızca 4-5 benzersiz buffer ayırıyor
- rasterizer_primary_targets_initialize fonksiyonu, ek render target'lar ve texture view'lar oluşturmak için 640x480'e sabitlenmiş boyutlar kullanıyor
- Bu yüzden arka/ön/derinlik buffer'larının boyutunu değiştirdikten sonra bu fonksiyonu hook'layıp boyutları düzeltmek gerekiyor
Rasterizer target'larının boyutunu değiştirmek
- Texture accumulator (texaccum) render target'ının arka buffer çözünürlüğüyle eşleşmesi gerekiyor
- rasterizer_targets_initialize fonksiyonu texture accumulator'ın boyutlarını sabit kodluyor
- _rasterizer_alloc_and_create_render_target fonksiyonunu hook'layarak boyutları arka buffer boyutuyla eşleşecek şekilde değiştirdik
GN⁺ görüşü
- Bu proje son derece zor bir teknik meydan okumaydı, ancak Halo 2 motoru konusundaki Ryan'ın derin bilgisi ve Xbox donanımı konusundaki doom'un uzmanlığı sayesinde mümkün oldu
- HD ve hız aşırtma yamaları için Xbox çekirdeğine hot patch uygulamak gerçekten etkileyici ve yaratıcı bir çözümdü. Bu, donanımın fiziksel sınırlarını aşmanın iyi bir yolu
- Nihai sonuç harika olsa da özellikle texture pop-in'in azaltılması ve yükleme sürelerinin iyileştirilmesi açısından hâlâ geliştirme alanı var
- Render işleminin GPU bound olduğunu doğrulamak önemli bir içgörüydü. Ek RAM ile daha büyük bir texture cache kullanmak darboğazı hafifletebilir
- Kamera FOV açısını ayarlamak, LOD sistemini optimize etmek ve daha verimli model/texture sıkıştırması kullanmak gibi render motorunu daha da optimize etmenin yolları var
- Eski bir konsol oyunu için bu seviyede tersine mühendislik çalışması yapmak son derece etkileyici. Retro oyun sahnesi için büyük bir başarı
Henüz yorum yok.