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

Best way for all instances of a Rendered Object to maintain a pointer/reference to shared textures/resources

本文关键字:纹理 共享 指针 方式 最佳 引用 一个 资源 对象 实例 维护      更新时间:2023-10-16

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

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

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

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

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

我想知道哪一种方法更好:

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

理想情况下,我想给每个实例一个指针,然后能够在构造函数或其他东西中调用下面的东西:

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

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

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

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

无论如何,总之,我真的只是在寻找最好的方法来保持某种指针或引用在RenderedObject的每个子类的纹理,而不必为每个子类创建一堆枚举或额外的类。

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

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

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