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

3DS 에뮬레이터 시트라 2018년 4분기~2019년 1분기 변경점

by 사과향잉크 2019. 5. 13.

3DS 에뮬레이터 시트라(Citra)는 2018년 4분기에서 2019년 1분기까지의 변겅점을 설명했습니다.

 

1. 포켓몬스터 X·Y 지원

수년 만에 드디어 포켓몬스터 X·Y를 제대로 지원합니다.

wwylele과 B3N30, liushuyu이 HLE 오디오 코드를 작업했고 다행히 잘 작동했습니다.

처음에는 특허 문제가 있는 디코더를 사용했는데 많은 노력을 하여 마이크로소프트의 미디어 파운데이션 프레임워크를 사용하여 문제를 해결했습니다. 자세한 건 아래 글을 참고하세요.

 

3DS 에뮬레이터 시트라, 포켓몬스터 X & Y 문제 해결

 

2. 뉴 닌텐도 3DS 지원

2019년 8월에 후원자에게 가장 원하는 게 무엇인지 물었고 가장 많이 원한 건 뉴 닌텐도 3DS 지원이었습니다.

B3N30은 깊이 조사했습니다. 뉴 3DS는 3DS에서 메모리와 얼굴 추적 전용 CPU 코어 2개, 게임 실행 코어 1개를 추가했고 뉴 3DS 전용 서비스가 있습니다.

시트라는 에뮬레이션한 하나의 코어로 3DS 코어를 실행하며 실제 3DS도 이렇게 작동하기에 잘 작동합니다.

메모리와 코어 수를 늘려 에뮬레이션하는 것도 간단합니다.

하지만 뉴 3DS게임과 일부 3DS 게임은 다른 코어에서 코드를 실행할 수 있는데 시트라는 그게 안 됩니다.

몇 달 간 이를 역설계하던 B3N30은 지쳤고, 계속 진행하긴 하겠지만 지금은 안 됩니다.

 

3. 분리할 수 있는 화면

jroweboy는 얼마 전에 화면을 여러 창으로 분리하는 작업을 시작했는데 바로 문제에 부딪혔습니다.

에뮬레이터의 핵심 코드를 많이 건드렸고, 바꾸는 건 쉽지 않은 일이었죠.

기술 관점으로는 해결하기 쉽지만, 이 기능을 위한 명확하고 편리한 UI와 UX를 만드는 게 문제였습니다.

사람들이 어떻게 작동하는지 확인할 수 있을 정도로 직관적이고, 모든 사람이 선호하는 예제를 다룰만큼 강력하고, 유지관리 부담이 적어야하는 다중 창 생성 시스템을 만들어야하는데 아주 어려운 일입니다.

 

대부분의 개발자는 복잡한 핵심 에뮬레이터 프로젝트에는 열정이 있지만, 좋은 에뮬레이터는 사용자 친화적이고 쓰기 쉬워야합니다. 에뮬레이터 개발자들은 이런 경험이 거의 없습니다.

이 기능을 넣고 싶지만, 나쁜 디자인으로 넣고 싶지는 않습니다. 디자인 경험이 많은 사람이 있다면 같이 일해서 좋은 디자인을 만들어봅시다.

 

4. 컨트롤러 핫 플러그

컨트롤러 핫 플러그는 8월 후원자 조사에서 원하는 기능 3위를 차지했습니다.

'2. 뉴 닌텐도 3DS 지원'부터는 조사 결과 많이 원하는 기능 순으로 설명하고 있습니다.

B3N30, jroweboy는 핫 플러그를 지원하기 위해 컨트롤러 처리 코드를 바꾸기 시작했습니다.

최소한의 요구는 컨트롤러를 뽑고 다시 꽂아도 시트라에서 계속 사용할 수 있는 것입니다.

깊이 파보니까 일부를 다시 만들어야되겠더군요.

그래서 컨트롤러 백엔드를 완전히 다시 만들어서 컨트롤러 핫 플러그도 지원하고 다른 문제도 해결했습니다.

 

5. 치트

시트라는 오랜 기간 치트 코드가 작동하지 않았기에 8월 설문 조사 항목에 넣는 걸 주저했습니다.

그러면서도 사람들이 원한다면 결국에는 이 길고 긴 문제를 해결할 수 있으리라는 생각도 했습니다.

