Photon 서버 환경 설정
이 장에서는 Photon 서버에서 파일과 폴더가 어떻게 구성되어 있고 설정하는지에 대해서 설명 합니다.
deploy 폴더에 필요한 모든 것이 다 들어 있습니다.
서버와 어플리케이션 구성
폴더에는 Photon 의 4개의 버전이 있습니다:"bin_Win32" 과 "bin_Win64". 이 폴더를 바이너리 폴더라고 합니다.
Photon 은 어플리케이션 마다 바이너리 폴더 옆에 분리된 폴더가 필요 합니다.
(예, deploy 폴더내의 "Loadbalancing"). 어셈블리 파일은 반드시 "bin" 하위폴더에 있어야 합니다(예,. "Loadbalancing/bin").
다음의 서버 SDK deploy 폴더 안의 폴더들은 어플리케이션들 입니다:
CounterPublisher, Lite, Loadbalancing, MmoDemo, Policy
어플리케이션은 Photon 의 환경 파일에 아래에 설명된 것처럼 셋업됩니다.
"bin_tools" 폴더에는 유용한 툴이 있습니다:
- Baretail: 무료 에디션으로 로그 뷰어 입니다. 최신 로그를 보기 위해서 PhotonControl 이 사용 하고 있습니다.
- Photon Dashboard: 관리화면 카운터를 수집하여 웹페이지에 표시해주는 서비스 입니다.
- Perfmon: 카운터 로깅을 파일로 설정 했을 때 사용되는 PerfMon 카운터들의 목록이 들어 있습니다. 이것은 "관리자" 항목에서 설명되었습니다.
- Stardust: 명령줄 testclient 으로 머신에 로드된 것을 취득할 때 사용 됩니다.5분안에 Photon 시작하기에서 보여 드렸습니다.
환경설정: PhotonServer.config
Photon 의 주 환경 설정 파일은 PhotonServer.config 입니다.
동일한 복사본이 SDK 의 바이너리 폴더안에 있습니다.
이 파일은 어플리케이션 , 리스너의 IP 와 성능의 특정값 등의 설정에 사용 됩니다.
이 파일에는 게임 로직에 대한 설정 값은 포함되어 있지 않습니다.
기본값은 하나 이상의 코어에서 잘 동작하도록 설정된 값이지만 기계의 성능을 뛰어 넘을 수는 없습니다.
일반적으로 성능에 대한 설정의 변경은 필요 하지 않습니다.
다음은 일반적으로 가장 많이 사용되는 설정 값입니다.
추가적인 옵션에 대해서는 Photon Server 환경 설정 페이지에 설명되어 있습니다.
어플리케이션 노드
설정 파일은 Photon 이 시작시 어떤 어플리케이션을 로드 할 것 인지를 정의 해 줍니다.
"Applications" 노드에서 몇개의 "Application" 항목이 추가 될 수 있습니다.
XML
<Applications Default="Lite">
<!-- Lite Application -->
<Application
Name="Lite"
BaseDirectory="Lite\Lite"
Assembly="Lite"
Type="Lite.LiteApplication"
EnableAutoRestart="true"
WatchFiles="dll;config"
ExcludeFiles="log4net.config">
</Application>
</Applications>
각 어플리케이션은 이름으로 지정되며 이 이름으로 클라이언트가 연결시 참조하게 됩니다.
BaseDirectory 에는 어플리케이션이 있는 폴더를 정의 하게 됩니다.
여기에는 "\bin"로 명명하지 않았으나 관례상 사용 합니다.
Assembly 는 어플리케이션의 .dll 과 "main" 클래스의 타입입니다.(main 클래스는 Photon.SocketServer.Application 에서 상속받은 것 입니다.)
EnableAutoRestart 설정은 로드된 어플리케이션의 쉐도우 카피를 시작하도록 알려 줍니다.
이렇게 하면 개발자들이 락 걸리는 이슈 없이 파일을 교체 할 수 있어 개발을 더 편리하게 할 수 있습니다.
Photon 은 파일이 변경되면 10 초 후에 새로운 어플리케이션의 인스턴스를 자동으로 시작합니다 .
WatchFiles 와 ExcludeFiles 은 파일의 목록을 정제하여 재시작을 트리거 합니다.
이전의 쉐도우 카피에 접속했던 클라이언트는 여전히 그 안에 접속되어 있습니다. 새로운 연결들이 새로운 로직을 사용하게 될 것 입니다.
여러개의 어플리케이션을 로드하기 위해, 간단하게 어플리케이션 노드를 추가 하면 됩니다(유일한 이름으로)
이 중 하나를 이름(예제에서 "Lite")을 사용하여 디폴트 어플리케이션으로 설정 합니다.
디폴트 앱은 알 수 없는 어플리케이션에 접속 시도를 위한 클라이언트들의 대비책 입니다.
PhotonServer.config 에 설정되어 있지 않은 어플리케이션들은 로드 되지 않으며 디플로이 될 필요도 없습니다. 설정 파일에 있는 어플리케이션이 있으나 파일들의 누락이 있는 경우에 Photon 은 시작되지 않을 것 이며 로그 파일에 이슈의 이름이 기록 됩니다.
UDPListeners 와 TCPListeners 노드
머신의 UDP 와 TCP 엔드포인트를 설정 합니다. 두개 중 하나(예, UDP 만) 또는 두개 모두를 사용할 수 있습니다.
기본 IP 0.0.0.0 은 로컬에서만 사용할 수 있는 IP 에 대해서만 리슨 하도록 합니다.
와일드카드 IP 로 변경하면 Photon 이 특정 IP들과 포트를 오픈 합니다.
여러개의 UDPListener 와 TCPListener 노드가 정의 될 수 있고 여러 IP/포트 조합을 오픈 합니다.
UDPListener 와 TCPListener 노드 각각에 대해서 OverrideApplication 또는 DefaultApplication 셋업 할 수 있습니다.
Override의 의미: 이 포트에 접속하는 모든 클라이언트는 어떤 클라이언트가 접속 하던 지에 관계없이 결국 어플리케이션 이름입니다.
기본값은 클라이언트에의한 어플리케이션 이름이 없는 경우 fallback 으로 설정 됩니다.
XML
<UDPListeners>
<UDPListener
IPAddress="0.0.0.0"
Port="5055"
OverrideApplication="Master">
</UDPListener>
<UDPListener
IPAddress="0.0.0.0"
Port="5056"
OverrideApplication="Game1">
</UDPListener>
</UDPListeners>
기본 유니티 포트 변경
유니티/UDP의 마스터 어플리케이션의 기본 포트는 5055 이고 게임 서버 어플리케이션의 기본 포트는 5056 + 5057 입니다.
이 포트들을 변경하기 위해서는 다음처럼 처리 해야 합니다.
/deploy/bin_[Win_version] 에서 Photon 서버 config 파일을 오픈 합니다.
XML
<UDPListeners>
<UDPListener
IPAddress="0.0.0.0"
Port="5055"
OverrideApplication="Master">
</UDPListener>
<UDPListener
IPAddress="0.0.0.0"
Port="5056"
OverrideApplication="Game1">
</UDPListener>
<UDPListener
IPAddress="0.0.0.0"
Port="5057"
OverrideApplication="Game2">
</UDPListener>
</UDPListeners>
/deploy/Loadbalancing/GameServer1 과 /GameServer2 에서 "GamingUdpPort" 를 편집합니다:
XML
<setting name="GamingUdpPort" serializeAs="String">
<value>5056</value>
</setting>
새로운 마스터 서버 포트로 접속하기 위하여 클라이언트를 변경 합니다.
Photon 서버를 재시작 합니다.
TCPSilverlightListeners 와 TCPFlashListeners 노드
제거될 수 는 있으나 Silverlight 또는 Flash 게임을 만들 때 필요 합니다. 둘다 클라이언트측 플러그인은 "policy file" 을 통한 서버 응답이 필요 합니다(Photon 과 같은 동일한 도메인에 있는 웹사이트는 제외).
타임아웃 설정
인스턴스 노드내에 두 값으로 응답이 없는 UDP 클라이언트들의 서버 타임 아웃을 설정 합니다: MinimumTimeout 과 MaximumTimeout.
XML
<Instance1
EnablePerformanceCounters = "true"
DataSendingDelayMilliseconds="50"
AckSendingDelayMilliseconds="50"
MinimumTimeout="5000"
MaximumTimeout="30000">
UDP를 통해 접속한 피어는 접속 해제전에 MinimumTimeout 밀리세컨드내에 응답해야 합니다. 연결 해제까지 실제 시간은 RTT 내역을 기반으로 하여 피어마다 동적으로 결정됩니다. 이전의 좋은 RTT는 더 빨리 연결해제 될 것 입니다.
TCP 연결은 분리된 TCPListener 노드내에 InactivityTimeout 설정과 TCPPolicyListener(PhotonServer.config 에도)가 있습니다. 5초(5000 ms)로 설정해 놓았습니다. 이 시간까지 아무런 요청이 없다면 연결은 타임아웃되어 종료 됩니다. 클라이언트는 이것을 방지 하기 위하여 주기적으로 서버에 ping 을 해야 합니다. TCP 에 대해서 클라이언트는 타임아웃이 없습니다.
클라이언트는 독립적으로 연결을 모니터링 하며 또한 타임 아웃이 될 수 도 있다는 것을 주의 하시기 바랍니다. 게임에 적합하도록 양측에 동일한 타임아웃 시간을 설정 하세요.
지연 전송과 Ack 지연
DataSendingDelayMilliseconds 과 AckSendingDelayMilliseconds 속성은 성능과 최소 응답시간 두 개 사이의 균형(상충되는) 입니다. 이 지연은 직접적으로 대역폭 사용의 감소로 약간의 지연이 추가 됩니다: 대기로 인하여 서버가 명령어를 통합하여 하나의 패키지를 전송할 수 있도록 해 줍니다. send 지연은 서버가 아무것도 보내지 않을 때 트리거 되며 ack 지연은 수신되는 신뢰성있는 데이터에 의해서 발생 됩니다.
위에서 보았듯이 기본 값은 각각 50ms 입니다. 여러 시험을 통해서 이 값이 적절하다고 판단했으나 클라이언트와 서버가 동일 머신에 있을 지라도 ~50ms 라운드트립 시간이 유발되게 됩니다.
게임에 따라 서로 다른값을 주어 로드 테스트를 수행해 보시기 바랍니다. 0 의 지연은 타이머의 사용을 없애는 특별한 경우이므로 10보다 적은 지연은 되도록 피하시기 바랍니다.
Back to top