자료실

멀티플레이어 연결 개발 기술 - 디버깅 편
작성자 | admin 2022-01-10  |    조회수 : 998  




#디버깅 #디버그 #네트워크 시뮬레이션 #원인분석순서


접속 프로그램을 개발하다 보면 네트워크 문제, 서버 혹은 클라이언트 문제, 하드웨어나 소프트웨어 문제와 맞닥뜨리곤 합니다. 게임 속 로직 문제도 있죠?
우리는 어떤 방식으로 오류가 어디서 발생한 것인지 판단할 수 있을까요?
우리는 어떤 방식으로 작성한 코드가 문제인지 아니면 연결 개념의 문제인지, 또 아니면 Photon 네트워크 프로그램의 문제인지 명확히 알 수 있을까요?
신호가 끊기는 경우, 어떤 조치를 취해 이를 감지할 수 있을까요?


그냥 막 찍으면 안 되겠죠?!


물론 전원을 껐다 켜면 문제가 사라지는 경우도 종종 발생하지만요... 이런 상황만 발생한다면 정말 마음이 편했겠죠. 하하...

그래서 저희는 디버깅 및 오류 감지 방법을 제안하여 다인 연결 개발 중 오류가 발생했을 경우 더 빠르고 명확하게 해결 방법을 찾을 수 있고 시간을 더 중요한 게임 로직 개발 작업에 사용할 수 있도록 돕고자 합니다!


이번 글의 내용:


  • ● Photon Cloud 관련 문제
  • ● PUN 개발 관련 문제
  • ● Debug Console Logging / Logger
  • ● Network Simulation / States
  • ● 신호가 끊길 때 원인 분석 순서
  • ● 질문에 더 빠른 답변을 받는 법


Photon Cloud 관련 문제



Photon Cloud 서비스의 최근 상황이 어떤가요? 서비스가 끊기나요? 최근 불안정한 적이 있나요? 모두 아래 링크에서 확인하실 수 있습니다:


https://www.photonengine.com/ko-KR/status

 

Photon Cloud에 대해 주의사항이 있습니다:
유저는 반드시 같은 Region에서 접속해야만 서로를 있어요.


대만은 JP / KR / ASIA 3 Region 중간에 위치해 있습니다.


그래서 PUN(혹은 Photon Client SDK) 사용 시 자동 Best Region을 사용하여 Photon Cloud에 연결하면 네트워크 사업자의 회선 변경으로 인해 종종 다른 Cloud Region에 연결되곤 했습니다. 그래서 테스트 도중 기기 한 대는 Japan에 연결되고 다른 한 대는 Asia(싱가포르)에 연결되어 서로 보이지 않아 PUN/Photon의 문제인 줄 알았죠...


그러니 테스트 시 현재 사용하는 Cloud Region이 같은지 확인하셔야 합니다!!

(좌)Fixed Region / Best Region , (우)Dev Region


 

Photon Server Settings에서 위에서 아래로 살펴보면 Region에 관련된 부분을 볼 수 있습니다.
설정할 수 있는 위치는 다음과 같습니다.


  • Fixed Region
  • Dev Region
  • Best RegionPreference: xxx 선택사항:
    Reset / Edit WhiteList

Photon Cloud의 경우 관련 Photon Client SDK 채용 순서는 다음과 같습니다.


  • Release Build :
  1. 1. Fixed Region에 데이터가 채워져 있으면 고정 영역의 설정값이 먼저 사용됩니다.
  2. 2. 다음으로 Best Region(가장 좋은 클라우드 연결을 자동 선택)을 사용합니다.
  3. 3. Best Region은 또한 Photon Dashboard에서 "화이트리스트"를 설정할 수 있습니다. Client가 특정 지역의 서버에만 연결할 수 있음을 의미하므로 게임을 지역으로 분할하기가 편리해집니다.
  • Dev Build :
  1. 1. Unity로 Development Build 사용 시,
    Dev Region의 설정으로 연결을 실행한 후
  2. 2. 다음으로 Best Region을 사용합니다.

