Photon의 직렬화(Serialization)
Photon과 클라이언트는 통신할 때 고도로 최적화된 바이너리 프로토콜을 이용합니다. 바이너리 프로토콜은 컴팩트 하지만 해석하기 쉽습니다.
Photon은 데이터가 전송되기 전 바이너리 프로토콜로 변환 되어야 합니다.
일반적으로 널리 사용되는 데이터 타입에 대해서는 자동 변환 됩니다.
필요시 대부분의 클라이언트 API에서 특정 클래스들만의 직렬화(serialization) 방식을 등록 할 수 도 있습니다.
아래를 참고 해 보세요.
Photon 에서 지원하는 데이터 타입
다음의 타입들은 일반적으로 지원되는 것으로 Photon 의 바이너리 프로토콜에서 알고 있습니다.
특정 언어에서는 나열한 모든 타입을 지원하지는 않습니다. 일부 SDK 에서는 몇 가지 타입만 지원 합니다.
타입 (C#) | 크기 [bytes] | 설명 |
---|---|---|
byte |
2 |
8 bit unsigned |
boolean |
2 |
true or false |
short |
3 |
16 bit |
int |
5 |
32 bit |
long |
9 |
64 bit |
float |
5 |
32 bit |
double |
9 |
64 bit |
string |
3 + size( UTF8.GetBytes(string) ) |
< short.MaxValue length |
byte-array |
5 + 1 * length |
< int.MaxValue length |
int-array |
5 + 4 * length |
< int.MaxValue length |
<type> 배열 |
4 + size(entries) - count(entries) |
< short.MaxValue length |
hashtable |
3 + size(keys) + size(values) |
< short.MaxValue pairs |
dictionary |
3 + size(keys) + size(values) |
< short.MaxValue pairs K- 또는 V-타입이 객체인 경우 추가적인 크기 |
Photon 유니티 네트워킹의 추가 타입
Photon 유니티 네트워킹(PUN)은 몇 개의 추가적인 타입을 지원 합니다.
추가적인 타입들은 "커스텀 타입"으로 구현되어 있으며 아래에 설명되어 있습니다.
Transform 과 PhotonView 는 이 목록에 없습니다.
Transforms 은 "전체"로 설정될 수 없으므로 Position, Rotation과 Scacle 을 각각 전송 해야만 합니다.
PhotonViews 는 일반적으로 viewId(줄여서) 에 의해 참조 됩니다.
viewId 가 네트워크 게임에서 유일한 것으로 전송하는데 가장 부담이 없습니다.
타임 (C#) | 크기 [bytes] | 설명 |
---|---|---|
Vector2 | 12 | 2 floats |
Vector3 | 16 | 3 floats |
Quaternion | 20 | 4 floats |
PhotonPlayer | 8 | integer PhotonPlayer.ID |
커스텀 타입
위에서 열거되지 않은 타입에 대해서는 Photon을 위해 중요 값들을 직렬화/비직렬화 해주어야 합니다.
기본적인 개념은 두 개의 메소드를 통해 클래스를 byte-배열로 그리고 byte-배열을 클래스로 해주는 것을 구현 하는 것 입니다.
그리고 이 클래스를 Photon API 에 등록 합니다.
이 작업이 완료되면 이 타입에 대한 인스턴스를 모든 메세지에 포함하여 전송 할 수 있습니다.
Photon 은 등록된 타입에 대해서 직렬화 메소드를 호출 하고 자동적으로 생성된 byte-배열에 프리픽스를 붙여 줍니다. 이 프리픽스에는 타입 정보가 들어있고 4바이트 크기 입니다.
4바이트 오버헤드로 인하여 타입을 등록하는것을 원하지 않을 수 있는데 겨우 4바이트 입니다.
"현재" Photon 서버는 알수 없는 커스텀 타입을 포워드 할 수 있습니다.
Photon 클라우드 내에서 타입을 등록하지 않았기 때문 입니다.
통신하는 모든 클라이언트에게 커스텀 타입이 등록 되었는지 확인 해주셔야 합니다.
Back to top