B3N30, jroweboy가 컨트롤러 코드 작업으로 바쁜 동안에 wwylele는 핵심 에뮬레이터 코드를 정리하고 있었습니다.

그 과정에서 시트라가 메모리를 다루는 방식이 실제 하드웨어가 하는 방식과 똑같지 않다는 것을 발견했죠.

결국 wwylele는 일상적인 정리를 하다가 시트라의 거의 모든 메모리 작동 방식을 갈아엎어버렸습니다.

 

사람들은 무엇이 망가졌고, 무엇이 고쳐졌는지 확인하기 위해 시험해봤습니다.

makotech222의 오래된 치트 코드 지원이 되는지 해봤는데, 놀랍게도 되더군요.

치트 코드가 작동한다는 소문이 퍼지자 컨트롤러 작업을 마친 B3N30은 치트 코드 지원에 힘썼습니다.

그는 오래된 작업물에 기반을 두었지만 많은 부분을 다시 만들고 디자인 문제도 고쳐 크게 개선했습니다.

그리고 zhaowenlan1779이 치트 UI를 구현하여 최신 나이틀리, 카나리아 빌드에서 치트 코드를 완전하게 이용할 수 있게 되었습니다.

 

치트 화면

6. 커스텀 텍스처 지원

지금까지 본 것처럼 위에 많은 것들을 하느라 바빴습니다.

이 기능을 바라긴 하지만 현재 개발하고 있지 않으며 언제 누가 할지 정한 것도 없습니다.

하지만 개방적인 프로젝트인만큼 언제라도 바뀔 수 있습니다.

현재 개발자들이 이걸 작업할 수도 있고, 새로운 개발자가 나타나 기여할 수도 있지요.

 

7. 아미보 지원

FearlessTobi는 자매 프로젝트인 유즈(yuzu)와 공유되는 코드를 시트라에 열심히 작업하고 있습니다.

최근 유즈 개발자 ogniK가 유즈에 아미보(amiibo) 지원을 추가했고, FearlessTobi는 그냥 복사-붙여넣기를 하면 얼마나 잘 작동할지 궁금해졌습니다.

그래서 해보니까 괜찮긴 한데 제대로 잘 작동하지는 않았습니다.

그래서 좀 더 조사하고 ogniK의 도움도 받아서 10월에 시트라에 아미보 지원을 추가했습니다.

가상의 아미보 파일을 사용해서 스캔을 에뮬레이션합니다.

실제 아미보에서 가상 아미보 파일을 얻으려면 안드로이드의 Tagmo 앱이나 3DS 홈브류 앱을 사용하세요.

 

참고: 아미보 구현은 완전하지 않아서 약간 더 작업해야합니다.

 

8. 마이크 지원

jroweboy는 11월에 이 일을 다시 시작했지만 끝내기 직전에 문제에 부딪혔습니다.

게임이 마이크 입력을 받아들이지 못하게 하는 버그가 있었죠. 몇 번이나 검토하여 디버깅했는데도 무슨 문제인지 알 수 없었습니다.

지난 1주일간, FearlessTobi는 이에 관심을 가지고 코드를 좀 정리해보기로 했습니다.

정리를 하면서 자신의 코드를 시험해봤는데 어떻게든 작동하기 시작했습니다.

코드를 비교하면서 jroweboy는 바보같게도 mic_data 크기에서 비트(Bit)와 바이트(Byte)를 섞었다는 걸 알았습니다.

이후 jroweboy는 모든 걸 바로 잡을 기회를 잡았고, 게임 도중 마이크 전환 기능을 추가하고 안드로이드 지원 등 미래를 위한 작업도 했습니다.

현재 나이틀리, 카나리아 빌드 모두 마이크를 지원합니다.

 

9. UI 배경 이미지

이 기능을 바라는 사람이 많지 않은 건 당연합니다. 100명이 넘는 사람 중 오직 2명만이 이 기능을 바랐는데요.

시트라를 사용하는 스트리머나 유튜버만을 위한 기능이기 때문입니다.

시간이 좀 걸리겠지만 수요가 많다면 추가할 수 있습니다. 하지만 현재는 우선순위에서 밀려나 있습니다.

정확한 예뮬레이션, 그리고 정확한 에뮬레이션을 빠르게 하는 것이 항상 최우선입니다.

 

10. 멀티플레이어 버전 4

Flame Sage, zhaowenlan1779 덕분에 새로운 멀티플레이어 업데이트가 이뤄졌고 기능이 많이 좋아졌습니다.

