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 기준으로 정확히 어느 라인에 무엇을 옮기면 되는지 패치 형태로 바로 써 드릴게요.
댓글 없음:
댓글 쓰기