gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:33:55 27 4
gpt4 key购买 nike

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

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

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

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

因为这些类会有多个实例,显然我只需要加载/维护它们纹理的一个拷贝,然后每个实例都可以有一个指向它的指针。

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

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

理想情况下,我只想给每个实例一个指针,然后能够在构造函数中调用如下内容或其他内容:

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

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

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

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

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

最佳答案

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

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

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

关于c++ - 渲染对象的所有实例维护对共享纹理/资源的指针/引用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17121136/

27 4 0
文章推荐: c++ - 如何将字符串复制到指针数组的元素?
文章推荐: javascript - JavaScript 什么时候是同步的?
文章推荐: ios - 使用基于图像的光照在 3D 模型上应用 PBR 纹理
文章推荐: html - 如何仅使用 CSS 设置