본문 바로가기
게임/추가 정보

돌핀 에뮬레이터 6~7월 진행 보고서

by 사과향잉크 2019. 8. 11.

여름이 짧아 6월과 7뤌 보고서를 합치기로 했습니다.

GUI 업데이트, 안드로이드, 오래된 버그 수정 등이 있었습니다.

 

5.0-10558 게코/액션 리플레이 코드 재배열

겉으로 보기에는 코드 목록이 별로 중요하지 않을 수 있지만 이런 기능에 의존하는 사람들이 훨씬 더 좌절한다는 것을 금방 알았습니다.

돌핀은 사용자의 INI 파일에 나타나는 대로 코드를 나열하고 있습니다.

많은 사람들은 목록에 맨 위에 중요한 코드를 놓아 쉽게 볼 수 있게 쓰고 있었죠.

그런데 이전에 방식이 바뀌어 알파벳 순서로 자동 정렬되어 원하는대로 놓을 수가 없게 됐습니다.

다운로드한 코드를 알파벳 순서로 검색하려는 사람들도 짜증을 냈죠.

 

돌핀은 다양한 요구에 부응해야하며, 잘 아는 사람이든 그렇지 않은 사람이든 치트를 사용하기 쉽게 만들고 싶었습니다.

Spycrab이 임무를 맡았고, 두 가지 새 기능을 추가했습니다.

원한다면 알파벳순으로 정렬할 수 있지만, 그렇게 하지 않을 수도 있습니다.

또한 이제 INI에서 파일을 수정할 필요 없이 드래그 앤 드롭으로 순서를 바꿀 수 있습니다.

알파벳순으로 정렬한 뒤에 원하는 것만 끌어서 위에 놓을 수 있죠.

우리가 무심코 저지른 일로 사람들이 힘들어하지 않았길 바라며 앞으로 계속 개선하고 싶습니다.

 

5.0-10578  또 다시... 종횡비 크롭 수정

게임큐브와 위의 추악한 비밀 중 하나는 대부분의 게임을 4:3이나 16:9 비율로 완벽하게 출력하지 못한다는 겁니다.

돌핀은 작은 검은색 막대를 적절히 배치해 게임이 렌더링하는 것을 왜곡 없이 모두 보여주려고 하죠.

검은 막대가 싫다면 크롭 설정으로 이미지를 왜곡하지 않고 화면을 채울 수 있습니다. 렌더링한 게임 일부는 화면 밖에 있지만 말이죠.

 

슈퍼 마리오 갤럭시 크롭 전/후

비슷한 얘기를 들어본 것 같다면 맞습니다. 최근 크롭에서 몇 번 문제가 생겼으니까요.

이번에는 이미지를 잘라내지 않고, 늘려버리는 문제가 있었습니다.

techjar는 빠르게 해결했습니다.

 

크롭 문제 수정 전/후

왜곡이 심하지 않아 보일 수 있지만, 확실한 문제고 우리가 망칠 때마다 사람들은 알아챘죠.

누군가에는 다른 그래픽 문제보다 이게 훨씬 더 나쁠 겁니다.

이렇게, 다시 한 번 크롭이 잘 되서 기쁘군요... 현재는 말이죠.

 

5.0-10625 - 텍스처 캐쉬: VRAM 텍스처 포맷 재해석 지원

버그를 잘못 해석하는 문제를 디버깅할 때 생길 수 있는 가장 위험하고 해로운 실수일 수 있습니다.

심슨 게임 같은 경우는 다른 문제들과 너무 가까워서 결국 하나로 뭉치게 되었죠.

 

게임을 괴롭히는 그래픽버그는 에뮬레이션을 크게 느리게 하지 않으면 수정할 수 없는 것으로 간주되었습니다.

의욕을 잃은 개발자들은 더 조사하지 않고 문서로만 남겼죠.

스파이더 맨 : 섀터드 디멘션즈는 그런 얘기가 없었기에 듀토리얼 전체적으로 그래픽 문제가 심각하다는 의견이 나오자 조사하는데 시간이 걸렸습니다.

 

