2021년 7월 3일 토요일

[카일레라] 네트워크 플레이시 싱크갈림과 끊김현상의 원인결과 분석[장문주의]

일단 자세한 내용은 모르겠고 지금 당장을 외치는 급한 독자들을 위해 급한 해결책부터 이야기해보자면,


1. Emulinker서버 프로그램으로 호스팅하는 서버를 이용한다.

 - 참고로, 필자가 컴파일한 FBNeoPPK에 동봉된 카일레라는 에뮬링커서버만 잡도록 프로그래밍된 클라이언트이다.

2. 만들어진 방에서 호스트가 채팅창에 /p2pon을 입력해보자. 


<Server> This game will NOT receive any server activity during gameplay!

메시지는 서버활동에 지장을 받지 않는다는 내용이며,

이런 형식의 메시지가 출력되어야한다.

만약 잘 모르겠다면, 서버의 명령어를 볼 수 있는 커맨드, /help등을 이용해 
서버에서 해당 기능이 있는지 확인을 하고 있다면 p2pon을 설정하고 게임을 시작하면 된다.

이렇게 되면 방이 서버의 활동에 지장을 받지 않는 상태로 게임이 가능하게 된다.

이 기능은 현재, emulinker서버에서만 작동이 되는것으로 확인이 된 상태이다.


3. 본인에게 맞는 속도를 사용하자. 특히 무선랜은 lan으로 자만하지 말고 얌전히 excellent등으로 테스트해보고 사용하도록 한다.

즉, 유선,무선 따질것없이 무조건 LAN이 좋은게 아니라는 이야기이다.

무선은 무선답게, 본인의 속도에 맞춰서 사용하는 것이 안정적인 넷플의 지름길이다.

4. 호스팅 서버의 유형에 따라 맞는 클라이언트가 필요하다.
ex) 0.86 공식 서버는 0.9의 공식 클라이언트를 사용하는 게 좋다.

5. 아는 사람, 지인의 경우, 직접 서버를 파서 사용하는 방식이 있다.


이하 본문은 필자의 주관적인 시선이 포함된 분석이다.

굉장히 긴 내용이 포함되어 있으므로, 자세한 내용이 궁금하거나 심심할 경우에만 읽어보도록 한다.

현재 카일레라 넷플 환경 연구 도중에 발견된 내용으로, 앞으로 도움이 될 것으로 판단되어 기록으로 남긴다.


일단 여기서는 일시적으로 끊기는 현상을 Sync Delay로 표현하였다.

Sync delay란?

초창기의 카일레라 서버는 기본적인 요소들만으로 운영되는 방식이었는데, 우선 일반적인 서버 및 p2pon을 적용하지 않는 게임 모드일 경우, 다음과 같은 로그가 계속해서 발생하게 되었다.



밑에서 보이는 sync delayed라는 로그가 보일것이다. 카일레라 넷플이 잠깐씩 끊기던 순간마다 해당 로그가 출력이 되고 있었다. 그래서 카일레라 특유의 끊김현상을 sync delayed로 정의한다.


지금까지 분석의 과정에서 추정되는 카일레라의 렉의 현상(timeout - sync delay)의 원인요소는 다음과 같다. 실상, 네트워크가 통하는 루트(route)가 다 원인으로 작용될 수 있다.

1. 전송속도(LAN or Excellent등)

2. ping

3. 서버 및 클라이언트의 유형(전송방식의 코드화의 차이?) 등


결국 이들 요소들을 맞춰서 베스트 컨디션을 찾아내는 것이 관건이다. 이렇게 해석이 가능할 것이다.


1. 에뮬레이터 프로그램

 일단 우리가 사용할 수 있는 프로그램들을 쭉 나열해보도록한다. 기준은 아케이드 게임을 구동하는 에뮬레이터군으로 간다.

1. MameLon A-43

2. EK-Mame Plus!

3. Mame32 Plus Plus Kaillera & HoubaUI Plus Plus Kaillera

4. Mame32more!

5. Winkawaks