Dev Region은 Development Build와 협력해야 효과적입니다.

 

Dev Region의 설정은 우리가 개발과 테스트를 빠르고 편리하게 도와줍니다. 특히 특정 영역을 테스트할 때 매우 편리합니다. 예를 들어Kr과 같이 테스트하려는 영역을 입력하면 됩니다. 그리고  Editor → Play를 누르면  Kr 의 Photon Cloud에 바로 연결되며 다른 영역으로 이동하지 않습니다.

따라서 이 세 가지 설정 방법인 Fixed Region / Dev Region / Best Region은 결합하면 개발이 편리하거나 버전에 따라 다른 설정값에 대응할 수 있고 다양한 지역에 설치하고 배포하는 등 다양한 응용 시나리오를 보유할 수 있습니다.


 

PUN 개발 관련 문제


  • 최대 수용 가능한 유저의 수는??
  • Photon Room 500 Messages/sec CCU 데이터 제한은?

Photon Room 한 개는 유저 최대 몇 명의 접속을 지원하나요?
Photon으로 만든 대부분의 멀티플레이 게임은 2~16인 플레이가 가능하지만 이론상 각 Room의 유저(엔드)의 상한선은 더 높을 수 있어 출시된 작품 일부는 32명을 수용할 수 있고 심지어는 64명을 수용하는 경우도 있습니다


Virtual Meeting 모드에서는 최대 명의 유저가 화면에 표시될 있습니다.


하지만 주의사항이 있습니다.
초당 메시지를 너무 많이 보내면(Room 1개당 초당 메시지 볼륨 msg/s) 유저단에서 처리할 수 없는 성능 관련 문제가 발생할 수 있습니다. 구체적인 상황은 PhotonCloud의 제한이 아니라 Client App의 데이터 처리 능력에 따라 결정됩니다.


예를 들어 모바일 유저는 네트워크가 아무리 빨라도(5G 연결 등)
mobile CPU/GPC가 화면의 특수 효과, 3D 처리 및 기타 나머지 성능에만 사용되며 수백 개의 동적 개체 등의 이벤트 또는 충돌 처리에 많은 시간을 사용할 수 없습니다.


그래서 턴제 게임에서 인원이 많더라도 완전히 실현 가능한 것입니다.
그러나 빠르게 진행되는 액션 게임에서는 8명 이상의 유저가 접속한다면 관리 방법이 필요할 수 있습니다.
Interest Management (비교적 중요하거나 흥미로운 것들만 업데이트)


Interest Management 혹은 절단 /그룹화 방식으로 수행
이 기술은 초기 MMO RPG에서 흔한 디자인 방법이었습니다.


하지만 단점은 존재했습니다. 바로 각 플레이어가 실제로 다른 모든 플레이어의 모든 메시지를 수신할 수 없다는 점이었습니다.
때때로 약간의 한계 효과가 존재했고 제대로 처리하지 않으면 게임에 대한 일부 판단에 오류가 발생하여 플레이가 불균형해지고 플레이어의 관심이 감소할 수 있었습니다.


플레이어 는 게임 Room내부의  “데이터 흐름”을 증가시키는 주요 요소입니다.
이것이 우리가 각 방에서 초당 전송되는 메시지를 500개 이하로 유지하는 것을 권장하는 이유입니다.
(Messages 500개는 500package나 500 Bytes가 아니니까요.)


Photon은 이러한 제한을 강제하지 않을 것이며, 합리적인 사용 정책 조항을 활용할 것입니다.
온라인 게임은 대역폭 사용량에 주의를 기울이는 것이 매우 중요합니다. 게임이 계획 범위 내에서 작동하는지 확인하는 데 유용합니다. Photon의 기획에서 각 CCU의 트래픽은 월 3GB까지 사용할 수 있는데 사실 일반 게임에서는 매우 충분한 양이죠 !!


Debug Console Logging / Logger,


여기 몇 개의 Logger / Logging은 모두 디버깅 헬퍼들입니다!!


  • ● Network Logging
  • ● PUN Logging
  • ● Support Logger