8년 전과 지금 디버깅에서 큰 차이 중 하나는 돌핀이 더 나은 전체 에뮬레이션, 더 많은 디버깅 설정을 가지고 있다는 겁니다.

진행 보고서를 오래 본 분들은 우리가 'EFB 복사를 VRAM에 담기'라 부르는 강력한 세 번째 모드를 가지고 있단 걸 아실텐데요.

모든 EFB 복사를 에뮬레이션한 램 버전으로 강제하여 느려지고 고해상도 출력을 쓸 수 없습니다.

대부분은 이 기능을 쓰고 싶지 않겠지만, 가끔은 돌핀이 EFB 복사 에뮬레이션 경로가 잘 되어있는지 확인할 때 유용하게 쓸 수 있죠.

몇 달 전에 메트로이드 프라임 3의 문제가 그랬듯, 다시 한 번 이 기능이 디버깅의 열쇠가 되었씁니다.

 

기본 설정에서 엉망이 된 모습 / 임시방편으로 색을 없앤 모습

위의 두 사진 모두 정상은 아니지만, 'EFB 복사를 VRAM에 담기' 기능이 이렇게 큰 차이를 만듭니다.

그래서 개발자들은 이 문제는 돌핀이 EFB 복사를 처리하는 방식에서 비롯되었다고 생각했죠.

Stenzek은 몇 시간 동안 게임이 어떻게 렌더링되는지 조사했습니다.

그리고 그는 하나가 아닌 두 개의 버그를 발견했습니다.

하나는 'EFB 복사를 텍스처에만 담기, 다른 하나는 'EFB 복사를 램에 담기'에 있었죠.

사람들이 겪는 문제는 이 게임이 하나의 포맷으로 텍스처를 만든 다음 다른 형식으로 샘플링하여 후처리효과를 내는 것에서 발생했습니다.

CPU가 이 텍스처를 수정하지 않았기 때문에 항상 'EFB 복사를 텍스처에만 담기'로 저장되죠.

'EFB 복사를 램에 담기'의 문제는 단순한 색상 문제였습니다.

돌핀은 그린 레드인 CC8 텍스처를 레드 그린인 RG8 텍스처로 해석하고 있었습니다.

실제 블루 그린은 그린 블루로 인코딩하고 있었죠.

 

다른 문제는 좀 더 복잡했는데 다른 형태로 샘플링 텍스처를 구현해야했습니다.

원래 텍스처는 R, G, B, A의 8비트로 인코딩됐는데 스파이더맨은 4비트 적색/강도와 4비트 알파로 바꾸고 있었고, 돌핀은 그걸 그냥 8비트로 적색으로 다루고 있었죠.

Stenzek은 텍스처를 잘못 자르지 않게 'EFB 복사를 텍스처에만 담기'에 새로운 기능을 추가했습니다.

 

수정 전/후

돌핀은 과거에 문제가 있었던 다양한 게임에 그의 수정 사항을 적용했습니다.

그리고 위에 말했다시피 미해결 문제였던 심슨 게임에도 적용되었죠.

 

수정 전/후

심심한 결말처럼 들릴지 모르겠지만 가장 악명 높은 그래픽 버그는 개발자들이 모르는 사이에 고쳐졌습니다.

이전에는 심슨 게임이 하드웨어 렌더러가 성능을 유지하면서 할 수 있는 것보다 더 정확한 텍스처 조정을 요구한다고 생각했습니다.

운이 좋게도, 우리는 틀렸고 게임은 최신 개발 빌드에서 플레이할 수 있습니다.

그리고 8년된 문제 보고서를 드디어 치울 수 있겠네요.

 

5.0.-10707 '상태 저장'에 EFB/XFB 사본 저장

여름 GDQ 행사에서 사람들은 돌핀 에뮬레이터로 젤다의 전설: 무쥬라의 마스크(VC) 버그를 보여주었습니다.

시연자는 상태 저장에서 저장을 불러올 때 제대로 렌더링 되기 전에 보라색 프레임이 하나 있는데 주목했죠.

