어플리케이션은 게임의 서버 측 로직입니다. 게임의 모든 기능들(예, 원격 프로시져 호출, 데이터 저장 등)은 Photon Application 에서 구현 됩니다. C# 소스는 컴파일 되고 어셈블 되어 Photon native 코어에 의해 로드 됩니다. 설정 파일을 이용하여 어플리케이션을 설정하고 Photon Core 시작 파라미터를 정의 합니다.
일반적으로 게임의 모든 로직은 하나의 어플리케이션 내에서 제공 됩니다. Photon은 동시에 여러 어플리케이션을 수행 할 수 있습니다. 각 어플리케이션은 서로 다른 기능을 수행 할 수 있습니다. 예를 들어 분리된 어플리케이션은 웹기반 클라이언트에게 정책 파일을 전송하려고 작성 될 수 있습니다.
클라이언트에게 어플리케이션 이름을 제공하여 연결을 원하는 어플리케이션을 선택하게 만들 수 있습니다.
게임 로직
게임로직은 어떻게 서버와 클라이언트가 상호 동작을 하는 지를 정의 하는 것입니다. 게임 로직은 오퍼레이션, 이벤트와 서버 자체에서 수행하는 모든 것을 구현 합니다.
만약 하나의 큰 세계관을 갖는 게임이라면 MMO Demo Application이 좋은 기준이 됩니다. 이 어플리케이션은 클라이언트들에 대한 관심그룹 관리기법을 다루며 아이템, 속성, 액터등의 클래스를 제공 합니다.
대신 모든 게임 로직은 C# 프레임워크 상에서 직접적으로 개발 될 수 있습니다. 게임로직의 시작 시점은 application 클래스이며 Photon.Socketserver.dll 에 정의 되어 있습니다.
오퍼레이션
Photon에서 오퍼레이션은 원격 프로시져 호출과 동일합니다. Photon 클라이언트들은 원하는 것을 얻기 위해 오퍼레이션 호출을 사용 합니다.
오퍼레이션과 오퍼레이션의 파라미터들은 필요에 따라 서버측 어플리케이션내에서 정의 될 수 있습니다. 클라이언트는 오퍼레이션의 규약에 맞춘 키-값의 해시테이블을 설정하여 어떤 오퍼레이션도 호출 할 수 있습니다. 클라이언트와 서버 프레임 워크가 직렬화(serializatoin), 전송, 비직렬화에 대해 처리 합니다.
모든 오퍼레이션은 결과를 제공 할 수 있습니다. 결과는 요청한 데이터를 클라이언트에게 제공해주는 단방향 입니다. 물론 대역폭을 줄이기 위하여 결과가 생략 될 수 있습니다.
오퍼레이션 호출과 결과는 클라이언트와 서버 사이에서 발생하는 것입니다. 다른 클라이언트는 이러한 상황에 대한 것을 알 수 없습니다.
이벤트
Photon 이벤트는 클라이언트를 위한 메시지들 입니다. 이벤트는 바이트코드로 작성되며 게임 업데이트 내용을 전달 합니다. "LoadBalancing Application 에는 몇개의 이벤트가 정의 되어 있지만 순수한 클라이언트 측의 커스텀 이벤트를 정의 하는 것도 가능 합니다.
오퍼레이션의 결과와는 다르게 수신된 이벤트는 다른 클라이언트의 오퍼레이션 호출을 발생 시키게 됩니다. 이 의미는 이벤트는 언제라도 들어올 수 있다는 것입니다. "LoadBalancing Application 에서는 누군가가 룸에 참가했거나 나갔을 때 이벤트를 전달 합니다.
RaiseEvent 오퍼레이션은 이벤트를 전적으로 공용으로 만들게 됩니다. 모든 클라이언트는 해시테이블에 데이터와 코드를 같이 넣어 새로운 이벤트를 생성 할 수 있습니다. 게임 데이터는 서버의 변경없이 전송 될 수 도 있습니다.
물론 이벤트에 대하여 정교한 서버측 반응을 위해서는 이벤트 데이터 검토, 컴파일 및 다른 이벤트 생성을 위해 커스텀 오퍼레이션이 정의 될 수 있습니다.
접속과 타임아웃
일반적인 UDP 와는 달리 Photon 의 신뢰할 수 있는 UDP 프로토콜은 서버와 클라이언트간 연결을 해 줍니다: UDP 패키지 내의 명령어들은 일련 번호와 신뢰성 여부 플래그를 가지고 있습니다. 만약 신뢰성이 표기 되어 있다면 수신측에서는 잘 받았다는 명령을 알려 주어야 합니다. 신뢰할 수 있는 명령어는 수신을 잘 받았다는 메시지 도착 전에 짧은 시간 간격 내에서 반복되게 됩니다. 만약 수신 확인이 도착 하지 않았다면 접속 타임아웃이 발생 됩니다.
각 측은 자신의 관점에서 서로 독립적으로 연결을 모니터링 합니다. 양측은 자신의 규칙으로 상대측이 아직 연결되어 있는지를 결정 합니다.
타임아웃이 감지 되었으면 연결측의 접속 해제가 발생합니다. 한쪽이 접속된 상대편의 응답이 없다고 판단되면 더 이상 메시지를 보내지 않습니다. 이 때문에 타임아웃 연결해제가 한쪽 측에서만 일어나며 동기적이 아니라고 하는 이유입니다.