资源经理-他们有什么好处吗?


20

我已经在源代码中见过很多次了,诸如此类[嗯,这更多是我的伪C ++想法]

typedef shared_ptr<Resource> ResourcePtr;// for ease  
ResourcePtr sound1 = resourceManager.Get<SoundResource>("boom.ogg");  
sound1->Play();  
ResourcePtr sprite = resourceManager.Get<Image>("sprite.png");

我只是想知道像这样的课程有多有用:

  • 加载的媒体文件
  • 将它们存储在内存中
  • 在关卡开始时执行此操作-加载屏幕。
  • 清理了

而不是具有以下系统:

  • 资源仅由实体持有,或由实体持有。
  • 负责自己加载到内存中。

首先是这样的“经理”;我觉得这表示使用错误。但是,它允许传递类似资源名称的向量之类的东西,而不必费力寻找需要加载的所有内容。



1
不完全是。我认为这是一个有效的问题。
Ricket

不完全相同,但相似的领域,相似的优点/缺点。但是有些事情您需要与经理一起执行,而清单文件则不会执行。清单是愚蠢的事情,它们只是将完全不同的资源聚集到一个索引中。资源经理可以承担更多责任,并更好地与游戏引擎交互。
MrCranky

我不认为我在问同样的事情。这似乎是在询问您是否应该使用某种文件路径缩短器,而我正在询问某种类型的资源加载器/缓存类型的东西。但是,我认为当我使用资源而不是资产时,它并没有出现。
共产党鸭子

2
@Bryan,我不同意,“资产管理者是个好主意”与“如何实施资产管理者”是一个不同的问题。当然,有些人试图回答第二个问题中的第一个问题,这将导致很多答案重叠。
四分

Answers:


20

一个好的资源管理器是决定您的游戏“引擎”的性能和灵活性的关键。

它不仅解决了低级资源管理中的许多问题,而且还有助于确保仅加载一次资源,如果资源已经加载,则可以重用。

如果资源系统被很好地抽象,则底层细节可能会在文件系统,physfs存储,sql甚至之间发出警告。

您只需要一个资源,资源便已分配给您。

无需担心资源ID和类似的东西。

重复的资源冲突处理等

让资源管理器解决这个问题。

根据您的设计方式-如果C ++然后与您的场景管理类交朋友,以确保正确处理所有权。

资源池?

没问题。

忘记释放资源?

没问题。

无论资源在哪里,它们都具有相同的接口:内存,磁盘,存档,网络。

没问题。

您要串流吗?

穿线?

让您的资源管理中心来解决这个问题。

而且您可以放心,它会在准备使用资源时通知您。

Ogre 3D有一个非常灵活的资源管理系统,但是我敢肯定还有其他“在那里”。


1
我必须感谢你的回答。在阅读本文之前,我不相信专用的资源管理器的实用性,现在我将很快实现它。
杰克·麦克阿瑟

13

我最近写了一个资源管理器,对于我的案例来说效果很好。主要特点:

  • 通过字符串ID请求资源,例如ResourceManager::instance().getTexture("textures/player.png")。纹理ID当前直接映射到磁盘上的文件,这在开发过程中很方便,但是稍后将在某些存档中通过查找替换它。

  • 资源管理器会保留ID到资源的映射,因此它不会重新加载已经加载的资源。

  • 上面的调用不返回Texture对象,而是返回一个Resource<Texture>对象;调用者应该存储Resource<Texture>对象而不是实际纹理。的Resource<Texture>行为就像一个聪明的指向Texture; 它operator*()返回Texture对象本身。优点是可以重新加载或卸载实际纹理,而无需更新所有客户端。

  • 资源管理器会定期检查磁盘上的文件是否已更改,并在必要时重新加载它们。这使我无需重新启动游戏即可修改纹理或着色器并查看结果。

  • 资源可以相互依赖。大多数(如果不是全部)资源取决于File资源,即从中加载文件资源。例如,如果模型依赖于纹理,则每当纹理的文件在磁盘上更改时,都会重新加载模型。

  • 当找不到资源或无法加载资源时,将默认替换默认资源。这使我可以使用尚未创建的资源,而不会导致游戏崩溃。(计划功能:指示“基本”资源,例如GPGPU着色器,否则资源将无法正常运行。)

  • 可以轻松添加参考计数和卸载未使用的资源。由于我的游戏很小,所以我还没有这个需要。

我认为此功能列表表明,是的,资源管理器可以很好!


2

拥有资源管理器的原因之一是资源共享。例如,当您调用时resourceManager.Get("sprite.png"),如果已经加载了“ sprite.png”,则资源管理器可以简单地返回指向已加载的sprite资源的指针,而不用创建一个新映像并从磁盘重新加载它。

资源管理器还可以缓存资源,因此尽管删除了对资源的最后一个引用,但是资源管理器可以选择将其保留在内存中,以防在不久的将来再次加载它。资源管理器将被编程为自动处理您资源的所有内存管理。

最后,我认为一个非常有用的功能是在游戏中重新加载资源。由于资源管理器拥有所有游戏资源的句柄,因此您可以建立一个函数,使所有资源从磁盘上重新加载并实时更新游戏,这对于与您的游戏一起工作的美术师/设计师非常有用。 。


1

另一个好处是,除了缓存和引用计数外,它还可以处理依赖关系(模型a需要纹理b?我会为ya!得到它!)和加载顺序问题(模型a需要知道着色器b需要什么?让我加载着色器) b,然后再加载模型!)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.