사소한 문제긴 하지만 개발자들의 주목을 끌었죠.

 

모든 건 돌핀의 상태 저장의 EFB나 EFB 사본에는 텍스처 캐쉬가 들어있지 않아서였습니다.

즉, 비주얼 데이터가 빠질 수 있다는 말이죠. 특히 프레임 중간에 세이브를 했다면 더욱이.

보라색 화면에서 물건이 없어지는 것까지 무슨 일이든 일어날 수 있는 겁니다.

 

미(Mii)의 얼굴 같은 건 텍스처 캐쉬에 오랫동안 저장되어 왔는데요.

상태 저장을 로드하면 얼굴이 사라지거나 어느 부분이 빠진다는 말이 됩니다.

텍스처에 EFB 사본 저장을 사용한다면, 에뮬레이트한 램에는 텍스처의 백업 사본이 없을 겁니다.

Stenzek은 EFB와 텍스처 캐쉬를 모두 저장하는 설정을 추가했습니다.

타임어택에서 일시 중지 상태에서 상태 저장에서 저장을 불러올 수 있다는 뜻입니다.

그만큼 저장 파일은 더 커집니다. 마리오 카트는 24~28MB에서 32~34MB가 되죠.

텍스처 캐쉬가 많으면 더 커질 수 있습니다.

일부 게임에서는 큰 문제를 일으키고, 슈퍼 스매시 브라더스와 마리오 테니스는 저장 파일이 너무 커서 이 기능을 껐습니다.

게임이 잘못 작동하거나 이 기능을 쓰기 싫으면 그래픽 설정의 핵 탭에서 끌 수 있습니다.

 

5.0-10758 지원되지 않는 경우 대략적인 logic op 블렌딩

2년 전, 11.1 업데이트로 LogicOps가 D3D11을 지원한다는 사실에 감동했습니다.

블렌딩 단계에서 다양한 바이너리 명령을 수행할 수 있게 해주는 버전입니다.

게임큐브와 위는 기본적으로 지원하며(OpenGL 기반) 대부분의 게임은 사용하지 않지만, 제대로 지원하는 것이 있으니 매우 중요합니다.

OpenGL, Vulkan, 심지어 D3D12도 지원하므로 D3D11만이 남았죠.

안타깝지만 MS는 윈도우 7 SP1은 LoficOps를 뺐습니다. MS의 공식 지원도 끊겼고, 사용자 수도 줄었으니 그럴 수 있죠.

윈도우 7과 D3D11의 특정 조합은 제대로 작동하지도 않을 겁니다.

 

그림자를 잘 살펴보자. 왼쪽은 LogicOps가 없어 그림자가 이상하다

돌핀은 오픈소스니까 누구나 만들 수 있습니다. 그래서 CookiePLMonster는 윈도우 7 이용자를 위해 현 상황을 개선할 방도를 찾아보았죠. 그렇지만 그냥 제대로 작동하지 않을 거라는 결론이 나왔습니다.

문제를 해결할 수 있을지 불확실하기 때문에 제대로 지원되지 않는 경우에서 D3D11로 전환하려는 경우 경고창을 띄우기로 했습니다. 검사 결과 지원이 안 되면 자동으로 비활성하게 만들기도 했죠.

 

LogicOps 지원이 없다면 왼쪼거럼 될 겁니다. 하지만 정말 LogicOps 때문일까요?

Stenzek은 LogicOps 때문이 아닐 거라고 생각했고 조사를 시작했습니다.

그리고 원인을 찾아냈고 고쳤습니다. 왜 그런 것인지는 훨씬 더 복잡한 이야기지만 어쨌든 LogicOps와는 관련이 없습니다. 그런데 안드로이드 이용자는 아직도 이 문제를 겪고 있다더군요.

OpenGL ES는 LogicOps를 지원하지 않지만, Vulkan은 지원합니다. 그래서 될 거라고 생각했는데요.

이유는 모르겠지만 아드레노와 말리가 지원을 안 합니다. 근데 그 두 개를 모바일 기기의 큰 손인 ARM, 퀄컴이 쓴단 말이죠. 사실상 LogicOps를 지원하는 기기가 거의 없는 겁니다.

