2014-05-21 2 views
0

저는 현재 개별 프로젝트에 서버와 클라이언트가있는 게임을 개발 중입니다. 문자열 전송을 통해 TCP 소켓을 통해 통신 할 수는 있지만 매우 효율적이지는 않습니다. 게임 데이터를 보내는 방법. 소켓을 통해 클래스 및/또는 객체를 보낼 수있는 방법과 방법을 알고 싶습니다. 그렇지 않은 경우 데이터를 전송하고 수신하도록 데이터를 형식화하고 작업하는 가장 좋은 방법은 무엇입니까?Unity3D는 소켓 서버 - 클라이언트 통신을 통해 클래스를 보냅니다.

+0

http://msdn.microsoft.com/en-us/library/ms233843.aspx –

+0

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter % 28v = vs.110 % 29.aspx –

+0

그리고 "C# 바이너리 직렬화"에 대한 인터넷 검색 –

답변

0

대부분은 매우 컴팩트 한 방식으로 스트림에 데이터를 압축하기 위해 "비트 패킹"을 사용합니다. 상당히 낮은 수준의 직렬화 및 deserialization 코드가 필요하지만 훨씬 더 나은 처리량과 대역폭 사용이 가능합니다.

"비트 패킹"이란 단어를 빠르게 검색하면 문제를 해결하는 방법을 찾을 수 있습니다.

개념에는 원시 데이터 값만 보내고 형식 정보는 보내지 않는 이진 TCP 소켓을 사용하는 것이 포함됩니다.

이점의 일반적인 예 ... float 값 "12345678.12345678"은 많은 양의 문자열이며, 비트 패킹을 사용하면이 숫자를 나타내는 4 바이트를 보낼 수 있습니다. JSON 표현하지만 뭔가를 보낼 것

...

someMessage { myVar: 123f }; 

많은 양의 데이터가 "객체 x는 현재 방향 23F 이동"말을 그게 전부 은 일반적으로 무엇을 가장 할 것은 같은 것입니다 ..

그런 다음이 유형으로 보내려는 바이트를 "압축"하는 코드를 작성하십시오. OpCode는 메시지에 "접두어"로 붙어 있습니다. 데이터가 라인을 넘어 오면 수신기는 항상 처음 4 바이트에서 OpCode를 얻고 다른 것은 메시지 데이터입니다.

그런 다음 아이디어는 보낸 사람과받는 사람이 유형을 공유하고 OpCodes가 의미하는 바를 이해하여 바이트 배열을 "압축"하고 "압축을 풀 수"있습니다.

위의 예에서 opcode는 "현재 속도로 현재 방향으로 이동"을 의미하는 123이고 개체 ID에 대해 바이트 []는 4 바이트 (가능)를 포함하고 그 다음 4 바이트는 이동하는 양.

따라서 총 12 바이트가 전송됩니다. 대신에, (만약 내가 모든 공백을 제거 할 수 있다면) 위의 예제에서 24 바이트와 플로트 값에 대해 상대적으로 작은 라운드 수를 갖는 것은 거의 발생하지 않습니다 !!! 문자열로 float을 보내는 것은 거의 확실하게 보통의 float 값에 대해 20 바이트 정도의 비용이 소요됩니다. 3 차원 게임에서는 12 바이트를 선택할 수있는 위치 (x, y, z) 중 3 개가 필요합니다. 또는 보내지는 메시지의 부분에있는 단지 위치에 대해 60!

다른 방법이 없으면이 기능을 시작하시기 바랍니다.

질문에 좀 더 초점을 맞추면보다 완벽한 답변을 드리겠습니다. 그러나 본질적으로 매우 광범위한 도달 문제는 완전한 솔루션을 제공하기 어렵습니다.

+0

설명하는 내용을 이해하고 할 일 목록에있었습니다. 하지만 내 질문에 완전한 클래스를 보내는 방법이 있다면, 예를 들어 나는 player.transform을 가지고 socket.send (player.transform)와 같은 전체 클래스를 보내고 클라이언트는 클래스로 수신한다. 그게 뭐야? –

관련 문제