· 시트라 웹 서비스 계정을 인증했다면 사용자 이름과 아바타가 공개 방에 표시됩니다. 마우스 오른쪽 버튼을 누르면 시트라 커뮤니티 프로필도 볼 수 있습니다.

· 방 개설자는 간단한 작업을 할 수 있습니다. 사용자를 내쫓거나 출입금지시키고, 금지를 취소할 수 있습니다. 출입금지는 시트라 계정(인증한 경우)과 IP 모두 금지합니다. 원한다면 조정자를 따로 선택할 수도 있습니다.

· 원한다면 방에 설명을 추가할 수 있습니다. UI와 커맨드 라인 둘 다 사용할 수 있습니다.

· 간혹 여러 명의 시트라 사용자는 동일한 가상 콘솔 ID를 가지게 될 겁니다. 실제 콘솔에서는 당연히 이런 일이 있으면 안 되고, 게임에서 사용자를 혼동할 수 있습니다. 이제 콘솔 ID 충돌 검사를 수행하여 방에 같은 콘솔 ID를 가지고 있는 사람이 있다면 그 방에 참여할 수 없습니다.

· 방이 꽉 찼다면 이제 '연결할 수 없습니다' 대신 적절한 메시지를 보여줍니다.

· 채팅창에서 방 입장, 떠남 등의 정보 메시지를 볼 수 있습니다. 금지, 내쫓기 등 조정 행동은 방 구성원 모두가 볼 수 있습니다.

· 이제 @사용자이름, @닉네임으로 다른 사용자를 지정할 수 있습니다. 지정당한 사람은 데스크탑에서 알림을 받고 메시지가 강조해서 보여질 겁니다.

멀티플레이어 기능

11. 설정 창을 탭으로 구분

시트라에 정기적으로 많은 기능이 추가되면서 낡은 설정 창은 빽뺵하게 채워지고 있었습니다.

초기부터 보다 나은 UI에 대한 비전은 있었지만, 실제 행동은 없었습니다.

jroweboy의 요청에 따라 다른 에뮬레이터인 돌핀의 유명 개발자인 spycrab이 인터페이스 구현을 맡았습니다.

앞으로도 가능한 최고의 사용자 환경을 위해 인터페이스 디자인를 개선할 겁니다.

 

새로운 설정