금방 해결될 일이 아니기에 Stenzek는 LogicOps를 모방했고 윈도우 7와 안드로이드 이용자의 상황은 확실히 나아졌습니다.

그렇지만 윈도우 7을 사용하는 개발자는 거의 없고, 이용자층도 줄어들고 있고, 점점 더 뒤로 밀릴 것이기에 이후로도 윈도우 7에서는 문제가 일어날 가능성이 높습니다.

오래된 OS라는 이유로 지원을 중단할 시간이 다가오고 있다는 뜻이죠. 의도적으로 그러지는 않겠지만, 기능상 보수가 힘들어서 그럴 수 있습니다.

 

F-Zero GX에서도 문제가 있었는데 알아보니까 돌핀이 문제가 아니라 게임이 문제였습니다.

개발자가 게임을 제대로 테스트하지 못한 것으로 밝혀졌죠.

게임 버그를 제대로 알지 못했기 때문에 이는 좀 더 늦어질 겁니다.

 

전체 화면에서는 제대로 그림자가 나오지만 / 와이드 스크린에선 없어진다

 

가장 이상한 위(Wii) 게임의 수정

원래는 수정 사항에 하나 더 쓸 게 있었습니다. 전국 데코토라 축제(全国デコトラ祭り)라는 게임이죠.

데코토라는 화려하게 장식한 트럭을 뜻하는 '데코레이션 트럭'을 줄인 말입니다.

에뮬레이션이 제대로 안 된 게 기뻤던 흔치 않은 경우입니다.

아마 우리가 본 위 게임 중 가장 이상한 게임 중 하나이자 가장 야심찬 그래픽을 보여주는 게임일 겁니다.

 

2007년, 위가 엄청나게 성공한 상태에서 배급사 자레코와 개발사 Suzak은 위의 게임 목록에 큰 구멍이 있는 걸 깨달았습니다. 트럭을 장식하고 일본 도시를 달리는 레이싱 게임이 단 한 개도 없다는 것을 말이죠.

PS1 폭주 테코토라 전설, PS2 진 폭주 테코토라 전설에 이어 위에서 후속작을 내기로 합니다.

 

유명하지 않은 배급사, 보잘 것 없는 개발사가 만들었으니 쓰레기가 분명하다고 생각할지도 모르죠.

하지만 아닙니다. 완전히 틀렸어요.

몇 시간 동안 살펴보니 완벽한 게임은 아닐 수 있지만, 개발사가 게임에 심혈을 기울였다고 말할 수 있습니다.

 

게임은 위를 극한까지 밀어붙입니다. 위에서도 10프레임 중반으로 자주 떨어지는데 돌핀에서는 거의 플레이가 불가능합니다. 도시의 그 어떤 것도 렌더링이 안 되었죠.

Stenzek은 수개월에 걸쳐 Renderdoc이라는 프로그램으로 돌핀을 로드하며 조사했습니다.

Renderdoc은 렌더링 프레임을 기록하고 구성 방법까지 알 수 있는 강력한 도구입니다.

렌더링 방식, 렌더링 방식을 그렇게 하는 이유까지도 알 수 있죠.

무엇이 잘못되어 도시를 렌더링할 수 없는지 알아보려고 했습니다.

 

이 게임은 엄청나게 많은 걸 하고 있습니다.

고화질 폴리곤, 트럭에 그릴 수 있는 커스텀 텍스처, 성능을 올리는 동적 해상도 스케일링!

그리고 최고는 도시를 운전할 때 동적으로 만들어지는 반사입니다.

어떻게 이런 엄청난 반사를 만들 수 있을까요? 순수하고, 인정 사정 없는 힘입니다.

트럭의 양면을 따로 렌더링하여 EFB 사본에 저장합니다.

이 모든 이미지를 구체에 감싸고, 이를 반사하여 사용하는 또다른 EFB 사본을 만듭니다.

플레이하면서 라이브로 구면 지도를 만들어내는 겁니다.

 

