GameForFun

블로그 이미지
by PforPepsi

TAG CLOUD

  • Total hit
  • Today hit
  • Yesterday hit

텍스쳐 = 게임에서 사용되는 이미지 ... 글을 쓰다가 텍스쳐/이미지를 혼합해서 쓸것 같으니 햇갈리지 마요.

게임을 만들다보면(물론 내가 많이 만들지는 않았지만) 가중 중요한 것들 중에 하나가 게임에서 사용되는 텍스쳐들을 관리하는 것도 포함이 된다. 

뭐 엔진을 써서 게임을 편히 만들면 모르겠는데... 일단 DX, OPENGL과 같은 것들을 쓴다면, 유저는 이러한 텍스쳐들을 관리해줘야 된다.

텍스쳐를 관리한다는 것은, 뭐 이미지들을 폴더에 넣어서 관리한다는 의미가 아니라, 프로그래밍 할떄, 어느 텍스쳐를 메모리에 올려 둘 것인가? 등의 관리를 말하는 것이다.

간단한 게임

아주 간단한 게임을 짠다면 솔직히 위에 텍스쳐 관리에 대해 신경 쓸 필요는 없다. 그냥 모든 텍스쳐를 메모리에 올려놓고, 내가 필요한 텍스쳐와 String을 Map으로 관리하여, 필요한 것을 불러오면 될테니까.

나같은 경우는 TextureLibrary라는 static한 class를 하나 만들어서, 모든 텍스쳐를 넣어서 관리하곤 했다.

그러나 게임의 스케일이 커지다보면, 텍스쳐가 수백개, 수천개(? 오반가?) 필요할지도 모른다. 이런 경우까지 간다면 텍스쳐를 모두 메모리에 올려놓아 사용하는것은 불가능하게 된다. 
텍스쳐만 로딩하다 게임이 죽어버리게 되는 경우를 부딪히게 되겠지...

규모가 큰 게임

이를 해결하는 방법이 텍스쳐를 동적으로 메모리에 할당/해제 하는 것이다. 그럼 무엇을 기준으로 텍스쳐를 동적으로 할당/해제를 할까? 그냥 멋모르고 계속 할당/해제하면 게임이 뚝뚝 끊긴다!!!!! 텍스쳐 3개만 로딩하려해도 끊길껄?

OS에서의 프로세스 관리

OS에서 프로세스를 관리하는 것처럼 구현을 할까?
OS에서는 프로그램들을 여러가지 방법으로 관리를한다. 우선순위, 실행 빈도 등등 여러 데이터를 근거로 프로그램들을 관리하는데, 텍스처들도 간단히 말하자면 이런 방법으로 관리가 가능하다.

이미지의 구분

먼저, 텍스쳐의 용도를 크게 2가지로 나눠보자.
1. 특정 상황에서만 필요한 텍스쳐
2. 항상 필요한 텍스쳐

음... 아무래도 텍스쳐 관리 얘기다 보니까 던파를 예로 드는 것이 적절할 것 같다.
던파를 위의 2가지 기준으로 나눠 얘기해보자. (물론 내가 던파를 구현 안해서 밑은 어디까지나 그냥 분석)

1. 특정 상황에서만 필요한 이미지
-> 마을 배경, 캐릭터가 싸우는 모습의 텍스쳐들(왜냐하면 마을에서는 돌아다니기만 하니까 걷는 애니메이션만 필요하거덩).
마을배경 - 마을은 마을마다 다르다. 게임을 하면서 맵을 이동할 때마다  잠깐의 로딩시간이 존재하는 것을 볼 수 있을텐데, 이 떄 새로운 뒷 배경 텍스쳐를 로딩한다고 보면 된다.
캐릭터 텍스쳐 - 여기서 말하는 이미지들은 싸울때 사용하는 이미지들을 뜻한다. 던파가 마을에서는 안싸운다.(물론 결투 제외) 따라서, 쓸데없이 싸우는 모션들을 메모리에 할당해놔서 게임의 성능을 떨어뜨릴 필요는 없다. 

2. 항상 필요한 이미지
-> 캐릭터의 hp바, 경험치바, (esc를 눌렀을때)옵션 바 등등.
위의 것들은 모두 동감하겠찌...
esc 옵션 - 이것은 메모리에 항상 할당 해 놓는것이 좋다고 생각한다. 왜냐하면 esc를 눌렀는데 게임이 끊기면 짜증날테니까.


여튼! 위에서 언급한것들은 모두 항상 필요한 것, 혹은 사용자가 입력했을때 즉각적으로 나타나야할 것들을 언급한 것이다.

그렇다면, 맵에 랜덤으로 발생하는 이벤트와 같은 것들은 어떨까?

3. 랜덤으로 발생하는 이벤트
던파에 이런게 있는지는 모르겠지만, 뭐 배경에(게임 플레이와 아무 상관 없는) 갑자기 별들이 쏟아지는 이벤트가 발생한다고 치자. 
저 10분에 1번 일어 날까 말까한 이벤트를 위해서 80개나 되는 이미지를 메모리에 업로드 시켜놓는다면 이는 정말 막대한 낭비가 될것이다.
그렇다고 별들이 쏟아지는 이벤트가 발생했을때 바로 메모리를 업로드 할것인가?!!


틀린 얘기는 아니지만, Single Thread를 쓴다면 틀린얘기다. Single Thread로 80개의 텍스쳐를 메모리에 업로드하기 위해서는 1초의 시간이 소요될수도 있다. 그러면 플레이어는 영문도 모르고 1초동안 게임화면을 멍하니 바라봐야되잖는가...

따라서 사용해야 할것이, Multi Threading 기법이다. 실제 게임은 계속 돌아가고, 이벤트가 발생 신호-> 다른 Thread에서 이미지 업로드 -> 이미지 업로드 되면 이벤트 실행.  이러한 구조로 짜면, 플레이어는 지속적으로 게임 플레이가 가능하고, 우리는 쓸데없는 메모리 낭비를 없애는 WIN_WIN이 형성될 것이다.
 

 






'프로그래밍' 카테고리의 다른 글

RTTI에 대한 글.  (1) 2012.07.20
DX 우리에게 그려지기까지...  (1) 2012.07.05
그래픽스 몇가지 적어놓을 것들.  (0) 2012.07.05
쉐이딩.  (0) 2012.07.05
DX 텍스쳐 관리2.  (0) 2012.04.17
AND

ARTICLE CATEGORY

목록들 (118)
[Unity3D] (39)
그래픽관련 (13)
잉여잉여 (25)
프로그래밍 (27)
노래♬ (3)
Game_Design(기획) (3)

RECENT ARTICLE

RECENT COMMENT

RECENT TRACKBACK

CALENDAR

«   2025/02   »
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

ARCHIVE