본문 바로가기
대학생활/수업

게임네트워크프로그래밍 10주차 - 턴 방식 게임, 입력 동기화, 객체 직렬화

by se.jeon 2023. 5. 15.
728x90
반응형

수업 개요 설명, 지난주 내용 복습.

- 턴 방식 게임
- 간단한 액션 게임
- 키 입력 동기화 게임
- 직렬화/역직렬화
- 마샬링

2학기 학기작 대비할 시간이 얼마 남지 않았다.

기말과제 안내.

 

턴 방식 게임

- 단말 한 대에서 플레이 하는 경우

  프로그래머에게 익숙한 플로우차트.

 

떨어진 장소에서 플레이하는 틱택토의 통신

 

무엇을, 언제 통신하는가.

온라인 게임일 때, 각 단말의 게임 처리

단말 두 대에서 플레이 하는 경우

 

최대한 적은 정보를 적은 횟수로 보내는 것이 중요.

 

- 규칙에 우선순위가 있는 게임

- 연속적으로 이어졌는지 체크해야 하는

 

 

Wrapper Class

네트워크를 필요할 때 마다 열고 사용이 끝나면 닫는데, 매번 반복적으로 처리할 필요가 없다.

기존의 TCP/IP, UDP/IP를 감싸는 클래스를 만드는 것이 좋다.

 

네트워크에서 제공하는 Wrapper Class는 오류처리 때문에 헷갈릴 수 있다.

Generic과 Async, Awake 등을 비동기 프로그래밍을 이해해 두는 것이 좋다.

 

- 턴제 게임의 경우, 타임아웃에 대해 고려해야 한다.

- 회선이 끊어졌을 때, 게임을 중단시킬 것인지 랜덤한 배치를 계속 할 것인지를 결정해야 한다.

- 어려울 경우 네트워크가 끊어지게 처리하는 것이 가장 간단하다.

 

네트워크가 끊어졌을 때 사용하는 명령어

- shut down : 연결을 끊음, log off

- close : 소켓이 닫힘

 

링거옵션

캐시에 담아두고 한 번에 전송하는 경우도 있다.

1. 네트워크에 모든 것을 다 보내고 종료하는 것.

2. 타임아웃 값을 넣을 수 있다.

3. 네트워크에 보냈는지 여부에 관계 없이 종료하는 경우도 있다.

실행하다가 안 되면 롤백을 진행한다.

 

가위바위보 게임

아주 손쉬운 게임이라고 해도 기획자가 어떤 룰로 정하냐에 따라 구현해야 하는 것이 크게 달라지게 된다.

- 정보가 송수신 되는 과정으로 인해 결과가 달라질 수 있다.

- 보이는 것과 결과가 일치하지 않을때

- 결과와 표현이 어긋나는 현상은 온라인 게임에서만 발생하는 문제이다.

- 허용할 통신 지연 범위 결정 -> 예비 동작을 넣기

- 게임이 매칭이 되지 않을 때, 해당 게임을 매칭하는 사람이 전 세계에 아무도 없는 것이 아니라 통신 지연 범위에 적합한 사람이 매칭중이지 않다는 것이다.

 

Unity의 특성을 이해하고, LateUpdate예제를 참조하는 것이 좋다.

 

 

키 입력 동기화

- 키 입력 정보 : 키보드, 컨트롤러의 버튼이나 방향키의 상태 플래그와 같이 아날로그 장치가 입력한 정보

- 키 입력 동기 게임은 각각의 단말에서 보면 떨어진 장소에 있는 플레이어가 같은 단말에 연결된 컨트롤러로 게임을 하는 것과 같다.

- 통신 상대의 키 입력 정보를 자신의 단말에서 입력된 것처럼 처리.

 

FPS : Frame Per Second

bps : bit per second

BPS : Byte Per Second

 

- 시작 타이밍이 다를 경우 동기화 시작 구조

- 키 입력 정보 송수신과 상태 전환

- 키 입력 정보의 송수신 상태

  - 송수신을 하지 않은 상태

  - 송신 o/ 수신 x

  - 수신 o/ 송신 x

  - 송수신되어 동기화한 상태

- 키 입력 정보는 1프레임을 처리하는 시간 내에 송수신되어야 함.

