사용자 도구

사이트 도구


포인터를_이용하여_최적화하기
포인터를 이용하여 최적화하기

문서의 이전 판입니다!


스타팅 파일

문제점

기존의 프로젝트를 실행해서 터미널에 쏟아지는 문구를 보면, pipe그림 파일을 끊임 없이 로딩하고, 다시 언로딩하는 작업이 이루어지는 것을 볼 수 있다.

파일 IO문제

이는 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();
} 
로그인하면 댓글을 남길 수 있습니다.

포인터를_이용하여_최적화하기.1697803046.txt.gz · 마지막으로 수정됨: 2023/10/20 20:57 (바깥 편집)