6. Nebula

7. Final Burn Alpha 라인(shuffle, NEO 포함), 그리고 필자가 만든 FBNeoPPK


그런데 사실, 에뮬레이터의 소스들을 보면, 특별한 넷코드를 넣은 것이 아니라, kaillera와 연동할 수 있도록, kaillera의 명령어들의 대한 함수들을 프로그래밍한 것이 일반적인 경우이기 때문에, 

에뮬 자체 성능으로 네트워크의 통신력을 제한하는 경우는 거의 없다고 봐도 무방할 것이다. 

애초에, 멀쩡한 네트워크 성능을 '스스로' 저하시켜서 게임을 구동시키는 에뮬레이터가 과연 정상이라 정의할 수 있겠는가.

그렇기 때문에, 이 부분은 네트워크 통신의 문제보다, "싱크갈림(비동기화)"에 좀 더 비중이 크다고 볼 수 있다.

일단 거의 진리나 다름없는 정의를 하나 건드려보자.

"서로 연결하는 양쪽은 종류뿐만 아니라 서로 버전까지 일치하는 에뮬레이터를 사용해야한다."


그럼 여기에 질문을 하나 던져보자. "Reason. Why?"

왜 같은 에뮬레이터를 사용해야 갈리지 않는 것인가?


답은 두가지를 통해 설명이 가능하다.

1. 에뮬레이터 종류마다 사용하는 코드가 다르기때문에, "변수"가 다르게 발생할 수 있기 때문이다. 

2. 카일레라는 상대 에뮬레이터의 "변수"를 포함시키고 동기화를 시키지 않기 때문이다.

   왜냐하면, 키입력과 딜레이를 받아들이는 코드만이 구현되어 있기 때문이다.


간단하게 메탈슬러그3를 통해 설명하자면,  메탈슬러그3 미션2 보스는 다음의 모습이다.


이 보스는 퍼지는 패턴, 그리고 서로 밀집하여 포격하는 패턴등 여러가지 패턴을 가지고 있는 보스이다.

그리고 보스의 패턴을 결정하는데는 무언가 "변수"가 존재한다.

그리고 이 변수를 계산하는 코드가 에뮬레이터마다 다르게 표현되어있다.


아마 문맥을 이해했다면 맨 위의 다음 문장이 성립이 될 것이다.

"변수는 에뮬레이터마다 다른 형태와 다른 코드로 만들어진다."


그리고 이걸 2번째 답과 같이 합치면, 다음과 같은 결론이 나온다.

(2. 카일레라는 상대 에뮬레이터의 "변수"를 포함시키고 동기화를 시키지 않기 때문이다.

   왜냐하면, 키입력과 딜레이를 받아들이는 코드만이 구현되어 있기 때문이다.)


[결론 : 카일레라는 에뮬레이터의 변수발생은 관계없이, 서로간의 키입력만 동기화를 시킨다.]


즉, 카일레라의 입장에서는 서로간의 에뮬레이터에 무슨일이 벌어졌는지는 신경쓰지 않고, 키입력과 프레임 손실만을 계산하여 동기화 작업을 진행했다는 것이다.


지금 당장, 킹오브 파이터즈98의 기전승 시스템만 따져봐도 알 수 있을 것이다.


시간이 흐르면서, 다양한 에뮬레이터가 나오면서 자주 발생했던 싱크갈림은 아마 이러한 점과 많이 관련이 있을 것으로 판단된다.


그리고 그걸 보완해주는 점이 바로

"같은 상태저장파일을 연동하여 같은 환경에서 게임을 시작한다"

같은 상태저장파일을 사용한다는 것 자체가, 버전과 에뮬레이터가 일치해야 가능하다.

그리고 그것의 첫번째 사례가 바로 2009년도에 등장했던 GGPO였다.

포포루는 제대로 이용했던 기억이 없어 어땠는지는 모르겠지만, 관전도 가능했었던 만큼 분명 안정화하는 기술이 있었으리라.

