본문 바로가기

게임 프로그래밍/unity

유니티 네트워크 프로그래밍

 Unity 내부에서 C#을 통해 통신 프로그램 개발을 하려고 하는데, 가능한 게임에 영향을 주지않고, 통신비용(패킷 량)을 감안한 네트워크 프로그램을 하고자 한다.


관련 문의답변을 보게되면 아래의 몇 가지 통신방식을 제시하고 있다.

1. Blocking I/O Model

2. Multi-threaded Blocking I/O Model
3. Non-blocking poll/epoll Model
4. Non-blocking event Model
5. Asynchronous Model


결국, 유니티 내에서 Blocking Model 을 선택하지 않고 구현해야 하며, 별도의 쓰레드로 동기화 객체를 이용하여 전송 체계를 만들어야 할 것 같으며, 결국 이벤트 발생 시에 해당 ConcurrentQueue 에 저장해 두면, 외부 쓰레드에서 해당 Queue 와 통신할 수 있는 방법을 찾아야 한다.


유니티 상에서 쓰레드 사용해보기

유니티 기능을 사용하지 않으면 스레드를 만들어서 멀티 스레드를 사용하는것은 문제가 없다고 보임

1. 유니티에서 별도의 쓰레드 사용하여 네트워크 통신하기

2. 유니티 게임객체에서 쓰레드에 안전한 공유 객체사용하여 이벤트 저장하기

3. 유니티 쓰레드와 네트워크 쓰레드를 동시에 기동하여 Queue 방식 전송 테스트


Non-blocking socket server 구현

1. select, poll, epoll 활용하여 소켓 서버 구성


 간략히 정리해 보면, 블록 모델 가운데 손쉬운 방법으로는 싱글/멀티 쓰레드로 접근 할 수 있으나, 서버의 부하가 너무 크기 때문에 비동기 방식을 취할 수 있는데, 이는 명확하게 얘기하기는 힘들지만, 블로킹 모델이라 보는 게 맞다고 한다. 즉, Connect 를 동기방식으로 하고, 해당 Event 발생 시에 CallBack을 해주는 방식이기 때문이라고 합니다. 그리고, 논 블로킹 방식으로는 리눅스 기반의 OS 상에서는 select, poll, epoll 방식으로 서버를 구현할 수가 있다고 한다.


관련링크

C# IOCP 네트워크 프로그래밍 질문 & 답변

블록/논블록 네트워크 모델



'게임 프로그래밍 > unity' 카테고리의 다른 글

유니티에 대한 오해와 진실  (0) 2015.04.14
3D 러닝게임 리뷰  (0) 2015.03.14
유니티 튜토리얼 1  (0) 2015.03.12