당연한 말이지만 위는 구면 지도를 지원하지 않고 이해하지도 못 합니다.

그래서 이 게임은 위의 texgen 유닛을 사용해 구면 지도를 완전히 사용하는 것과 관련있는 모든 텍스처 좌표 변환을 어떻게든 해냅니다. 기능이 정해져 있는 하드웨어에서 말이죠.

정말 놀라운 일이고, 대체 어떻게 이렇게 하는지 완전히 이해하지 못했습니다.

 

먼저 트럭 주변의 6가지 방향을 모두 렌더링해 EFB 사본으로 저장한다. 시연용으로 4x한 이미지
모든 이미지를 구체에 매핑한다
게임이 구면 반사 지도로 사용할 수 있는 EFB 사본으로 렌더링된다. 폴리곤 수가 낮기 때문에 엔진에서 렌더링 된다는 걸 알 수 있다

많은 EFB 사본 이용 효과를 봤지만 대개 렌더링된 결과를 뒤집거나 반사하는 등의 간단한 기술이었습니다.

'웨이브 레이스: 블루 스톰'의 물이 대표적인 예죠.

하지만 이 게임의 기술은 그 어떤 위 게임에서 사용하곤 하는 전형적인 반사를 훨씬 능가하는 것인데다가 무려 메인 게임 플레이 도중에 이걸 하고 있습니다.

실제 위에서도 게임이 버벅대는 게 당연하죠!

 

물론 효율적이거나 현명하지는 않지만 이 모든 광기는 화면 밖의 기하학적 구조를 실시간을 반영할 수 있는 상당히 높은 해상도의 반사를 구현하는 좋은 결과를 가져왔습니다.

다른 어떤 위 게임도 이렇게 하지 않으며, 대부분의 현대 게임도 레이트레이싱 없이는 불가능합니다.

당연하지만 이건 완전히 미친 짓이기 때문에 개발사는 꼼수를 많이 써야했습니다.

다른 모든 프레임에데 대해 반사만 업데이트하고, 해상도도 줄어들고, 다른 차량 없이 렌더링됩니다.

그래도 경의를 표합니다, Suzak. 억지로 우리 가슴 속을 파고 들어왔군요.

 

반사에 대한 감동이 지나간 후, Stenzek은 왜 도시 자체가 렌더링되지 않는지 알아보려고 게임을 파고들었습니다.

그리고 그는 돌핀에서 또 다른 깊은 문제를 발견했습니다.

가시거리(렌더링 거리)가 꽤 길었기 때문에, 개발사는 꼼수를 좀 썼습니다.

배경을 렌더링하기 전에 도시 자체를 심층 프리패스하고, 복사하고, 지우고, 전경을 렌더링했죠.

그리고 복사하고 다시 지우고 모든 것이 EFB 사본으로 다시 렌더링됩니다.

돌핀은 이 변환 동안 수치를 약간 크게했고, 이 작은 실수로 어떤 것도 렌더링되지 못했습니다.

 

 

수정 전 / 후

안타깝지만 이 문제를 해결하는데 정말 오랜 시간이 걸렸습니다.

게임도 아직 상당히 비싸서 수입하는 것도 까다로운 일이었죠.

이 문제는 3년 전에 보고되었지만, 그 때 문제를 알려준 사람이 여전히 기다리고 있기를 바랍니다.

이 게임은 마땅히 플레이할 가치가 있으며, 얼마나 많은 노력을 기울였는지 고려하면 우리가 시도해보지 않을 수 없었습니다.

게임 내부를 파고들면서 기대가 높아졌음에도 불구하고, 게임은 실망시키지 않았습니다. 즐기세요.

 

덧붙여 Vulkan에서 실행되게 하려고 손을 봤는데 덕분에 Open GL과 같은 수준의 깊이 정확도를 얻을 수 있게 됐지만, 아직 Vulkan은 그다지 많은 지원을 받지 못하고 있습니다.

 

 

https://ko.dolphin-emu.org/blog/2019/08/04/dolphin-progress-report-june-and-july-2019/

댓글