개요C 또는 C++언어에서 함수의 매개변수를 가변적으로 전달하고자 하는 경우가 있다.그 경우의 수가 많지 않거나 가변적이지 않을 때는 함수 오버로딩으로 작성하여 해결할 수 있다. 함수의 매개변수로 int변수를 2~4개 받아야할 경우 void PrintInt(int a, int b); void PrintInt(int a, int b, int c); void PrintInt(int a, int b, int c, int d); 하지만 printf 또는 scanf 같은 함수처럼 몇개의 매개변수를 넘길지 그 경우가 가변적일 경우 가변인자를 사용한다. 가변인자가변인자는 ...으로 받을 수 있으며, ...에 전달된 매개변수들은 va_list로 저장되어 있고, va_list포인터로 접근할 수 있다. 함수로 전달되는 매..
namespace를 대충 알긴 하지만 한번도 제대로 써본 적이 없었다.실제 프로젝트에서도 사용할 수 있도록 namespace에 대해 더 알아보자. namespace 분할 컴파일namespace를 헤더에 정의해두고 전체 프로젝트에서 접근할 수 있도록 하려고 하니 header를 여러군데에서 include 했을 때 중복 정의되어 링크에러가 발생했다. 클래스가 선언과 정의를 분리하는 것처럼 namespace도 분리하여 구성하고 변수를 extern으로 설정하여 전역변수화 시키는 것으로 해결했다. // name2.hnamespace Name2{extern int a;void func();} // name2.cpp#include "name2.h" int Name2::a = 0; void Name2::func(){//..
게임 개발을 하다 보면 총알이나 파티클 등을 구현하기 위해 list 구조를 사용할 때가 있는데총알이나 파티클은 개수가 동적이기 때문에 메모리를 동적할당하여 구현한다. bullet을 구현한다고 할 때 아래처럼 구현할 수 있다. std::list _bullets; // 총알이 발사될 때 마다Bullet* bullet = new Bullet();_bullets.push_back(bullet); 나중에 필요에 의해 bullet을 삭제해야 한다면 그냥 erase()를 사용해서 삭제하면 메모리 누수가 일어난다.erase()는 동적할당한 메모리를 지우는 것이 아니라 해당 노드를 지우는 것이기 때문에 노드가 가리키는 메모리를 해제시키지 않는다. 따라서 아래처럼 삭제해야 한다. // 특정 노드를 삭제해야 한다면void ..
네트워크 게임에서 서로간의 이동을 동기화 하기 위해 여러 방법이 사용될 수 있다.기본적으로, 이동처리를 하기 위해 매 프레임 마다 이벤트와 상태를 전송하는 방법이 있다.이론적으로 가장 정확한 동기화를 할 수 있는 방법 같지만 클라이언트가 늘어날 수록 전송하는 횟수가 기하급수적으로 늘어나게 되어 비효율적이다. 키보드를 누르고 있는 동안 움직이는 캐릭터가 있다고 할 때 게임이 60프레임이라면 초당 60번 키가 눌리고 있다는 패킷을 전송한다.cs로 구성된 게임에서 이 패킷은 (n=클라이언트 수)번 전송된다.이렇게 많은 패킷을 서버에서 처리하기엔 부하가 너무 크다.부하를 줄이기 위해 논리적으로 패킷의 전송 횟수를 줄이는 기법이 Dead Reckoning 이다. Dead Reckoning이벤트가 발생할 때 마다 ..
운동방정식의 적분실제 시뮬레이션 되는 운동방정식은 정확한 정북인 힘들기 때문에 근사치를 구하는 수치적분을 이용한다. 수치적분무한히 작은 변화량에 대해 적분하는 것이 아닌 이산적인(discrete)변화량에 대해 적분한느 것.결과독 이산적이 되므로 결과는 근사값이 된다. 예를 들어를 보자일반적인 정적분으로 위 식을 적분한다면 dv는 뭏나히 작은 속도변화, dt는 무한히 작은 시간변화량 이지만 수치적분을 할 때는 이산적인 시간증가값 dt, 이산적인 속도변화값 dv를 사용한다. 오일러 기법 어떤 함수를 근사하는 방법중 하나로 테일러 급수(Tayler series)가 있다.오일러 기법은 테일러 급수에서 1차 미분에 해당하는 항들만 사용하는 기법이다.나머지 항들은 고차항(higher-order term) 또는 절단..
프로그램이 수행해야 할 일서버클라이언트로부터 메세지를 수신해서 다른 클라이언트들에게 뿌려주는 단순한 echo 기능을 수행한다.클라이언트콘솔 화면에서 메세지를 입력받아서 서버로 송신하며, 동시에 서버에서 수신받은 메세지를 화면에 출력한다. 서버리눅스에도 있는 select를 사용해서 각 소켓의 메세지를 수신하고 송신할 수 있지만 winsock에서는 더 사용하기 편하고 강력한 기능을 제공하는 WSAEventSelect를 사용하기로 한다. 클라이언트서버에서 WSAEventSelect를 사용하여 멀티플렉싱을 구현하였기 때문에 클라이언트에서도 해당 함수를 사용해서 stdin과 소켓의 멀티플렉싱을 구현하려 했으나 windows는 socket과 file을 다르게 관리하기 때문에 위 함수를 사용할 수 없었다.아래는 멀티..
소켓 통신에 대해 공부를 하고 windows환경에서 개발을 하려고 보니 리눅스 소켓과 윈도우 소켓은 많이 다르다는 것을 알게 되었다.그중 하나가 리눅스에서 멀티플렉싱(Multiplexing)을 위해 사용하던 select를 윈도우에서 그대로 사용할 수 없다는 것이다. Multiplexing하나의 프로세스가 하나의 전송로를 사용해서 여러 사용자들과 통신하여 효율성을 높이는 기술 리눅스에서는 멀티플렉싱을 구현하기 위해 select 함수를 사용하였다. int select(int nfds, // 최대 소켓 번호+1fd_set* read_fds, // 읽기를 감지할 fdsfd_set* write_fds, // 쓰기를 감지할 fdsfd_set* error_fds, // 예외를 감지할 fdsstruct timeval*..
- Total
- Today
- Yesterday
- 국내여행
- 데이터베이스
- JSP
- OS
- DesignPattern
- mongoDB
- SOCKET
- Java
- swift
- rxswift
- SHADER
- ue4
- Git
- Spring
- scala
- game
- 알고리즘
- database
- winsock
- ios
- SwiftUI
- 자료구조
- Cocos2d-x
- C/C++
- machine learing
- C
- C++
- 운영체제
- 드라마
- 수학
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |