목록직렬화 (3)
Coding Memo
3가지 직렬화를 비교해보자. 1. BitConverter를 이용2. Unsafe 코드인 StructureToPtr을 이용하여 메모리 내용을 그대로 이용3. 직접 바이트를 조작속도 비교 C++로 작성된 서버와 C#으로 작성된 클라이언트의 통신에서 패킷 정보 파싱을 위해 PacketHeader라는 구조체를 이용했다. PacketHeader는 unsigned int16 (ushort)의 Id 값과 같은 타입의 Size로 이루어져 있다. C++의 placement new를 이용해서 메모리에 있는 값 그대로 전송하여 C#에서 파싱하는 형태이다. PacketHeader는 다음의 구조이다.[Size, 2 bytes][Id, 2 bytes] C#에서도 위 메모리 순서를 지키면서 다음 구조체를 작성하였다.[StructL..
구글에서 제공하는 프로토버퍼를 이용해 서버와 클라이언트간 패킷을 주고받는 시나리오를 계획했다. 서버와 클라이언트 간 전송 시에는 byte[]라는 배열로 주고 받게 되는데, 이 배열을 다시 어떤 객체로 파싱하는 과정이 필요하다. CustomBuffer (직접 직렬화한 버퍼)를 사용하였을 때는 버퍼의 헤더를 추가하여, 버퍼의 맨앞에 2바이트 타입을 추가하고 그 값으로 전체 패킷의 길이를 넣었고 두번째 2바이트 값으로 해당 패킷의 원래 객체 타입을 정의해서 넣었었다. 아래의 구조와 같이 직렬화하는 버퍼를 CustomBuffer라고 하겠다. 파싱할 때는, 처음 2바이트를 읽어서 단위 패킷의 범위를 정한다. 그 다음으로 2바이트를 읽어서 Body에 있는 데이터를 어떤 객체로 역직렬화할 건지 알아낸다. 마지막으로,..
Unity에서 GameObject에 Component(MonoBehaviour)를 추가 하면 ‘Inspector’에 관련 내용이 표시가 된다. 위 이미지에서는 Transform과 SpriteRenderer가 Component로 붙어있고, 각 컴포넌트에 에디터에서 직접 편집하고 수정할 수 있는 값들이 나타나 있다. 이 값들은 흔히 우리가 MonoBehaviour에서 [SerializeField]태그가 붙거나 public으로 선언한 필드가 있으면 자동으로 Inspector에 나타나게 된다. 이 값들을 (태그에서 알 수 있듯이) SerializedProperty라고 하고 이것을 가지고 있는 객체를 SerializedObject라고 한다. 말 그대로 직렬화 되어서 우리가 유니티 에디터에서 다루기 쉽도록 바꾼 것..