검색결과 리스트
Game Programming에 해당되는 글 19건
- 2008.03.11 [펌]프로세스 메모리 구조
- 2008.03.08 크레이지 범프
- 2008.03.08 Doom3 엔진의 Texturing
글
[펌]프로세스 메모리 구조
프로세스에 대한 이해는 프로그래밍의 핵심이라고 할 수 있다. 프로세스는 간단하게 '수행중인 프로그램'이라고 정의할 수 있다(참고로 프로그램은 수행 가능한 디스크상의 이미지라고 정의할 수 있다). 다시 말해, 프로세스는 디스크에 저장돼 있던 실행 가능한 프로그램이 메모리에 적재돼 운영체제의 제어를 받는 상태를 말한다.
프로그램을 작성해 컴파일하고 링크하면 실행 가능한 파일이 생성된다(윈도우라면 *.exe라는 파일이, 유닉스라면 기본적으로 a.out이라는 파일이 생성된다). 쉘을 통해 사용자가 프로그램을 수행시키면, 커널은 이 프로그램을 제어에 적합한 자료구조로 만들어 메모리로 읽어낸 후, 커널의 프로세스 테이블에 등록하고, 메모리, 파일, 입출력 장치 같은 자원을 할당하는데, 이때부터 프로그램은 커널의 한 프로세스로서 실행 상태가 된다.
프로세스는 Win32의 경우에 CreateProcess(), 유닉스의 경우에는 fork() 시스템 콜을 사용해 새로운 프로세스를 생성하고, 프로세스간에는 다양한 IPC(Inter-Process Communication) 방법을 통해 데이터를 교환하거나 프로세스간의 동기화를 수행한다.
<그림 1>은 프로그램이 메모리에 적재된 모습을 나타낸다. 이 구조는 유닉스와 윈도우가 크게 다르지 않다 (JVM에서 돌아가는 자바 프로그램도 비슷한 구조를 갖는다). 그림에서 위쪽이 낮은 주소번지가 된다. 그림에서 보이는 네 개의 범위(텍스트, 데이터, 힙, 스택)를 각각 세그먼트라고 한다.각 세그먼트에 대해 좀더 자세하게 알아보자(여기서는 유닉스와 C를 기준으로 서술하지만, 윈도우에서도 공통적인 특성을 갖는다).
◆ 텍스트 : 프로그램의 실행 코드인 기계어 코드와 읽기 전용 데이터 등을 가진다(CPU가 읽어들여 수행한다고 해서 텍스트라고 부르며, 코드 영역이라고도 한다).
◆ 데이터 : C언어에서 전역 변수, 정적 변수 등으로 선언된 변수 영역(읽기/쓰기 가능)
◆ 힙 : 프로그램 수행 중 malloc(), free() 등의 시스템 콜로 할당되고, 해지되는 메모리 영역
◆ 스택 : C언어의 함수 호출시 지역 변수와 인수, 함수의 수행이 끝났을 때 리턴할 주소(return address)를 푸시한다(함수가 끝나면 이 값을 팝하고 리턴하게 된다).
운영체제는 프로그램의 텍스트 부분에 메모리를 읽기 전용으로만 사용하고, 프로세스간에는 메모리 영역을 침범하지 못하도록 한다. 따라서, 프로그램의 텍스트로 되어 있는 메모리 영역을 침범해 기록하면 버스 에러나 세그먼트 결함이 일어나서 프로그램이 종료된다. 여러분은 윈도우에서 '잘못된 연산을 수행해 프로그램을 종료합니다'란 메시지를 본적이 있을 것이다. 이 에러(잘못된 연산)의 95% 이상이 바로 앞서 이런 연유에서 발생한다.
C/C++와 같이 포인터(주소를 갖는 변수)를 사용해 메모리를 직접 액세스하는 언어로 개발할 때도 흔히 이와 같은 에러가 발생한다. 따라서 프로그램을 개발할 때 가장 중요한 점이 바로 메모리 관리다. 프로그램 오류의 80% 이상을 차지하는 이유를 살펴보면 다음과 같다.
◆ 초기화
◆ 해지
자바는 가비지 컬렉션을 통해 사용하지 않는 메모리를 자동으로 해지하지만, 필요에 따라 명시해 주는 것이 좋다. C/C++에서는 쓰지 않는 메모리에 대해 반드시 명시적으로 delete를 써줘야 한다.
C/C++는 할당된 메모리에 대한 포인터를 잃어버리는 경우가 생기는데, 이를 메모리 누수라고 한다.
메모리 누수는 프로그래머를 괴롭히는 가장 큰 골칫거리 중 하나다. 꼼꼼히 확인하는 습관을 들이는 것이 좋다.
멀티로 시작하는 단어의 사용
멀티 프로그래밍, 멀티 프로세싱, 멀티 태스킹, 멀티 쓰레드, 멀티 유저는 비슷비슷한 용어이기 때문에 혼돈해 사용하지만 의미가 모두 다르다.
◆ 멀티 프로그래밍 : 여러 프로그램이 메모리에 적재돼 수행되는 것. 하나의 프로그램이 수행되다가 입출력을 하면 CPU는 다른 프로그램으로 제어권을 넘긴다. 즉, 프로그램의 입출력을 기준으로 프로그램 수행의 스위칭이 일어난다(요즘은 좀처럼 쓰이지 않는 말이다).
◆ 멀티 프로세싱 : 다수의 프로세서가 작업을 처리하는 것. 운영체제가 멀티 프로세싱을 지원한다는 것은 다수의 CPU를 지원할 수 있다는 뜻이다. 여러 CPU가 운영체제와 메모리를 공유해 프로그램을 수행하는 방식을 SMP(대칭형 멀티 프로세싱)라고 한다(윈도우 NT가 이런 방식이다).
◆ 멀티 태스킹(시분할 시스템) : 태스크(Task, 운영체제가 수행하는 기본 단위)가 여럿인 것. 운영체제가 강제로 CPU 시간을 프로세스에 할당한다.
◆ 멀티 유저 : 멀티 유저는 기본적으로 멀티 태스킹이 되는 시스템에 다중 사용자 파일 시스템 등 다중 사용자를 지원하기 위한 기능을 추가한 것이다.
◆ 멀티 쓰레드 : 하나의 프로세스 내에 여러 개의 수행경로가 존재하고, 이를 동시에 수행하는 것. 하나의 프로세스가 동시에 두 가지 이상의 작업을 수행하는데 활용된다(쉽게 말해 프로세스 내에서 멀티 태스킹을 하는 것이라고 볼 수 있다).
여기서 멀티 쓰레드에 대해 좀더 구체적으로 알아보자. 쓰레드는 '수행 경로'라고 정의할 수 있다.
CPU가 텍스트(코드)를 읽어 수행할 때 수행되는 절차를 하나의 수행 경로라고 한다. 멀티 쓰레드란 결국 이런 수행 경로가 여러 개 있다는 뜻이다. 멀티 쓰레드도 멀티 태스킹과 마찬가지로 기본적으로 여러 쓰레드를 번갈아 수행한다. 텍스트, 데이터, 힙, 스택의 각 세그먼트에 대한 주소를 CPU 레지스터에 담고 있는데, 이 레지스터의 내용을 바꿔(컨텍스트 스위칭) 다른 쓰레드를 수행하도록 한다. 쓰레드 간에 프로세스가 갖고 있는 메모리와 코드 영역을 공유하므로, 컨텍스트 스위칭할 때 레지스터의 내용을 조금만 바꿔도 멀티 태스킹에 비해 컨텍스트 스위칭 하는 속도가 빠르다.
멀티 태스킹이나 멀티 쓰레드는 두 개 이상의 작업이 동시에 수행되므로, 동시에 수행되는 작업에 대해 동기화가 필연적으로 필요하다.
자바는 언어 차원에서 동기화를 지원한다. synchronized 키워드를 이용해 손쉽게 동기화를 구현할 수 있지만, 꼭 필요할 때만 사용하는 것이 좋다. synchronized를 사용한 것이 사용하지 않은 코드에 비해 약 3∼4배정도 느려지기 때문이다. 대부분의 유닉스와 윈도우는 운영체제 차원에서 Event, Critical Section, Mutex, Semaphore 등의 동기화 메커니즘을 제공한다.
출처 : http://makebob.tistory.com/entry/프로세스의-메모리-구조
글
크레이지 범프
크레이지 범프라는 프로그램인데 결과물 비교 스크린샷을 보면
글
Doom3 엔진의 Texturing
출처 : http://www.modwiki.net/wiki/Texturing
* Diffuse maps
둠3에서 diffuse maps은 diffuse relection and color of a surface를 표현했다.
그것들은 색깔과 뒷면에 반사된 intensity of light를 정의한다.
diffuse maps을 만드는 목적은 색깔 맵과 어두운 영역(빛을 흡수하는)을 그리는 데 있다.
예를 들어, 벽돌 벽의 갈라진 부분은 더 많은 빛을 흡수한다.
그 예제는 증명한다 벽돌들 자신은 거의 갈라진 금 사이에 그들을 거의 검은색으로
반사광 표면이 없는 같은 intensity의 그것들은 받아 들입니다. ???
그것들은 당신의 diffuse maps을 적절하게 어둡게 하는 좋은 생각이다
diffuse mpas는 material shaders에 추가 되었다.
* Bump maps
bump mapping은 깊이 착각 그리고 이미지 텍스처를 추가한다.
그것은 실제 도형을 바꾸지 않는다 하지만 표면 전면에 어느정도 영향을 준다.
Doom3 엔진에는 두가지 다른 종류 bump maps 가 사용되고 있다 : Normal and height maps
- Normal maps
normal maps은 기울기 또는 표면의 법선을 정의한다.
다른 의미로, 그것들은 표면을 facing 되도록 변경한다.
각 픽셀의 normal 은 R,G,B 채널에 특수한 X,Y,Z 변환 데이터를 저장하는 것으로 정의된다.
normal maps 를 생성하기 위한 두가지 메소드 이다.
1. 3d geometry로부터 normal map을 표현한다.
2. height map을 normal map으로 변환한다.
- height maps
height maps 은 표면의 각 픽셀의 높이를 정의하는 grayscale 이미지이다.
그것들은 텍스처의 visual depth를 조정한다.
각 픽셀의 높이는 이미지의 밝기로 정의된다.
white 픽셀 high 이고 black 픽샐이 low 이다.
gray 레벨은 다른 높이를 표현한다.
heightmap은 보통 이미지 조정 프로그램 안에서 칠해졌다
그것들은 대게 표현할 필요가 없다
heightmap은 둠3 엔진(로드)에 의해서 normalmap으로 변환되어 버린다.
heightmap 사용은 단지 쉬운 작업 흐름을 위한 허용이다.
- normal maps vs height maps
둠3 엔진은 normal map 과 height map을 하나의 bump map으로 결합시킬 수 있다.
대게 이것은 같은 detail 나타내는 normal map을 만들때보다
height map의 details을 더 실제적으로 그릴 때 처리되었다.
normal 그리고 height 맵은 Addnormals 함수를 사용하므로써 material 안에 결합되어질수 있다.
height maps은 둠3 엔진 기반 게임의 표면을 시각적으로 바꾸어 놓지 않는다해도 기록 되어져야만 한다.
그것들은 단지 동적 라이팅 사용을위해 표면 normals를 계산한다는 의미이다.
이것의 의미는 본질적으로, height map은 normal map으로 변환되었다는 것이다.
그리고 높이를 가진 dealing은 이웃한 각 픽셀 값을 비교할 때 slope를 계산하기 위한 하나의 방법이기 때문에,
height map은 절대 같은 해상도의 nomal map으로 세분화 되어질 수 없다.
이 주장을 뒷받침하기 위한 다른 증거는
height map은 단지 black이나 white인 RGB컬러 공간에서 저장된 height map이므로
컬러 채널의 사용을 효율적으로 만들지 않는다라는 것이다.
각 컬러채널의 그 데이터는 중복되기 때문에, 당신은 단지 256레벨로 제한된다.
각 채널이 유일한 normal map 과 그것이 더 본질적인 slop를 정의하는 명확한 normal map에서 비교해 보라.
* Specular maps
둠3의 Specular maps은 표면의 specular intensity 그리고 color of highlight를 표현한다.
또한 그들은 "shinyness"와 specular 그림자의 컬러를 정의한다.
가장 밝은 specular 맵은 최종 재질을 더 밝게한다.
specular map 생성은 이미지를 표면의 일반적인 specularity와 기상로 발생되는 더 어두운 영역을 표현하는 solid 값으로 채우기 위함이다.
그것들의 갈라진 금은 specularity가 거의 없다는 것을 기록하라.
컬러는 highlight의 specular map 음영색을 적용받는다.
벽돌들은 얇고 변덕스러운 음영을 반사하는 재질의 모래의 돋음이 만들어진다.
이것은 아주 좋은 예제이다.
학회에서는 텍스처 파일이름 끝에 "_s"를 붙이는 것을 권고하고 있다.
Bump map은 specual map을 위한 좋은 시작점으로 수정될수 있다.