12. 오픈 소스 시스템 아카이브(#4256, #4678)

오픈 소스 시스템 아카이브를 위한 지속적인 노력의 일환으로 wwylele는 국가 목록 아카이브와 미 데이터 아카이브를 위한 오픈 소스 교체를 구현했습니다.

국가 목록 아카이브는 닌텐도 이숍이 서비스를 제공하는 모든 국가의 목록입니다.

오픈 소스 미 데이터 아카이브는 빈 모델과 텍스처입니다. 미 데이터가 없어도 게임이 중단되지 않고 데이터가 누락되었다는 표시를 보여줍니다.

이로서 중국/한국/대만 지역의 글꼴을 제외한 모든 필요 시스템 아카이브의 오픈 소스 구현이 가능해졌습니다.

 

오픈 소스 미 데이터

지금까지 시트라 충돌의 가장 흔한 원인은 시스템 파일이 없는 것이었습니다.

시스템 파일은 게임이 아닌 3DS OS의 일부로 3DS에서 PC로 게임을 복사할 때 실제로 게임을 실행하는데 필요한 모든 것을 갖추지 못하는 경우가 있다는 뜻입니다.

가장 유명하고 흔한 건 게임을 로드하고 텍스트를 렌더링하는데 쓰이는 글꼴입니다. B3N30이 커스텀 글꼴을 추가한 뒤에는 충돌 보고서가 급격히 줄어들었죠.

시트라는 처음부터 항상 3DS 생태계 전체를 재현하는 일을 해왔기 때문에 이 일로 거의 모든 게임이 추가 파일을 덤프할 필요 없이 작동하는 특별한 계기가 되었습니다.

 

위대한 이정표이긴 하지만 우리는 예술가가 아니라 프로그래머입니다!

wwylele는 커뮤니티가 미의 텍스처와 모델을 만들고 불러올 수 있는 도구를 만들었습니다.

그래서 이제 누구나 기여할 수 있습니다.

3D 모델링에 능숙하고, 자신의 작품이 시트라 미의 기본 얼굴이 되길 바라는 사람이 있다면 연락해주세요!

 

13. 암호화한 롬 지원(#4181, #4335, #4348)

오랫동안 시트라는 해독한 롬 덤프만 지원했습니다.

보통 롬 덤프 과정은 3DS 시스템에서 암호키를 사용해 해독한 롬을 만듭니다.

시트라에서 암호화한 롬을 지원한다는 것은 3DS에서 키를 추출하여 시트라로 암호하한 롬을 바로 읽어서 해독한다는 뜻입니다.

여기에는 큰 문제가 있었는데 키를 어떻게 얻을 수 있는지 알아내기 위한 조사를 많이 하지 않았기 때문입니다.

 wwylele, B3N30는 조사를 시작했고 천천히 진행했습니다.

그리하여 사람들은 이 방법을 따라 암호화 키를 얻을 수 있고, 이 키로 암호화한 롬을 읽거나 암호화한 CIA를 직접 설치할 수 있습니다.

 

참고: 암호화한 롬을 지원하긴 하지만 일반적으로는 해독한 롬을 사용하는 걸 권장합니다.

 

14. 게임 코인 추가

오랫동안 사람들은 시트라에 더 많은 게임 코인을 추가하는 기능을 요청했습니다.

게임 코인은 움직임을 추적해 3DS가 주머니 속에 있는 동안의 걸음 수를 세어 걸은 만큼 보상해주는 기능입니다.

100번 걸을 때마다 주었고, 하루에 최대 10개, 총 300개까지 제공합니다. 게임 코인은 다양한 게임에서 쓸 수 있죠.

시트라는 움직임을 추적할 수 없기 때문에 시트라의 UI에 게임 코인을 추가하는 기능을 넣었습니다.

이전에도 시도했지만 코드가 썩 좋지 못했었죠.

zhaowenlan1779는 게임 코인을 담당하는 ptm 서비스를 조사했고, 오랫동안 사람들이 요청한 기능을 구현했습니다.

기본으로 42개가 있고 한계인 300개까지 추가할 수 있습니다.

 

게임 코인 설정

15. 터치 스크린 지원

시트라는 3DS 터치스크린을 모방했지만 실제 터치스크린에서는 작동하지 않았습니다.

실제 터치스크린의 입력은 분석하지 못했죠.

문서로 남긴 사람은 MerryMage였고, 고칠 사람을 기다리고 있었습니다. 같은 문제를 겪은 NeatNit이 고치려고 했죠.

그는 Qt와 SDL 프론트엔드를 조사했고 다른 개발자의 도움을 받아 시트라의 프론트엔드에는 실제 터치스크린이 하나도 구현되지 않았다는 것을 알아냈습니다.

그래서 양쪽에서 터치 이벤트를 구현했고 드디어 물리 터리 스크린의 입력을 분석할 수 있었습니다.

 

16. 새로운 TAS 설정

에뮬레이터 등으로 게임을 빠르게 진행하는 TAS(Tool-assisted Speedrunning) 기능을 개선하기 위해 zhaowenlan1779는 프레임 어드밴스 기능을 구현했습니다.

프레임 어드밴스는 흔히 쓰이는 TAS 기능으로 게임 프레임을 프레임별로 실행하는 걸 의미합니다.

TAS를 하는 사람들은 이 기능으로 특정 프레임에 정확하게 버튼을 누릅니다.

그는 CTM(Citra TAS Movie) 헤더에 init time 필드를 추가해 CTM 파일을 재생할 때 RNG 일관성을 보장하게 했습니다.

새로운 TAS 설정

17. citra-qt: 스크린샷 기능

보통 사람들은 사진, 영상 등으록 게임 경험을 공유하길 좋아합니다.

서드파티 도구를 쓴다면 사용할 때 이상한 버그를 일으킬 수 있어 사람들을 혼란스럽게 하거나 좌절시킬 수 있습니다.

어떻게 하면 될까요? 시트라에 기본 스크린샷 기능을 추가하면 됩니다.

간단해보이지만 실제로는 우리가 바라는 것에 맞게 만드는 건 상당히 어려운 일이었습니다.

 zhaowenlan1779는 다른 사람의 도움으로 이 기능을 만들어 서드파티 도구 없이 스크린샷을 촬영할 수 있게 되었습니다.

시트라는 이 기능으로 사용자가 설정하 해상도(10x까지)의 스크린샷을 저장할 수 있고, 동일한 스크린 레이아웃을 사용합니다.

스크린샷 기능

18. citra-qt: 단축키 설정

시트라는 많은 단축키가 있지만 과거에 하드코딩으로 한 것이라 사용자가 손댈 수는 없었습니다.

adityaruplaha는 이 문제를 해결하기 위해 Kloen이 한 같은 작업을 기반으로 사용자가 단축키를 정할 수 있게 하려고 했습니다.

그는 몇 개월간 여러 번 시도하며 다른 개발자의 도움도 받아 결국 완성했습니다.

이제 단축키는 새로운 탭으로 분리되어 키보드 버튼으로 변경할 수 있습니다. 컨트롤러는 아직 안 됩니다!

단축키 설정

19. DSP: 오디오 데이터 버퍼에 물리적 포인터 주소 마스크 추가

DSP LLE 작업이 느리게 진행되고 오디오 관련 개선 작업을 적극적으로 하는 사람이 없는 동안 RoadrunnerWMC는 우연히 DSP HLE 구현이 루이지 맨션 다크 문의 오디오를 망가뜨리는 문제를 발견했습니다.

그는 이전에 돌핀에서 발견한 것과 비슷하게 주소 마스크가 잘못되어 일어난 것 같다고 생각했습니다.

그는 그 게임에서 성공적으로 문제를 해결했지만, 하드웨어 테스트가 아니었기에 그것이 올바른 방법인지 확인할 수 없었습니다.

그가 한 첫 해결책은 가장 낮은 물리적 오디오 버퍼 주소를 마스킹하는 것이었습니다.

하지만 다른 콘솔에서 여러 번의 하드웨어 테스트를 해본 결과 가장 낮은 2비트를 마스킹하는 게 옳다는 것을 발견했습니다.

이 일로 루이지 맨션 다크 문, 어메이징 스파이더맨, 메트로이드 프라임 페더레이션 포스 등의 게임에서 문제가 해결되었습니다.

 

20. 스크립트 지원

얼마 전에 EverOddish는 libZMQ를 사용해 시트라에서 스크립트 지원을 구현했습니다.

많은 환영을 받았고 커뮤니티도 호평이었지만 안타깝게도 libZMQ는 빌드 문제가 많았습니다.

빌드 스크립트는 거대했고 여러 부분에서 시트라와 호환되지 않았죠.

불필요하게 스크립트에만 너무 의존한 것 같았습니다.

EverOddish는 다른 일로 바빠서 다시 만드는 일을 할 수 없었습니다.

시간이 좀 지나고 wwylele는 boost asiso 라이브러리를 이용해 UDP로 스크립트를 다시 해 libZMQ 종속성을 제거했습니다.

현재 스크립트 능력은 메모리 읽기/쓰기 뿐인지만 가까운 미래에 확장할 계획입니다.

 

21. 공식 안드로이드 앱

SachinVin가 공식적으로 시트라를 안드로이드로 이식했을 때, BreadFish64와 jroweboy는 비밀리에 이식을 준비 중이었습니다. 몇 개월 전의 시트라 코드를 기반으로 만들어 최신 기능, 성능 개선, 수정 사항이 없죠.

이 비공식 이식작은 안드로이드 돌핀 앱의 UI를 많이 빌렸고, 시트라의 요구 사항을 완전히 충족하지 못했습니다.

그렇지만 BreadFish64는 jroweboy, liushuyu와 함께 시트라를 공식적으로 이식하기 위해 계속 노력하고 있습니다.

UI도 돌핀의 코드를 쓰지 않고 완전히 새로운 걸 쓰죠.

공개적으로 쓸 수 있는 상황은 아니지만, 천천히 확실하게 진행 중입니다.

여기서 살짝 살펴볼 수 있습니다.

 

개발 중인 공식 안드로이드 앱

22. Flatpak 지원

Flame Sage, bscubed의 협업으로 나이틀리와 카나리아 빌드가 Flatpack를 지원합니다.

Flatpak은 리눅스에서 샌드박스 데스크탑 응용 프로그램을 제작, 배포, 실행하기 위한 시스템입니다.

즉, 이제 시트라를 별 문제 없이 거의 모든 리눅스 배포판에 설치하고 실행할 수 있습니다.

 

https://citra-emu.org/entry/citra-progress-report-2019-q1

댓글