2013-06-15 1 views
0

저는 SDL의 소형 엔진/게임에서 C++로 작업하고 있습니다. Im을 구성하고 유지하는 가장 좋은 방법을 찾고 있습니다. 모든 오브젝트가 사용할 텍스처/자원.렌더링 된 객체의 모든 인스턴스가 공유 텍스처/리소스에 대한 포인터/참조를 유지하는 가장 좋은 방법

RenderedObject라는 간단한 기본 클래스가 있는데,이 클래스는 화면 상에 표시되는 모든 것을 상속합니다. 모든 렌더링 된 객체는 여러 텍스처와 SDL_surfaces를 연결하여 렌더링 할 수 있습니다.

각 클래스와 관련된 다른 텍스처를해야합니다 RenderedObject의

다른 어린이들 (예를 들어, RenderedObject에서 상속 문자 객체 다리, 몸과 머리에 대한 표면/텍스처가있을 수 있습니다).

이러한 클래스의 인스턴스가 여러 개있을 것이므로 분명히 텍스처의 복사본 하나만로드/유지하면됩니다. 그러면 모든 인스턴스에 포인터가 다시 생길 수 있습니다.

임 그것을 할 더 좋을 거라 어떤 방법 궁금 :

1) 필자는 모든 이미지 로딩 및 렌더링을 수행하는 그래픽 관리자를 가지고, 그래서 내가 모두의 배열을 유지하기 위해 그것을 사용할 수 있습니다 생각 각 개체에 대한 텍스처. 하지만 각 RenderedObject 인스턴스에서 다시 링크하는 방법에 대해서는 잘 모르겠습니다.

this->textures = graphicManager.getTextures(this); 

을 다음 graphicManager이 포함 된 텍스처 객체의 어떤 종류를 반환 할 수 :

이상적 아이디는 각 인스턴스에게 포인터를 제공하고 생성자 또는 무언가에 다음과 같은 무언가를 호출 할 수 있기를 그 객체에 대한 모든 텍스처.

이렇게하면 ID가 어떻게 만들어 지는지 직접 알 수 없으므로 graphicManager가 ID가 지정해야하는 일종의 열거 형이나 문자열 대신 올바른 정보를 보내도록 할 수 있습니다. RenderedObject의 각 서브 클래스마다.

2) 내가 생각했던 다른 방법은 모든 텍스처를 객체의 정적 멤버로 유지하는 것입니다. 정적 변수를 사용하는 것에 너무 익숙하지 않습니다. 그들의 가치는 언제 초기화 될까요? 텍스처 로딩을하기 전에 SDL을로드/초기화해야하기 때문에

결론적으로, 실제로 RenderedObject의 각 서브 클래스에서 포인터 또는 참조를 생성하지 않고 텍스처를 유지하는 가장 좋은 방법을 찾고 있습니다. 열거 형 또는 각 서브 클래스에 대한 추가 클래스.

답변

1

나는 그래픽을 관리하는 클래스를 사용하여 (모든 게임 엔진을 구축하고 있으며 모든 외부 리소스에 대해이 메서드를 선택했다.) 클래스를 사용하여 말한 것처럼 최선의 방법이라고 생각하지만 내 접근 방식은 귀하와 다를 수 있습니다. :

주어진 RenderedObject을로드 할 때 파일 이름이나 필요한 그래픽의 다른 식별자를 관리자에게 전달합니다. 그런 다음 관리자는 해당 그래픽이 이미로드되어 있는지 확인하고 (이미로드 된 항목의 목록을 유지합니다. std::map<std::string,SDL_Surface*>), 이미로드 된 경우 객체의 참조 횟수가 증가합니다 (refcount 멤버를 사용할 수 있음). SDL_Surface 구조체, 또는 다른 클래스에서 래핑하십시오.

RenderedObject이 해제되면 관리자의 자유로운 기능을 호출하여 개체의 참조 횟수를 감소시킵니다.참조 횟수가 0이되면 객체를 해제 할 수 있습니다. 이런 식으로 복수 RenderedObject 클래스는 동일한 SDL_Surface 인스턴스를 사용할 수 있습니다.

+0

이 방법은 보통 SDL 데모에 사용하는 방법으로 매우 잘 작동하며 다른 유형의 리소스로도 쉽게 확장 할 수 있습니다 – emartel

관련 문제