Questions tagged «resource-management»

4
C ++游戏如何处理内存分配失败?
我知道有几种用C ++编写的游戏,但是没有使用异常。由于C ++中的内存分配失败处理通常围绕std::bad_alloc异常进行,因此这些游戏如何处理此类失败? 它们只是崩溃了,还是有另一种方法来处理内存不足的错误并从中恢复?

1
我应该如何构建可扩展的资产加载系统?
对于Java的业余游戏引擎,我想编写一个简单但灵活的资产/资源管理器。资产是声音,图像,动画,模型,纹理等。经过几个小时的浏览和一些代码实验,我仍然不确定如何设计这个东西。 具体来说,我正在寻找如何设计管理器的方式,以便它抽象出如何加载特定资产类型以及从何处加载资产。我希望能够同时支持文件系统和RDBMS存储,而程序的其余部分不需要了解它。同样,我想添加一个XML动画描述资产(FPS,要渲染的帧,对Sprite图像的引用等)。我应该能够为此编写一个类,该类具有查找和读取XML文件以及创建和返回AnimationAsset带有该信息的类的功能。我正在寻找数据驱动的设计。 我可以找到大量的信息是什么资产管理者应该做的,而不是如何去做。涉及的泛型似乎导致某种形式的类级联,或某种形式的助手类。但是,我还没有看到一个清晰的例子,看起来不像是个人黑客,也不是共识。

2
如果“ ResourceManager”类被认为是不好的,那有什么替代方法?
我听到有相互矛盾的意见,例如: “专用的Manager类几乎永远不是正确的工程工具” “(目前)专用的Manager类是在拥有数千个资源的大型项目中生存的最佳方法” 让我们来看一个经典的ResourceManager类,它具有以下功能: 加载资产(纹理,音频,3D模型等) 通过保留缓存确保资产仅加载一次 引用计数资产以确定是否可以将其释放 隐藏实际资产的来源(例如,每个资产一个文件,或一个包文件中的所有资产,或者甚至可以通过网络加载资产) 可以在不重新启动程序的情况下重新加载资产,这对于从事游戏的美术师来说非常有用。 假装这些ResourceManager对象不是单例,而是通过依赖项注入传递它们,让我们从表中删除“ singletons is bad”参数。 然后是“使用工厂”或“称其为工厂”参数。我的问题是,是的,它是一个工厂,但它也是一个缓存和一个重装器(因为缺少更好的词)。称其为工厂并不能正确地描述它,如果我将其设置为合适的工厂,那么在哪里实现缓存和重新加载呢? 我同意“经理”类通常是不良体系结构的征兆,但是在这种特殊情况下,如何对其进行重组并仍然保留所有功能?这是“经理”类实际上合适的情况吗?

1
游戏引擎设计– Ubershader-着色器管理设计
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我想实现一个带有延迟着色的灵活的Ubershader系统。我目前的想法是从模块中创建着色器,以处理某些功能,例如FlatTexture,BumpTexture,位移映射等。也有一些模块可以解码颜色,进行色调映射等。这具有我可以如果GPU不支持某些类型的模块,请更换它们,以便我可以适应当前的GPU功能。我不确定这种设计是否良好。我担心我现在可能会做出错误的设计选择,以后再为此付出代价。 我的问题是,在哪里可以找到有关如何有效实施着色器管理系统的资源,示例和文章?有谁知道大型游戏引擎是如何做到的?

1
设计一个ResourceManager类
我已经决定要为我的爱好游戏引擎编写一个中央ResourceManager / ResourceCache类,但是在设计缓存方案时遇到了麻烦。 这个想法是ResourceManager对所有游戏资源组合使用的总内存有一个软目标。其他类将创建处于卸载状态的资源对象,并将它们传递给ResourceManager。然后,ResourceManager决定何时加载/卸载给定的资源,同时牢记软限制。 当另一个类需要资源时,会将请求发送到ResourceManager(使用字符串ID或唯一标识符)。如果加载了资源,则对该资源的只读引用将传递到调用函数(包装在引用的计数的weak_ptr中)。如果未加载资源,则管理器将在下一次机会(通常在绘制框架结束时)标记要加载的对象。 请注意,尽管我的系统确实做了一些引用计数,但它仅在读取资源时才进行计数(因此,引用计数可能为0,但实体可能仍在跟踪其uid)。 还可以在首次使用之前就标记好要加载的资源。这是我正在使用的类的略图: typedef unsigned int ResourceId; // Resource is an abstract data type. class Resource { Resource(); virtual ~Resource(); virtual bool load() = 0; virtual bool unload() = 0; virtual size_t getSize() = 0; // Used in determining how much memory is // being used. …

2
我应该如何处理丢失的资源?
您的游戏预期会加载某种资产,但找不到。情况应如何处理?例如: Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found Mesh* car = LoadMesh("Car.obj"); // returns NULL; 3D mesh not found 在开发过程中,它可能已被用户意外删除,损坏或拼写错误。 一些潜在的回应: 断言(理想情况下仅在开发期间) 优雅退出游戏 引发异常并尝试处理它。 哪种方法最好?

3
为什么资产需要自定义内存管理?
几乎所有与游戏编程有关的资源,尤其是3D开放世界游戏,都在谈论您如何不断地在磁盘,系统内存和视频内存之间进行资产的卸载和重新加载。我可以在控制台上理解这一点,因为它们具有非常简单的内存管理方案,无法处理任何潜在的溢出。 但是,在PC上,情况就大不相同了。操作系统提供了用于系统内存的虚拟内存,图形驱动程序负责从CPU到GPU的来回交换。那么,为什么一次加载所有内容并仅处理预取并仅确保在交换所需资产时没有阻塞是为什么呢? 这并不是说所有的事情都是像那样天真地分配的malloc。一切都将保持连续并且与缓存保持一致。如果您不必担心手动分页和换页,那么提高内存访问的效率可以说很容易... 更新: 在对异步缓冲区传输进行了一些了解之后,我发现图形驱动程序可以自动分页内存的方式不是最理想的。CPU资源是否也是如此?即,是否最好始终手动管理何时在存在虚拟内存的情况下何时加载和卸载给定资源?

5
如何创建一个新的GameObject,而不将其添加到场景中?
我正在创建本质上是我自己的预制系统。游戏对象是由人类可读的数据文件定义的。我想创建一个空的GameObject,将其加载到数据文件中定义的组件中,并准备好等待Instantiate()调用。但是,每当我使用GameObject go = new GameObject()新游戏对象时,都会将其添加到场景中。 使用内置在预制件中的Unity,我可以将预制件作为GameObject加载,并且不会将其添加到场景中。(请参见下面的示例) 这背后的基本原理是我希望有一个包含GameObjects的列表,其中一些是通过加载Unity预制件生成的,而另一些是由我的自定义预制系统创建的。这需要在运行时发生,并且不能涉及Unity编辑器(因为理想情况下,最终用户将能够定义自己的数据文件)。 如何创建一个新的GameObject,而Unity却没有自动为我实例化它? 例如,我可以这样拨打电话: Resources.LoadAll("PrefabsDirectory", typeof(GameObject)) 然后,我将获得一个GameObjects列表,在进行调用时,这些列表都不会添加到场景中。本质上,我正在LoadAll为自己的预制件创建方法,同样,我不想在调用时实例化GameObjects。
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.