1P by neo 7달전 | favorite | 댓글과 토론

오리지널 Xbox의 한계를 뚫는 Halo 2 HD

이 블로그 포스트에서는 오리지널 Xbox 버전의 Halo 2에 HD 해상도 지원을 추가하기 위해 수행한 모든 작업을 다룹니다. 게임 패치부터 Xbox 콘솔의 하드웨어 수정, 성능 벤치마킹을 위한 사용자 정의 도구 작성에 이르기까지, 이 프로젝트의 목표는 둘 다의 한계를 극복하고 얼마나 멀리 갈 수 있는지 보는 것이었습니다.

  • 친구 "doom"은 지난 몇 년 동안 오리지널 Xbox의 하드웨어와 소프트웨어를 리버스 엔지니어링하고 연구했음
  • 그의 사용자 정의 CPU 인터포저 보드를 사용하여 스톡 펜티엄 3 CPU를 1.4Ghz의 변형 펜티엄 3 CPU로 교체하고 ~2Ghz까지 오버클럭할 수 있었음
  • 또한 빠른 CPU를 위해 게임의 타이밍 계산을 실시간으로 패치하기 위해 Xbox 커널용 사용자 정의 패치를 작성했음
  • RAM과 SSD 같은 다른 하드웨어 업그레이드와 결합하여 "god box"라고 부르기 시작함
  • doom은 720p에 대해 인기 있는 게임의 적절한 HD 해상도 패치를 만들어 줄 사람을 원했고, 나에게 요청함
  • 나는 GPU 오버클럭을 조건으로 제안을 수락했고, 그는 이를 수행하고 "GENESIS-3" 콘솔을 제공했음

HD로 렌더링하기

  • D3D 프론트/백 버퍼의 크기를 변경해야 함
  • _rasterizer_detect_video_mode, _rasterizer_init_screen_bounds, rasterizer_device_initialize 함수를 수정해야 함
  • 720p가 활성화되면 g_progressive_scan_enabled을 설정하고, 비디오 모드에 따라 screen_bounds와 frame_bounds 변수를 설정해야 함
  • 비디오 모드가 프로그레시브 또는 인터레이스인지에 따라 D3D 프레젠테이션 매개변수에 추가 플래그 설정

D3D 메모리를 효율적으로 사용하기

  • Xbox는 CPU와 GPU가 동일한 RAM을 공유하는 통합 메모리 아키텍처를 사용함
  • Halo 2는 D3D에서 제공하는 함수가 아닌 수동으로 렌더 타겟을 생성함
  • Halo 2는 약 25개의 다양한 렌더 타겟을 사용하지만 4-5개의 고유한 버퍼만 할당하여 메모리를 절약함
  • rasterizer_primary_targets_initialize 함수는 640x480의 하드코딩된 치수를 사용해 추가 렌더 타겟과 텍스처 뷰를 생성함
  • 따라서 백/프론트/깊이 버퍼의 크기를 조정한 후에 이 함수를 후킹하고 치수를 고쳐야 함

래스터 라이저 타겟의 크기 조정

  • 텍스처 어큐뮬레이터(texaccum) 렌더 타겟이 백 버퍼 해상도와 일치해야 함
  • rasterizer_targets_initialize 함수가 텍스처 어큐뮬레이터의 치수를 하드코딩하고 있음
  • _rasterizer_alloc_and_create_render_target 함수를 후킹하여 백 버퍼 크기와 일치하도록 치수를 변경함

GN⁺의 의견

  • 이 프로젝트는 매우 어려운 기술적 도전이었지만, Halo 2 엔진에 대한 Ryan의 깊은 이해와 Xbox 하드웨어에 대한 doom의 전문 지식이 있었기에 가능했음
  • HD 및 오버클럭 패치를 위해 Xbox 커널을 핫 패치하는 것은 정말 인상적이고 창의적인 해결책이었음. 이는 하드웨어의 물리적 한계를 극복하는 좋은 방법임
  • 최종 결과는 훌륭하지만 특히 텍스처 팝인 감소와 로딩 시간 개선에서 여전히 개선의 여지가 있음
  • 렌더링이 GPU 바운드라는 것을 확인한 것은 중요한 통찰력이었음. 추가 RAM으로 더 큰 텍스처 캐시를 사용하여 병목 현상을 완화할 수 있음
  • 카메라 FOV 각도 조정, LOD 시스템 최적화, 더 효율적인 모델/텍스처 압축 사용 등 렌더링 엔진을 추가로 최적화할 수 있는 방법이 있음
  • 구형 콘솔 게임을 위해 이 수준의 리버스 엔지니어링 작업을 수행하는 것은 매우 인상적임. 이것은 레트로 게임 장면을 위한 대단한 업적임