2025년 8월 31일 일요일

[분석일지] 250831 - MAME와 Kaillera 넷플레이의 구현, 카일레라 네트워크 플레이가 불가능해진 이유.

1. mame의 대규모 개편, 타임 슬라이스 기법(0.136 이후)


간단하게 요약해보면, 기존의 mame는 1프레임 생성을 하는 과정에서 “화면 프레임당 1회” 루프로 60프레임 고정 / 30프레임 고정에 따라, 1프레임을 1회 전송을 고수하다가,


타임 슬라이스라는 기법을 통해, 1 프레임을 만들기 위한 프로세스를 부분갱신이 가능하도록 코드를 크게 개편하였다. -> 왜? 정확도를 위해서


즉, 1개의 비디오 프레임을 생성하는 동안, 내부적으로 수많은 에뮬레이션 함수가 "추가로" 작동되는 구조로 변하였음 -> 프레임 1장을 보내는 과정에서 수많은 에뮬레이션 정보가

갑자기 쏟아지는 구조로 변경 -> 네트워크에 1프레임을 전송할 수 있는 환경이 깨져버림


2. 즉, mame plus plus 0.141 이후, 네트워크 플레이 체제가 깨질 수 밖에 없던 이유는 기존의 카일레라와 mame가 유지하던 "1 프레임 1 패킷"을

mame가 일방적으로 깨버리고, 1프레임 이외에 프레임 내부에서 변화까지 전송해버리면서, kaillera의 1프레임 1패킷 전송 규칙이 깨져버리면서, access violation이 발생해버렸던 것이다.


gpt가 말하길,

"스케줄러/비디오/오디오가 더 세밀한 타임슬라이스로 움직이고, partial update·UI·다중 스크린 등으로 “한 화면 프레임 동안 여러 경계”가 생김. 이때 훅을 잘못 걸면 프레임보다 잦게 호출됩니다 → pps 급증, 큐 오버런."


그렇다면 어떻게 해야할까?


간단하지만 쉽지 않은 루트다.


기존의 타임-슬라이스 기술로 발생되는 1 프레임 이외의 데이터(partial update)를 없애고 기존의 1프레임 1패킷 체제로 돌아가느냐, 아니면 1패킷으로 "포장"을 하여 모든

데이터를 포장하여 1패킷에 보낼 수 있도록 하는가?


차이점의 본질: 0.132 포크 시대의 “프레임에 딱 붙은 단순 전송/결정성 가정”이 이후 본가의 정확도·추상화·슬라이스 세분화로 무너졌고, 그 상태에서 과거식 카일레라 훅을 재활용하면 프레임보다 잦은 호출→전송 폭증→비결정성/버퍼 사고로 이어졌습니다.


대응 방향: 훅 위치를 프레임 경계 1곳으로 고정하고, 속도 독립 rate-limit + 코얼레싱 + 버퍼/스레드 하드닝을 적용하면 “0.132식” 안정성을 상당 부분 회복할 수 있습니다.


원하시면, 현재 적용된 훅 함수/파일 경로를 알려 주세요. 0.164 기준으로 정확히 어느 라인에 무엇을 옮기면 되는지 패치 형태로 바로 써 드릴게요.

댓글 없음:

댓글 쓰기