1 pontos por GN⁺ 2024-04-19 | Ainda não há comentários. | Compartilhar no WhatsApp

Halo 2 em HD, rompendo os limites do Xbox original

Este post do blog cobre todo o trabalho realizado para adicionar suporte a resolução HD à versão original de Halo 2 no Xbox. De patches no jogo a modificações de hardware no console Xbox, passando pela criação de ferramentas personalizadas para benchmark de desempenho, o objetivo deste projeto foi superar os limites de ambos e ver até onde seria possível ir.

  • O amigo "doom" passou os últimos anos fazendo engenharia reversa e estudando o hardware e o software do Xbox original
  • Usando sua placa interposer de CPU personalizada, foi possível substituir a CPU Pentium 3 original por uma variante de Pentium 3 de 1.4Ghz e fazer overclock até ~2Ghz
  • Ele também escreveu patches personalizados para o kernel do Xbox para corrigir em tempo real os cálculos de timing do jogo para a CPU mais rápida
  • Combinado com outros upgrades de hardware, como RAM e SSD, isso passou a ser chamado de "god box"
  • doom queria alguém que fizesse patches adequados de resolução HD para jogos populares em 720p, e me pediu isso
  • Eu aceitei a proposta com a condição de fazer overclock na GPU, e ele realizou isso e forneceu o console "GENESIS-3"

Renderizando em HD

  • É necessário alterar o tamanho dos buffers D3D de frente/verso
  • É necessário modificar as funções _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds e rasterizer_device_initialize
  • Quando 720p está ativado, é preciso definir g_progressive_scan_enabled e ajustar as variáveis screen_bounds e frame_bounds de acordo com o modo de vídeo
  • Também é necessário definir flags adicionais nos parâmetros de apresentação do D3D, dependendo de o modo de vídeo ser progressivo ou entrelaçado

Usando a memória D3D com eficiência

  • O Xbox usa uma arquitetura de memória unificada em que CPU e GPU compartilham a mesma RAM
  • Halo 2 cria os render targets manualmente, em vez de usar as funções fornecidas pelo D3D
  • Halo 2 usa cerca de 25 render targets diferentes, mas aloca apenas 4-5 buffers únicos para economizar memória
  • A função rasterizer_primary_targets_initialize cria render targets adicionais e visualizações de textura usando dimensões fixas de 640x480
  • Por isso, após redimensionar os buffers traseiro/dianteiro/de profundidade, é necessário fazer hook nessa função e corrigir as dimensões

Redimensionando os alvos do rasterizer

  • O render target do acumulador de textura (texaccum) precisa corresponder à resolução do back buffer
  • A função rasterizer_targets_initialize fixa as dimensões do acumulador de textura no código
  • Foi feito hook na função _rasterizer_alloc_and_create_render_target para alterar as dimensões e corresponder ao tamanho do back buffer

Opinião do GN⁺

  • Este projeto foi um desafio técnico extremamente difícil, mas só foi possível graças ao profundo entendimento de Ryan sobre a engine de Halo 2 e à expertise de doom em hardware do Xbox
  • Fazer hot patch no kernel do Xbox para os patches de HD e overclock foi uma solução realmente impressionante e criativa. É uma ótima forma de superar os limites físicos do hardware
  • O resultado final é excelente, mas ainda há espaço para melhorias, especialmente na redução de texture pop-in e na melhoria dos tempos de carregamento
  • Confirmar que o rendering era limitado pela GPU foi um insight importante. Com RAM adicional, seria possível usar um cache de texturas maior para aliviar o gargalo
  • Há maneiras de otimizar ainda mais a engine de renderização, como ajustar o ângulo de FOV da câmera, otimizar o sistema de LOD e usar compressão mais eficiente de modelos/texturas
  • Fazer um trabalho de engenharia reversa nesse nível para um jogo de console antigo é muito impressionante. Esta é uma grande conquista para a cena de jogos retrô

Ainda não há comentários.

Ainda não há comentários.