渲染对象的所有实例的最佳方式是维护对共享纹理/资源的指针/引用

时间:2013-06-15 07:10:22

标签: c++ oop sdl

我在SDL中的小型引擎/游戏上使用C ++,我试图找到组织和维护所有对象将使用的纹理/资源的最佳方法。

我有一个名为RenderedObject的简单基类,屏幕上显示的任何内容都继承自。任何渲染的对象都将具有多个纹理和与之关联的SDL_surfaces,它将拼凑在一起进行渲染。

(例如,从RenderedObject继承的角色对象可能具有腿,身体和头部的表面/纹理)

RenderedObject的不同子节点将具有与每个类关联的不同纹理。

由于这些类会有多个实例,显然我只需要加载/维护一个纹理副本,然后每个实例都可以有一个指向它的指针。

我想知道哪种方式更好:

1)我有一个图形管理器,可以完成所有的图像加载和渲染,所以我想我可以用它来保存每个对象的所有纹理数组。但我不确定如何从每个RenderedObject实例链接回来。

理想情况下,我想给每个实例指定一个指针,然后能够在构造函数中调用类似下面的内容:

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

然后graphicManager可以返回某种包含该对象的所有纹理的Texture对象。

如果我这样做,我不知道Id如何制作它所以我可以直接传递对象指针并让graphManager发回正确的信息而不是使用Id必须指定的某种枚举或字符串RenderedObject的每个子类。

2)我认为可能工作的另一种方式是让所有纹理都是对象的静态成员。我对使用静态变量不太熟悉。他们的价值什么时候会被初始化?因为在完成任何纹理加载之前需要加载/初始化SDL

无论如何,总而言之,我真的只是寻找将RenderedObject的每个子类中的某种指针或引用保留到其纹理的最佳方法,而无需为每个子类创建一堆枚举或其他类。

1 个答案:

答案 0 :(得分:1)

我认为最好的方法是使用类来管理图形(我也在构建游戏引擎,并为所有外部资源选择此方法),但我的方法与您的不同:

加载给定的RenderedObject时,您需要将文件名或所需图形的其他标识符传递给管理器。然后管理器将检查是否已经加载了图形(它保留已加载的内容的列表,最好是std::map<std::string,SDL_Surface*>),如果已经加载,它将增加对象的引用计数(你可以使用SDL_Surface结构的refcount成员,或将其包装在另一个类中。)

RenderedObject被释放时,它将调用管理器的自由函数,这将减少对象的引用计数。如果引用计数达到零,则可以释放该对象。这样,多个RenderedObject类可以使用相同的SDL_Surface实例。