일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- c++
- mistel키보드
- 엣지컴퓨팅
- 스타트업
- 프라이빗클라우드
- raycasting
- 자료구조
- GraphQL
- 스플릿키보드
- psql extension
- 쿠버네티스
- 창업
- 42seoul
- 파이썬
- schema first
- adminbro
- 동료학습
- 어셈블리어
- 텍스트북
- uuid-ossp
- 이노베이션아카데미
- 부동소수점
- 도커
- 어셈블리
- 정렬
- 42서울
- SFINAE
- enable_if
- Cloud Spanner
- 레이캐스팅
- Today
- Total
목록Born 2 Code/C, C++ (16)
written by yechoi
각도 기반 레이케스팅에서 텍스쳐 올리는 법을 알아본다. 이 튜토리얼은 레이케스팅 엔진을 구현해, 이미 위 그림처럼 민무늬의 벽을 그릴 수 있다는 것을 가정한다. 아직 민무늬 벽을 그려보지 못했다면, pikuma의 raycasting 튜토리얼을 따라해보거나, 벡터를 이해할 수 있다면 lodev의 튜토리얼을 보길 권장한다(벡터로 레이케스팅을 구현할 것이라면 지금 이 문서는 보지 않아도 된다). 다시 본론으로 돌아와 각도 기반 레이케스팅 엔진을 구현했다면, 우리는 각 레이(광선)가 벽에 맞은 위치를 알아낼 수 있다. 텍스쳐가 있는 벽을 만들기 위해 중요한 것은 '레이가 맞은 벽의 좌표'를 '텍스쳐의 좌표'로 환산하는 것이다. 들어가기에 앞서 설명의 편의를 위해 다음과 같이 변수를 명명하겠다. 플레이어의 위치는..
데이터 레이스란? 데이터 레이스란 멀티 쓰레드/프로세스 환경에서 일어나는 오류다. 여러 쓰레드/프로세스가 공유자원에 동시에 접근하려 할 때, 일어나는 경쟁 상황을 일컫는다. 가령 한 쓰레드와 또 다른 쓰레드가 동시에 한 변수를 쓰려고 할 때, 한 쓰레드는 한 변수를 쓰고 있는데 다른 쓰레드는 그 변수를 읽으려고 할 때 등의 상황에서 데이터 레이스가 발생한다. 아래는 간단한 예시다. g_num = 0; void add(void) { g_num++; } 모든 쓰레드가 접근할 수 있는 g_num이 있고, add함수는 g_num을 1 증가시킨다. 서로 다른 두 쓰레드가 add 함수를 호출한다면 초기에 0이었던 g_num의 값은 어떻게 될까? printf(g_num); 우리가 예상하는 값은 한 쓰레드에서 +1 또..
선언 sem_t * sem_open( const char * sem_name, int oflags, ... ); 인자 sem_name 생성 또는 접근하고자 하는 세마포어의 이름 oflags 세마포어 생성시 플래그. 아래 두가지 조합으로 사용 가능: O_CREAT O_EXCL !! O_RDONLY, O_RDWR, O_WRONLY 플래그는 undefined behavior를 일으킴. QNX 라이브러리는 이러한 플래그를 무시하긴 하지만 이들은 코드의 휴대성을 저하함 mode_t mode 플래그를 O_CREAT로 설정하면, mode 인자를 받을 수 있음. 를 인클루드 하면 아래 상수들을 활용할 수 있다. S_IRWXR : 그룹 접근 S_IRWXO : 타인 접근 S_IRWXU : 개인 접근 unsigned int..
* 본 글은 아래의 문서를 정리했습니다. Standard C++ isocpp.org 먼저 알아둬야 할 사실은 다음과 같다. 템플릿은 클래스도 함수도 아니다. 클래스, 함수 패밀리를 생성하기 위해 컴파일러가 사용하는 "패턴"이다. 컴파일러가 코드를 생성하기 위해선, 컴파일러는 템플릿의 선언뿐만 아니라 정의를 볼 수 있어야 하며 템플릿을 구성하는 타입 등을 알 수 있어야 한다. 예를 들어 Foo를 사용하려고 한다면, 컴파일러는 Foo 템플릿 뿐만 아니라 당신이 Foo를 만들려고 한다는 사실 또한 알아야 한다. 컴파일러는 cpp 파일을 컴파일 하는 동안 각각의 cpp 파일의 내용을 기억하고 있지 않는다. 이러한 방식의 컴파일을 "separate compilation model"이라고 부른다. 이러한 사실을 바..
C++ 시작하는 친구가 문득 std::endl이랑 '\n'이랑 뭐가 다르냐고 물었다. 이전에 훑어보기론 std::endl은 출력버퍼를 비우고 \n은 그렇지 않다고 봐, 이렇게 설명을 해줬다. 그랬더니 버퍼가 뭐냐, 버퍼를 비운다는 게 뭐냐, 출력버퍼를 왜 비우냐 묻는다. 정확히 이유를 알진 않고 관습적으로 사용하던 중이었는데, 막상 질문을 받으니까 너무나 궁금해지는 것,,, 이 참에 찾아보는 std::endl과 \n의 다른 점! 버퍼란 무엇이냐는 물음부터 시작한다. 버퍼란 버퍼는 임시 메모리 공간이다. 입력이나 출력을 바로바로 전달하는 게 아니라, 버퍼에 담아둘 수 있다. 버퍼를 사용하면서 얻을 수 있는 장점은 문자를 한번에 전달하므로 전송시간이 적게 걸림 문자를 잘못 입력했으면 수정 가능 시스템콜을 적..