전체 글 262

[C#] 기본 자료형

일반 자료형 - 정수 계열 자료형 데이터 형식 부호 유무 크기 C++ 자료형 byte x 1바이트 unsigned char sbyte o 1바이트 char short o 2바이트 short ushort x 2바이트 unsigned short int o 4바이트 int uint x 4바이트 unsigned int long o 8바이트 long long int ulong x 8바이트 unsigned long long int char 유니코드 문자 2바이트 unsigned char - 부동 소수점 데이터 형식 설명 크기 float 단일 정밀도 (7개 자릿수) 4바이트 double 복수 정밀도 (15~16개 자릿수) 8바이트 decimal 29자리 데이터를 표현 16바이트 - 논리형 데이터 형식 크기 값 boo..

C#/C# 기본 2021.09.30

[UE4] 게임 플레이 프레임워크 (GameMode, PlayerController, Pawn)

참고 : https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Framework/ 플레이어를 중심으로 진행되는 게임 프레임워크를 구성하는 요소를 알아본다. GameMode : 게임의 규칙을 지정한다. PlayerController: 폰을 소유하여 플레이어의 조종 방법을 정의한다. Pawn: 플레이어의 실제 게임 공간상의 오브젝트를 지칭한다. PlayerController에 정의된 조종 방식을 사용하거나 고유 방법으로 Pawn의 동작 방식을 설계한다. 폰과 캐릭터 Pawn : 실제 월드 상의 Agent 역할을 하는 Actor 클래스로 Controller에 의해 소유될 수 있다. Character : 휴머노이드 방식의 폰 클래스를 지칭한다. 기본적..

C++/Unreal Engine 2021.09.30

[UE4] Actor 클래스

Actor 액터 클래스 레벨에 배치되는 모든 오브젝트를 지칭한다. 빛, 카메라, 스태틱 메시, 플레이어 시작지점 등이 액터에 속한다. 3D 변환을 지원하며 생성되고 삭제되는 라이프 사이클이 있다. 모든 Actor 클래스의 기반 클래스는 AActor이다. - 에디터 월드 아웃라이너 윈도우에서 씬에 존재하는 모든 액터를 확인할 수 있다. 액터의 속성은 디테일 윈도우에서 확인가능하다. - 모빌리티 (이동가능함) 액터 클래스는 게임 상황 중 이동 가능함을 암시하고 보통 Static Mesh Actors와 Light Actor에 해당한다. Mobility State Description Static (정적) Static Mesh Actors - 미리 계산된 라이트맵에 의해 생성되는 그림자를 갖게된다. 게임 중 움..

C++/Unreal Engine 2021.09.30

[자료 구조] 원형 버퍼 CircularBuffer

배열 기반 원형 버퍼 덱(deque)과 리스트(list)처럼 맨 앞과 맨 뒤의 데이터에 대한 접근이 가능하다. 이를 위해 Head와 Tail에 대한 인덱스가 존재한다. 새로 삽입되는 데이터는 TailIdx에 삽입되며 가장 먼저 꺼내지는 데이터는 HeadIdx가 지칭한다. 메모리의 연속성 이점을 사용하기 위해 배열로 많이 구현하여 사용할 수 있다. #pragma once #include #include template class CircularBuffer { private: static constexpr int MAX_QUEUE_LENGTH = 8; private: T m_arrBuffer[MAX_QUEUE_LENGTH]; int m_iTailIdx; int m_iHeadIdx; public: Circul..

C++/자료 구조 2021.08.23

논블로킹 소켓 WSA 함수 (TCP / UDP)

논블로킹 소켓으로 비동기 I/O를 하고 싶을 때 사용하는 함수를 정리한다. TCP 관련 - WSAConnect https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaconnect int WSAAPI WSAConnect( SOCKET s, const sockaddr *name, int namelen, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS ); 성공일 때 0 아니면 SOCKET_ERROR s : 접속할 주소에 연결된 소켓을 받기 위한 핸들 name : SOCKADDR 포인터 (접속 주소) namelen : 접속하기 위한 정보 길이 나머지..

[TCP/IP 소켓 프로그래밍] WSACreateEvent()와 WSAEventSelect()

WSAEVENT WSAAPI WSACreateEvent(); WSACreateEvent : 수동 리셋 모드의 이벤트 객체를 반환하며 초기 상태는 비신호 상태이다. 이름이 없기 때문에 자식프로세스에서 상속할 수 없다. WSASetEvent, WSAResetEvent, WSACloseEvent 등으로 이벤트 객체의 신호 발생과 객체 소멸을 발생시킬 수 있다. int WSAAPI WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ); 특정 소켓과 WSAEVENT 객체를 연결시키고 소켓에 대한 네트워크 이벤트가 감지되었을 때 해당 이벤트 오브젝트를 신호상태로 만들어준다. lNetworkEvents 인자에 관찰하고자하는 네트워크 이벤트 종류..

[TCP/IP 소켓 프로그래밍] 소켓 옵션 LINGER

setsockopt 함수를 통해 소켓 옵션을 설정할 수 있는데, 그 중 SO_LINGER 옵션을 사용하는 소켓에 대해 알아본다. LINGER 라는 구조체로 옵션을 설정한다. struct linger { u_short l_onoff; /* option on/off */ u_short l_linger; /* linger time */ }; l_onoff : 0보다 큰 수로 설정하면 기존 TCP의 4-way handshaking 정책에 따른 우아한 종료를 실행한다. l_linger : 우아한 종료가 끝날때까지 기다리는 시간을 의미한다. 소켓의 Close이후 소켓의 완전 종료 처리는 커널단에서 진행되며, 블로킹 소켓이라면 블락 상태에서 해당 시간동안 대기하고 논블로킹 소켓의 경우 해당 시간동안 E_WOULDBL..

[게임 서버 프로그래밍 교과서] IOCP 서버

논 블로킹 소켓의 장점 1. 블로킹이 없으므로 중도 취소가 가능하다. 2. 생성하는 스레드 개수가 적고 동시에 많은 소켓을 다룰 수 있다. 3. 연산량이 줄어들고 스레드 개수가 적어지므로 호출 스택 메모리도 낭비되지 않는다. 논 블로킹 소켓의 단점 1. 소켓 I/O 함수가 리턴한 코드가 WOULD_BLOCK인 경우 재시도 호출 낭비가 발생한다. 2. 소켓 I/O 함수를 호출할 때 입력하는 데이터 블록에 대한 복사 연산이 발생한다. 3. 재호출 API가 복잡할 수 있다. 구체적으로 1) 사용자 프로세스에서 소켓 버퍼로의 데이터 복사에 대한 비용과 2) send()와 같은 API 함수 호출 비용(송신 버퍼가 꽉 차있는 경우)이 문제가 될 수 있다. Overlapped I/O 혹은 비동기 I/O Overlap..

[게임 서버 프로그래밍 교과서] Poll을 이용한 논블로킹 서버

다수 클라이언트를 처리하는 논블로킹 소켓을 이용한 서버 예제 -- msdn 참고 POLL_FD 구조체 typedef struct pollfd { SOCKET fd; SHORT events; SHORT revents; } WSAPOLLFD, *PWSAPOLLFD, *LPWSAPOLLFD; fd에 소켓 핸들을 대입 events에는 관찰하고자 하는 I/O에 대한 Flag를 설정한다. revents는 해당 I/O 이벤트 발생시 해당 Flag가 설정되어 있다. Flag Description POLLPRI Priority data may be read without blocking. This flag is not supported by the Microsoft Winsock provider. POLLRDBAND P..

[게임 서버 프로그래밍 교과서] 블로킹 소켓 ManyClient - ManyServer 구조

에코 메세지를 송수신하는 예제 1. 서버는 메인 스레드와 자식 스레드 두 개를 가진다. - 메인 스레드는 에코 메세지를 송신한 이후 할 일이 끝난 RemoteClient 인스턴스를 제거한다. - 자식 스레드는 서버 소켓으로 부터 Accept될 때 마다 RemoteClient를 생성하고 클라이언트 소켓과 에코 메세지를 송신할 작업을 할당한다. 2. Remote Client의 Echo Thread Echo Thread에서는 Receive()를 통해 메세지를 수신하고 다시 메세지를 전송한다. (Echo) 소켓을 닫고 현 작업에 해당하는 RemoteClient를 제거할 준비를 한다. 메인 스레드의 세마포어에 이 사실을 알린다. 3. 에코 이후 Main Thread의 역할 에코 작업이 끝날 때마다 세마포어가 활성..