그러한 이유로 필자의 FBNeoPPK는 현재, 네트워크 플레이 시작시 kaillera폴더에 있는 상태저장을 자동으로 불러들이도록 설계한 상태이다.


2. 카일레라 서버 & 클라이언트

두번째로 따져 볼 문제는 카일레라의 서버와 클라이언트이다.

일단 카일레라 서버는 현재 다양한 서버 프로그램이 존재한다. 

1. 공식 카일레라로 사용했던 0.86 server client.

2. 2000년대 후반에 등장했던 Emulinker서버의 계열(2015년도부터 등장했던 EmulinkerX등 포함)

3. 별도의 서버프로그램을 사용하는 서버(KFS등. 정확한 계열은 미확인)


그리고 카일레라를 접속하는 클라이언트. 현재 인터넷에 돌아다니는 게 확인된 클라이언트.

1. 공식 카일레라 접속기 0.9


2. P2P 연결기능이 추가된 OpenKailleraClient 라인업, P2P카일레라가 여기에 포함.


3. 한국인이 자체적으로 제작한 Fury Kaillera R23


4. 2015년도에 처음 제작된 것으로 보이는 Supraclient, 그러나 몇몇 에뮬레이터와는 미작동.


이 모든 조합을 짜맞춰서 실험하기에는 필자의 시간이 너무 촉박했다.

그러나 몇차례의 실험을 거친 결과는 다음과 같은 결론이 나왔다.


1. 서버와 클라이언트의 조합이 생각보다 중요하다. 에뮬레이터가 중요한 것이 아닌,

   클라이언트와 서버의 호환이 우선순위가 되어야 한다.


2. 의외의 복병으로 추정되는 Master Server List기능


우선 성능을 따진 기준은 다음과 같다.

 - 일정 시간 내에 얼마나 sync delay(끊김 현상)이 발생하였는가?

필자의 기준은 무선랜, excellent 환경에서 FBNeoPPK로 같은 게임을 실행하여 나온 결과이다.


위 사진은 필자가 공식 서버 프로그램을 파고, 공개서버화시킨채, 클라이언트를 바꿔서 테스트하고, 서버에 남은 로그를 캡쳐한 것이다.

좌측은 Fury Kaillera R23, 우측은 공식 카일레라 클라이어트 0.9를 통해 연결한 결과이다.

결과적으로 따지면, fury kaillera나 공식 클라이언트가 sync delay현상의 수는 일정했으나,

체감상으로는 공식 클라이언트가 "비교적" 깔끔했다.로 결론이 나왔다.

그러나 sync delay현상이 빈도가 존재한다는 것 자체가 불안정한 네트워크를 보여주기 때문에, 절대로 정답이 될 수 없었다.

따라서, 현재 존재하는 공개서버에서는 sync delay에서 자유로울 수가 없었다.

그러나, 서버 프로그램과 클라이언트는 서로 맞춰서 사용하는 것이 "비교적" 자유롭게 플레이가 가능했다.

즉, 공식 카일레라 서버는(0.86 server) 0.9 공식 클라이언트를 사용하는 것이 최선.

에뮬링커 서버나 다른 계열 서버는 전용 클라이언트나 다른 클라이언트를 사용하는 것이 최선.

fury kaillera든, OP-kaillera든 본인이 직접 테스트해서 괜찮은 클라이언트를 사용하는 것이 최선이라고 볼 수 있을 것이다.


다음 따져볼 요소는 Master Server List. 즉 서버 공개화 옵션이다.

어렵게 생각할 것 없다. 그저 남아있는 공식 사이트에 서버를 연동하여, 서버를 검색할 수 있도록 하는 것인데. 어쩌면 이게 sync delay의 원인이 될 수 있다는 점이 발견되었다.

서버를 파서 로그를 분석하다가, 흥미로운 점이 발견되었다.


좌측은 공식 서버를 파서 Master Server List에 공개한 상태, 우측은 Private로 공개를 하지 않은 상태의 서버로그이다.


좌측에 로그에 네모친 칸을 복사하면 다음과 같다.

