0

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

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

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

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

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

我想知道哪种方式会更好:

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

理想情况下,我只想给每个实例一个指针,然后能够在构造函数中调用类似以下的东西:

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

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

如果我这样做,我不确定 Id 是如何做到的,所以我可以直接传递对象指针并让图形管理器发回正确的信息,而不是使用 Id 必须为每个子类指定的某种枚举或字符串渲染对象。

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

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

4

1 回答 1

1

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

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

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

于 2013-06-15T12:29:19.957 回答