- 지연되는 경우, 키 입력 지연을 허용해서 정보를 수신할 때 까지 시간을 확보하는 식으로 대처 가능.

 

키 입력 지연을 해결하는 방법

- 버퍼를 이용한다.

- Queue를 이용한다.

- UDP를 사용한다.

 

UDP로 통신하기

- 빠르긴 하지만, 정보가 손실될 수 있다.

- 키 입력 정보를 중복 송신한다.

 

직렬과 병렬

특정 속도를 넘어갈 경우 직렬이 효율적인 방법이다.

USB, UPB ···

 

패킷과 시리얼라이저

패킷 - 송수신할 정보를 모은 것

시리얼라이즈 - 구조체와 비슷, 패킷 데이터를 같은 변수형 데이터로 바꾼다.

64비트 운영체제 - 길이에 관계없이 64비트로 처리.

Pack, Unpack 옵션

- endianness 

- Big Endian, Little Endian - 리버스를 해 줘야 하기도 한다.

- 마우스 입력 시리얼라이저 : L, R, X, Y, Z 등 모든 정보를 시리얼라이징 해 주어야 한다.

- 키 입력 정보 디시리얼라이저

- 엔디언 판정

 

키 입력 정보의 송수신

- 프레임 동기 제어

- 키 정보 추상화

- 키 지연 버퍼 등록

- 키 입력 정보 반영

- MouseData를 저장할 InputData 구조체 정의

- 키 입력 정보 송신

- 키 입력 정보 수신

 

게임이 끝나도 종료되지 않는 경우

- 수신 대기 상태가 되어 다음으로 진행되지 않는다.

- 접속 종료 플래그가 유효하므로 접속을 종료한다.

- 접속 종료 플래그를 추가한다.

- 접속 종료 플래그 송수신

 

키 입력 정보와 시리얼라이저

- 키 입력 정보의 시리얼라이저

- 마우스 정보의 시리얼라이저

- 키 입력 정보의 디시리얼라이저

- 마우스 정보의 디시리얼라이저

 

클래스의 송수신

메모리 값을 보내면 안된다.

 

객체 직렬화

- 직렬화

- 역직렬화

- 마샬링 : 데이터를 바이트 덩어리로 만들어 스트림에 보낼 수 있는 형태로 바꾸는 변환 작업자

- 언마샬링 : 객체 스트림에서 전달된 바이트 덩어리를 원래의 객체로 복구하는 변환 작업자

- 메멘토 패턴, 프록시 패턴

- 객체 관계 매핑 프레임워크

- RMI(Remote Method Invocation), Beans 등등

 

직렬화가 필요한 이유

자료 전송 시 발생하는 예상 문제를 예방하기 위하여.

 

똑똑한 프로그램 만드는 요령 (중요)

- 포인터가 가리키거나 레퍼런스가 참조하는 데이터 전체를 동일하게 복제 전달해 주거나, 해당 데이터와 '동일하게' 취급되는 내용을 수신자 프로세스에서 찾아 연결해 주는 기능이 구현되어 있어야 견고한 리플리케이션 코드라 함.

- Vector를 단순히 복제하면 안된다.

 

스트림 (Stream, 중요)

- 순서가 있는 데이터 원소의 집합을 캡슐화하여 유저가 그 데이터를 읽거나 쓸 수 있게 해 주는 자료구조.

- 출력 스트림이거나 입력 스트림, 혹은 입출력 스트림 셋 중 하나.

- 메모리 스트림 : 메모리 버퍼를 감사둔 것.

- 메모리 버퍼는 힙(heap)에 동적으로 할당.

 

엔디언 호환성

- 빅 엔디언 : 최상위 바이트를 가장 먼저 저장.

- 리틀 엔디언 : 최하위 바이트를 가장 먼저 저장, 빅 엔디언을 거꾸로 쓴 방식.

 

제네릭, 동기화 비동기화는 필수 공부 항목.

 

비트, 바이트 스트림

- 메모리 스트림은 1바이트 단위지만 비트 스트림은 비트 단위로 쪼개어 기록할 수 있음.

 

임베딩, 압축

 

자료 반복해서 많이 볼 것.

비주얼스튜디오 실습

 

 

개인 가산점 추가 발표 자료

 

202013197_네트워크 발표2.pptx
2.11MB

728x90
반응형