Network Logging
Photon Library에서 제공하는 네트워크 연결 과정과 현재 상태를 표시할 수 있습니다 하위 계층(전송 계층 Transport Lasyer)에 대한 일부 정보를 포함합니다.
일반적으로 Error의 계층을 선택하면 되며, 문제가 있을 시 Info를 선택하면 매우 많은 개발 참고용 정보를 나열해줍니다.


PUN Logging
PUN이 제공한 네트워크 연결 데이터와 현재 상태를 표시할 수 있습니다.. 일반적으로 Error Only의 계층을 선택하면 되며, 문제가 있을 시 Full을 다시 선택하면 PUN의 연결 상태에 개발 참고 정보를 나열해 줍니다.


Support Logger
Photon 관련 문제의 추적을 쉽게 만들려면 가장 일반적으로 사용되는 디버깅 정보를 기록하는 데 사용합니다.
예를 들어 일부 AppId, 버전, Region, Server IP 및 일부 callback은 Network / PUN Logging 표시와 함께 표시됩니다.


 

Network Simulation / States


경로:
Photon PhotonUnityNetworking UtilityScripts Debugging
아주 유용한 GUI 툴 3개를 찾아볼 수 있습니다.


  • Photon Lag Simulation GUI
    현재 연결 상태를 표준값으로 네트워크가 불안정할 때 게임 로직의 허용 여부나 게임에 어떤 상황이 나타나는지 시뮬레이션합니다. 게임이 완성되기 전이나 후에 최적화(오류 감소, 오류 검사) 처리를 수행합니다.
  • Photon Stats GUI
    네트워크 패킷 전송의 Bytes/Count 등 통계값은 전송 상황이 예상 전송 상황과 다르진 않은지, 이상 여부를 확인하고 대략적인 네트워크 트래픽(비용) 등의 추정을 편리하게 만들어 줍니다.
  • States GUI
    Inspector에서 enable/disable 하도록 설정할 수 있는 많은 세부 옵션을 제공합니다. 게임 화면에 일부 네트워크 관련 정보나 빠른 조작이 가능한 기능을 표시하기에 좋습니다.

아주 편리하게 원하는 대로 화면에 배치한 GameObject를 바로 사용하거나 나중에 사용할 수 있도록 prefab으로 만들 수 있습니다.

 


신호가 끊길 원인 분석 순서

  1. 1. Client Logs / Server Logs 검사
  2. 2. Support Logger 사용
  3. 3. 다른 프로젝트를 시도하거나 Photon에서 제공한 Demo / Sample을 시도하세요.
  4. 4. 다른 Server 혹은 Region 시도
  5. 5. 다른 인터넷 연결/통신 제공업체를 사용해보세요.
  6. 6. 다른 Ports (5055 → 27001 )시도
  7. 7. CRC 검증 사용
    LoadBalancingPeer.CrcEnabled = true;
    var packetLossByCRC = LoadBalancingPeer.PacketLossByCrc;
  8. 8. Client Logs / Server Logs 검사
    가장 먼저 테스트해야 할 항목입니다.
    모든 클라이언트에는 일반적으로 내부 상태의 변화와 문제의 Log 정보를 제공하는 callback function이 존재합니다. 따라서 우리는 이 정보를 기록하고 문제가 발생할 때 더 많이 테스트해야 합니다.
    유용한 정보가 없으면 일반적으로 Log의 표시 기록이 일부 증가하는데, 예를 들면 warning 일부나 Info 수준의 정보가 표시됩니다. 통상적으로 API 파일에 이것들을 실행하는 법과 대응하는 코드가 설명되어 있습니다. 직접 설정한 서버라면 Server의 Log 정보도 함께 검사해야 합니다.
  9. 9. Support Logger 사용
    자세한 정보 기록을 열어보면 네트워크 전송 과정까지 알 수 있답니다~
  10. 10. 다른 프로젝트를 시도하거나 Photon에서 제공한 Demo / Sample 시도하세요.
    Photon의 Client SDK(예: PUN)는 모두 Demo / Sample을 포함하고 있습니다.
    Unity Build를 사용하여 일부 실행 파일을 생성하고 테스트하려는 플랫폼 및 운영 체제에 배치하여 Photon의 기본 동작 모드를 쉽게 이해할 수 있습니다.
    Demo / Sample도 동작하지 않거나 실패한다면 Photon SDK의 문제가 아니라 네트워크 연결의 문제일 가능성이 높습니다.
  11. 11. 다른 Server 혹은 Region 시도
    Photon Cloud를 사용할 때, Jp, Kr, Asia 및 기타 아시아 지역 같은 다른 지역으로 쉽게 전환하거나 Eu/Us로 직접 전환하여 다른 주요 Region에서 일치하지 않는 행위가 있는지 확인할 수 있습니다.
    자신이 설계한 서버라면? 가장 좋은 선택은 물리적 기기를 사용하는 것이며, 그다음이 Virtual Machine(VM)입니다.
    최소 네트워크 지연 또는 Latency(RTT 왕복 시간)를 테스트하고 싶다면 기기 한 대에서 Server를 실행하고 다른 기기에서 Client를 실행하세요. 그리고 이 기기 두 대는 같은 Region 네트워크에 있으면 안 됩니다.