07/05/21-11:46:44> Touching Kaillera master server...

07/05/21-11:46:44> Touching done!                    1회

07/05/21-11:47:44> Touching Kaillera master server...

07/05/21-11:47:44> Touching done!                    2회

07/05/21-11:48:44> Touching Kaillera master server...

07/05/21-11:48:44> Touching done!                    3회

============================================

07/05/21-11:48:52> zan2 client timeout #0

07/05/21-11:48:52> zan client timeout #0            1회

07/05/21-11:48:57> zan2 client timeout #0

07/05/21-11:48:57> zan client timeout #0            2회

07/05/21-11:49:01> zan2 client timeout #0

07/05/21-11:49:06> zan2 client timeout #0

07/05/21-11:49:06> zan client timeout #0            3회


무엇을 이야기하고 싶은 지 이해했는가?


[Master Server List에 접근할때마다, sync delay가 시차로 발생하고 있다.]

Master Server List에 접근한다는 것은 카일레라의 서버 검색 리스트에 뜨도록 메인 홈페이지에 접근한다는 것이다.

위에 로그에서는 3회를 접근했는데, 양쪽에 sync delay가 발생하는 것도 3회였다.

만약 정말로 서버가 Master Server List에 연동되는 과정이 sync delay에 영향을 준다는 게 확실하다면, 현재 공개서버에서는 sync delay에서 절대로 자유로울 수 없다는 것이 된다.


그리고 이것은 Master Server List와 연동하는 작업이 없는 P2P와 비공개서버의 쾌적한 플레이도 같이 설명이 된다.

우측의 로그가 바로 비공개서버의 예시가 될 것이다. 물론 장시간 게임까지 완벽하진 않겠지만 공개서버보다 안정적인 플레이가 된다는 것은 어느정도 증명이 되었다고 생각한다.


3. 그렇다면 해결책은 무엇인가?

일단 결과적으로 볼 때, 클라이언트의 노력뿐만 아니라, 서버의 시스템도 협조가 되어야한다는 맥락이 요구된다.

일단 생각되는 베스트는 다음과 같다.

1. 에뮬레이터는 버전까지 서로 일치, 시작할 때 상태저장파일을 연동하면 보다 안정화 가능

2. 서버와 클라이언트는 전용이 있다면 맞춰놓고 사용하기 - 공식은 공식끼리

3. Master Server List를 연동하지 않는 비공개형 서버사용(사설서버등)


1번과 2번은 클라이언트의 노력이지만, 3번은 서버 관리자의 역량이라 어려울 것이다.

개인적으로 생각하는 방식은 다음과 같다.

현재 KFS, Korea Fast Server는 서버 1, 서버 2가 존재한다.

그러나 둘다 공개를 하고 있기 때문에, 사람이 없어도 결국은 sync delay가 나올 수 밖에 없다.

따라서 다음과 같은 방식을 사용한다면 어떨까 생각해본다.

[KFS 서버2를 비공개 서버화, 서버1을 서버2의 주소를 홍보하고 유저들끼리 채팅하는 용도로 사용한다.]

즉, 서버를 2개를 이용하되, 하나를 비공개화시켜놓고, 하나를 공개하여, 비공개 서버에 접속할 수 있는 방법을 제공하는 용도로 사용하는 것이다.


4. 마무리

현재로서는 발견된 내용이 여기까지이다.

물론 필자의 실험이 Lan환경이 아닌 무선랜의 excellent환경에서 했다는 점 때문에 완벽하다고 할 순 없을 것이다.

그러나, 카일레라의 매력은 부담없는 PC스펙에서 얼마든지 가볍게 게임을 할 수 있다는 점을 간과해선 안된다. 따라서 저사양의 PC에서도 무난하게 돌리면서 게임을 하는 것이 의외로 중요한 요소가 된다는 것이다.

아직은 더 많은 유저들의 시도와 피드백이 요구되고 있으니, 아직까지는 참고사항이라는 것을 기억하기 바란다.

댓글 없음:

댓글 쓰기