首页 文章

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

提问于
浏览
0

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

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

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

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

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

我想知道哪种方式更好:

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

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

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

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

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

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

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

1 回答

  • 1

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

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

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

相关问题