문서의 이전 판입니다!
스타팅 파일
- 스프라이트로 애니메이션 구현하기에서 이어지는 강의이다.
- 굳이 윗 강의에서 이어질 필요는 없고 기존에 있던 파이프 장애물 로딩을 최적화할 것이므로 기존과 동일한 키보드로 메인메뉴 조작하기 프로젝트 파일을 사용한다.
문제점
기존의 프로젝트를 실행해서 터미널에 쏟아지는 문구를 보면, pipe그림 파일을 끊임 없이 로딩하고, 다시 언로딩하는 작업이 이루어지는 것을 볼 수 있다.
이는 Obstacle 클래스를 따로 만든 다음에 그 안에서 이니셜라이징을 하고, 또 장애물이 화면 바깥으로 빠지면 파이프 그림 에셋을 그래픽램에서 제거하게 만들었기 때문이다.
그런데 이렇게 하면 당연히 속도가 느려질 수 밖에 없다. 쓸데 없이 리소스를 계속 그래픽램에 올렸다가 내렸다가 해야 하기 때문이다.
아무래도 보조저장장치인 하드디스크에서 다시 램에 파일을 올리려면은 그만큼 속도를 희생시킬 수 밖에 없다.
전에 스프라이트 이미지로 애니메이션을 구하는 아이디어에서도 볼 수 있듯이, 일단 리소스 그 자체는 램에 올려놓은 후 그 리소스를 계속 돌려쓰기 하는게 훨씬 속도가 빠르다.
우리가 사용하는 장애물 파이프는 모두 똑같은 이미지를 이용한다. 이 이미지의 특정 부분만 가져다 쓰는 것이다. 따라서 스프라이트 이미지에서 특정 부분을 가져오는 것과 기본 개념은 동일하다. 그렇다면 한개의 에셋을 가지고 여러번 돌려쓰려면 어떠게 해야 할까?
우리는 그 에셋의 주소를 가져 온 다음에 그 주소를 가리키면 될 것이다. 굳이 엣세의 '값'을 가져올 필요가 없는 것이다.
에셋을 로딩하기
1. game.h
Obstacle클래스에서 쓸 에셋을 미리 로딩해야 한다.
여러 방법이 있곘지만, 일단은 가장 직관적으로 생각할 수 있는 것은 게임 클래스에서 처음부터 에셋을 로딩하는 것이다.
Texture2D UpPipeImage; // Texture loading; Texture2D DownPipeImage; // Texture loading;
Texture2D 에셋을 선언해서 텍스쳐를 사용하려고 하는 것은 기존과 다를 바가 없다.
2. game.cpp
가. Init()함수
텍스쳐 파일을 로딩하자
// 파이프 이미지 DownPipeImage = LoadTexture("Assets/Pipe-up350.png"); // 아래쪽에 있는 파이프이다. 에셋의 파일명은 위쪽을 바라보는 의미에서 pipe-up이다. UpPipeImage = LoadTexture("Assets/Pipe-down350.png"); // 위쪽에 있는 파이프이다. 에셋의 파일명은 아래쪽을 바라보는 의미에서 pipe-up이다.
나. ~Game()메소드
소멸자에는 텍스쳐를 업로딩하는 것을 잊지 말자
Game::~Game() { UnloadTexture(DownPipeImage); // Texture unloading UnloadTexture(UpPipeImage); // Texture unloading UnloadTexture(backgroundImage); // Texture unloading UnloadMusicStream(music); // Unload music stream buffers from RAM pipes.clear(); }
로그인