| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 다이나믹 프로그래밍
- 다이나믹프로그래밍
- 파일시스템 구현
- DirectX 12
- 렌더링 파이프라인
- 컨디션 변수
- OS
- codility
- 영속성
- 쓰레드
- 알고리즘
- 멀티쓰레드
- 동적계획법
- Direct12
- 그리디 알고리즘
- 그리디알고리즘
- 스케줄링
- 프로그래머스
- 병행성 관련 오류
- directx
- 타입 객체
- 멀티프로세서
- 운영체제
- 디자인패턴
- 락
- 백준
- DirectX12
- 병행성
- I/O장치
- 자료구조
- Today
- Total
목록전체 글 (499)
기록공간
기능 수준이라는 개념은 Direct3D 11에서 도입된 것으로, 코드에서는 D3D_FEATURE_LEVEL이라는 enum형으로 대표된다. 기능 수준들은 대략 버전 9에서 11까지의 여러 Direct3D 버전들에 대응된다. 기능 수준들은 GPU가 지원하는 기능들의 엄격한 집합을 정의한다(각 기능들이 지원하는 구체적인 내용은 SDK를 참고). 예를들어 기능 수준 11을 지원하는 GPU는 반드시 Direct3D 11의 기능 집합 전체를 지원해야 한다. 이러한 기능 수준은 응용 프로그램 개발을 편하게 해주는 요인이다. 현재 GPU의 기능 수준을 파악하기만 하면, 구체적으로 어떤 기능을 사용할 수 있는지를 확실히 알 수 있기 때문이다. 사용자의 하드웨어가 특정 기능 수준을 지원하지 않는 경우 응용 프로그램이 실행..
모니터의 픽셀들이 무한히 작지는 않기 때문에, 모니터 화면에 선을 완벽하게 나타내는 것은 불가능하다. 모니터에 선을 출력했을때 흔히 나타나는 현상이 있는데 이것을 '계단 현상' 또는 앨리어싱(Aliasing) 효과라고 부른다. 삼각형 변에서도 이와 비슷한 효과가 나타난다. 모니터의 해상도를 키운다면 이런 현상이 줄어들긴 하겠지만 완벽하게 없애기란 불가능하다. 그래서 이를 해결하기 위한 여러 기법이 있다. 이를 보통은 계단 현상을 제고 한다고 하여 '안티 앨리어싱(Antialiasing)' 이라고 부른다. 한번 알아 보도록 하겠다. 우선 첫번째 기법은 슈퍼샘플링(초과표본화)(Supersampling)이라는 기법이다. 우선 그릴 후면 버퍼를 화면 해상도의 4배 (가로, 세로로 2배씩)로 잡고, 장면을 후면 ..
설계 목표 가장 기본적인 설계 목표는 시스템을 편리하고 사용하기 쉽게 만드는 데 필요한 것들을 추상화시키는 것이다. 추상화는 컴퓨터 과학 모든 것의 근간이라고 할 수 있다. 추상화를 통해서 큰 프로그램을 쉬운 작은 부분들로 나누어 구현할 수 있다. 추상화는 어셈블리 코드를 몰라도 C언어와 같은 고수준 언어로 프로그램을 작성하는 것이 가능하게 해 주고, 더 나아가서 논리 게이트를 몰라도 어셈블리 코드를 작성할 수 있게 해 주며, 더더욱 나아가서는 트랜지스터에 대한 지식이 없어도 게이트를 이용하여 프로세서를 만들 수 있게 한다. 이렇게 운영체제는 추상화를 이용하여 사용자가 시스템을 쉽게 사용할 수 있도록 해준다. 기본적인 목표는 아니지만 운영체제를 설계하는데 가장 중요한 목표는 성능이다. 다른 말로는 오버헤..
RAM 같은 메모리는 휘발성(Volatile)이기 때문에 컴퓨터의 전원이 꺼지면 메모리에 있는 데이터를 모두 잃는다. 즉, 데이터가 영구적이지 않다. 그래서 컴퓨터에는 전원이 꺼지더라도 데이터가 보존되는 영구적인 데이터를 저장할 수 있는 하드웨어와 소프트웨어가 필요하다. 이런 것을 가능하게 해주는 하드웨어는 하드디스크나 SSD 같은 비휘발성 I/O(Input Output) 장치이고, 소프트웨어는 사용자가 생성한 파일들을 관리하는 파일 시스템(File System)이다. 파일 시스템의 모든 작업은 운영체제가 한다. "Hello World!"를 파일에 저장해보자. #include using namespace std; int main() { char mess[] = "Hello World!"; ofstream..
운영체제는 여러 가지 일을 동시에 수행하고 있다. 프로세스를 하나 실행하고, 다음 프로세스를 실행하고, 또 다음 프로세스를 실행하고... 이 동작을 반복한다. 마치 곡예사가 여러 물건을 저글링 하는 것처럼 말이다. 병행성 문제 현대의 멀티스레드 프로그램은 병행성 문제를 추가로 갖고 있다. 다음 코드를 한번 보자. #include #include using namespace std; volatile int counter = 0; int loops; // 카운터를 증가 시키는 작업을 하는 함수 void worker() { for(int i = 0; i < loops; ++i) ++counter; } int main() { // 두개의 스레드를 만든다. thread p1, p2; cout
Ctrl + Alt + Del를 눌러 작업 관리자를 실행해보자. 그러면 많은 프로그램이 실행되고 있을 것이다. CPU는 하나이기 때문에 여러 프로그램에 대한 연산 처리는 불가능하다. 결국 어떤 프로그램을 실행시키기 위해서는 전에 실행되고 있던 프로그램에서 CPU를 양보해야 한다. 그럼 이러한 작업은 어떻게 가능한 것일까? 여러 프로그램을 실행 시키기위해 컴퓨터에는 마치 수십 개의 CPU가 존재하는것 처럼 보이게 한다. 이것이 바로 CPU 가상화이다. CPU 가상화는 가상의 CPU가 여러 개 있는것과 같은 효과를 낸다. 즉, CPU를 무한한 개수의 CPU로 증식시킬 수 있다는 것이다. 프로그램을 실행하고, 멈추고, 어떤 프로그램을 실행시킬 것인가를 운영체제에게 알려주기 위해서는 원하는 바를 운영체제에게 전..
운영체제(Operating System)를 들어가기 전에 왜 필요한지에 대해서 알아야 할 것이다. 운영체제를 알아햐 하는 이유 바로 좋은 프로그래머가 되기 위해서이다. 좋은 프로그래머는 자기가 만든 프로그램이 컴퓨터에서 어떻게 수행되는지를 아는 것이다. 그러면 궁금증이 생길 것이다. "그냥 구현만 잘하면 되지 그딴 것을 왜 알아야 하는가?"라고 말이다. 왜 알아야 하는지에 대해서는 두 가지로 설명할 수 있다. 첫 번째로 속도가 느리거나, 이상한 버그가 발생했을 때 대처가 가능하다. 보통 개발 상황에서는 느끼기 힘들 수도 있지만, 시스템 콜이 많이 발생하는 프로그램을 개발한다고 했을 때에는 확실히 운영체제가 도움이 될 수 있다. 시스템 콜은 운영체제에서 담당하기 때문이다. 나는 네트워크 프로그래밍을 할 때..
"객체 사이에 일 대 다의 의존 관계를 정의해두어, 어떤 객체의 상태가 변할 때 그 객체의 의존성을 가진 다른 객체들이 그 변화를 통지 받고 자동으로 업데이트될 수 있습니다." (GoF 디자인패턴 382p) 관찰자 패턴은 가장 널리 사용되고 있고 흔하게 볼 수 있다. 그래서 자바에서는 핵심 라이브러리(java.util.Observer)에 들어가 있고, C#에서는 event 키워드로 지원한다. 게임 개발 입장에서 관찰자 패턴을 어떻게 써먹을 수 있을지 우선 예를 한번 들어보자. 업적 달성 업적 시스템은 요즘 중요하기도 할 뿐더러 최근에 많은 게임에서 쓰이고 있다. 업적 시스템을 추가한다고 해보자. 게임에서 업적은 종류가 정말 광범위하고 달성 방법도 다양하기 때문에 깔끔하게 구현하기가 정말 어렵다. 조금만 ..