이러한 방식으로 거리가 가장 가까운 게임 Lag 행위를 측정할 수 있기 때문에 후속 개발의 평가 기준으로 사용할 수 있습니다.
가장 작은 Lag과 게임 행위도 받아들일 수 없다면, 게임 로직을 다시 설계할지 고민해봐야 합니다. Lag이 너무 크다고 불평하는 유저가 있다면 해당 유저 Region에 신규 서버 설정을 고려해 볼 수 있습니다.

  1. 다른 인터넷 연결/통신 제공업체를 사용해보세요.
    어떤 상황에서 특정한 하드웨어로 인해 네트워크 연결이 실패할 수 있습니다. 이럴 경우 다른 WiFi, Route 라우터 등을 사용해보세요. 이와 더불어 기존 장비를 확인해보거나 다른 장비가 더 잘 작동하진 않는지 확인해보세요. 4G가 ADSL보다 나을 때가 있고 ADSL이 4G보다 빠를 때가 있는데 해당 기간의 변수가 때로 매우 큰 편입니다.
  2. 다른 포트 Ports 시도
    2018년 초부터 모든 Photon Cloud의 클라우드 부서에 새로운 Port 범위를 추가했습니다. 즉, 원래 5055~5058을 사용하지 않고 27000으로 시작할 수 있습니다.
    Port를 바꿔도 별로 달라지지 않아 보여도 간혹 알 수 없는 연결 문제는 긍정적으로 문제를 해결해주는 효과가 있습니다.

지금까지 클라이언트로부터 받은 피드백은 작업이 더 원활하다는 것이었습니다. 일부 Client SDK에서는 Server/Cloud의 port number를 수동으로 바꿔야 할 수도 있습니다. 예시:


  • Name Server 의 Port 번호 27000(이전에는5058)
  • Master Server 는 27001(이전에는 5055)
  • Game Server 27002(이전에는 5056)
  1. CRC검증 사용
    간혹 Clientdhk Server 간 전송 중 네트워크 Package가 손상되는데, 라우터나 네트워크가 매우 혼잡할 때 그럴 가능성이 큽니다. 일부 하드웨어 혹은 소프트웨어도 간혹 고장나서 발송자가 전송하려던 것이 아닌 데이터를 수신하는 package 오류를 많이 발생 시키기도 합니다.
    따라서 Photon의 모든 package에는 선택 가능한 CRC 검사가 존재합니다. 단, CPU 처리에 다소 시간이 소요되며, 각 패킷을 살펴보면 전체적인 성능이 저하되므로 기본 설정 시에는 활성화하지 않습니다. Client에서 CRC Checks가 활성화된 경우Server / Cloud도 패킷을 보낼 때 CRC가 함께 작동하도록 자동으로 활성화합니다.

CRC Check 활성화 방법은 다음과 같습니다. loadBalancingClient.LoadBalancingPeer.CrcEnabled = true;


CRC 검사가 활성화되고 얼마나 많은 네트워크 패킷이 유효하지 않은 지확인하기 위해 Client의 디스플레이를 추적할 수도 있습니다. 사용 방법:
var packetLossByCRC = LoadBalancingPeer.PacketLossByCrc;


유효하지 않은 패킷이 너무 많다면 사용 중인 네트워크 연결이나 전송 중 경유하는 장비에 큰 문제가 있다는 뜻입니다!!

 


질문에 빠른 답변을 받는


보통 저희가 질문을 받은 후의 프로세스는 다음과 같습니다. 통상적으로 먼저 최신 버전에서 보내주신 오류를 확인해보기 때문에 버전 관련 정보가 있으면 제일 먼저 버전 문제 여부를 분별해 낼 수 있습니다. 혹은 Photon Server Settings에 오류가 있는지 여부 등


버전 문제인 경우 시간이 오래 걸리는 프로그램 구조 문제 탐색을 스킵하고 직접 답변을 드릴 수 있습니다.


OS/Platform 정보 제공도 매우 중요합니다. 문제가 iOS에서 발생한 경우, PC에서 테스트를 하면 플랫폼이 달라 프로그램 흐름이나 지원 수준이 달라질 수도 있습니다.


특히 PlayStation / Switch 같은 경우는 더 특수합니다. 그래서 다른 테스트 과정을 거치게 됩니다. 그러므로 질문을 보내주실 때 저희에게 플랫폼/OS를 알려주시면 프로젝트의 환경 설정을 더 잘 이해할 수 있습니다.


Unity Version도 매우 중요합니다. 버전이 많은 데다 업데이트도 빠르기 때문이죠. 저희는 가장 안정적인 LTS에서 테스트를 실시하고 정식 배포된 최신 버전으로 테스트하지만 여러분은 Beta/Alpha 버전이거나 저희가 테스트한 버전과 다를 수 있고 이럴 경우 Unity Version이 일치하지 않는 현상이 있을 수 있습니다. 그러므로 해당 방면의 정보를 얻을 때마다 제일 먼저 같은 환경에서 테스트해보고 있으며 가끔은 다른 빌드 설정에서 오류가 발생할 수 있습니다. 그러므로 IL2CPP, Mono, Editor Play 등과 같은 빌드 환경에서 문제가 발생하는지 설명해주는 편이 좋습니다.


물론 유저님 프로젝트의 경우 Unity LTS로 전환하거나 실행/검출을 위한 최신 정식 버전으로 전환하는 등의 과정을 거치면 문제의 원인을 직접 찾게 될 수도 있습니다~


따라서 문제를 설명하는 경우 다음 항목을 포함하면 더욱 이해하기 쉽습니다.


  • 예상되는 행동과 실제 상황
  • 문제가 발생하는 빈도는?
  • 특별한 상황에서만 발생하나요?
  • 직접 작성한 code 오류가 발생하고 PUN / Voice / Chat / Bolt에서 제공하는 예제에서도 문제가 발생하나요?


결론:


  • ● 이상, Photon 제품군에서 디버깅, 네트워크 가상 툴 및 통상적인 테스트 방법 및 순서에 대한 설명이었습니다.
    여러분이 이런 방법과 도구를 잘 활용하여 네트워크 개발에 소요되는 시간을 줄이고 중요한 일에 시간을 많이 투자할 있길 바랍니 !!
  • ● 우리 Photon Taiwan의 존재가 이러한 예제와 다인 접속 프로그램 구조를 더 쉽게 배우는 데 도움이 되었으면 좋겠고, 다 함께 특색 있는 온라인 게임을 함께 만들어 봅시다!

 

 

 

한국 페이스북 페이지 : https://www.facebook.com/photoncloudkr/
기술관련 문의사항 : developer@photonengine.kr
그 외 문의사항 : info@photonengine.kr

 





출처 : Hu씨의 Photon 블로그 이야기 (대만)