수업 개요 설명, 지난주 내용 복습.
- 턴 방식 게임
- 간단한 액션 게임
- 키 입력 동기화 게임
- 직렬화/역직렬화
- 마샬링
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바이트 단위지만 비트 스트림은 비트 단위로 쪼개어 기록할 수 있음.
임베딩, 압축
자료 반복해서 많이 볼 것.
비주얼스튜디오 실습
개인 가산점 추가 발표 자료
'대학생활 > 수업' 카테고리의 다른 글
게임기획크리틱 11주차 - 인공지능 (0) | 2023.05.16 |
---|---|
게임그래픽프로그래밍 10주차 - 도형 그리기와 칠하기 (0) | 2023.05.15 |
게임레벨디자인기초 9주차 - 엑셀 사용 기초 (0) | 2023.05.11 |
게임음악작곡법 9주차 - 중간고사 시험 (0) | 2023.05.11 |
게임프로그래밍고급 10주차 - Shader, HLSL, Kernel, Thread, Group (0) | 2023.05.09 |