识别游戏引擎中的资产?


12

我想识别我已加载的资产,但是我不知道应该选择哪一个。有2个选项:

  • 名称(字符串)

    • 对于unordered_map(O(1)),这是最简单也最快的方法,但是比使用整数慢。
    • 在代码中容易理解。
  • 整数

    • 最快的。
    • 用代码无法理解。

我知道字符串不是那么安全或快速,但是那样不好,还是仅在AAA标题中算作不好?我可以使用整数来枚举枚举,但是如果我在运行时从文件加载场景,资产等,则不能使用枚举。如果这些整数是在运行时生成的,是否可以使这些整数可读?

我知道这个问题在互联网上有很多线索,但是我无法确定在什么情况下这很重要。


10
为什么不同时执行两者?字符串版本连接到Dictionary <string,int>,后者依次称为Dictionary <int,Asset>。您可以在代码中规避基于字符串的层,但可以使用基于字符串的层进行用户交互。
克里斯蒂克'16

2
我第二点@Krythic的观点。如果您的代码喜欢整数来提高速度,请让您的代码使用整数。如果您的用户喜欢字符串以提高可读性,请让您的用户使用字符串。两者可以很愉快地共存(并且,如果您想完全跳过发行版中的开销,则可以选择仅将字符串版本编译为开发版本)
DMGregory

在稍微不同的环境中存在相同的问题:项目实施的方法不同-有什么区别?
菲利普

Answers:


19

您可以同时支持。

尽管在运行时通过整数或类似的快速比较键来引用资产通常更有效,但在设计时使用名称来引用资产通常会更有效,因为人会enemy_bullet_casing_sound比使用名称更好72910613

使用整数键直接查找资源,并在代码中尽可能使用此整数(可以将整数的实际值放入变量中,从而更轻松地使用它)。提供从名称该整数键(而不是直接到资源)的映射,并在遇到资产的命名引用时使用该映射来解析实际的整数键并找到资产。

使用基于名称的查找将使您的数据文件更容易使用,并且将名称映射到更快的键将在任何需要的地方保留更快的整数类型键的所有重要优点。


我的情况:我想更改对象的材质,所以我发送了一个带有新材质名称的请求。(字符串)然后在图形系统中搜索<string,pointer>无序映射,对象的材质的指针将被新的指针替换。因此,就我而言,我不必将其转换为整数吗?(因为我将其转换为指针,并且在频繁的算法中使用指针,所以我仅偶尔使用字符串。)
Tudvari 2016年

还是应该尽可能使用整数ID而不是指针?(因此,我不必包括材质的头文件。)例如,渲染器组件现在存储了所用材质的指针,可以由图形引擎直接使用它,但是我必须包括Material.h。 。但是,当我仅在渲染器组件中存储整数时,就不必包括Material.h,但必须在指针数组中进行基于整数的搜索。我认为后一种更好。是吗?我应该重构吗?
Tudvari '16

1

在我的项目中,我使用哈希字符串,这些字符串在编译时会转换为唯一(希望!)数字。因此,当我需要资源(例如纹理)时,我只需调用

MngTexture->get(hash("my_texture"))

而且由于我正在创建一个简单的实体系统框架,并且需要从文件中加载组件数据,所以我创建了一种简单的语言(例如json)来存储数据,但是它是可编译的(将单词和字符从数字转换为数字,从字符串转换为哈希值) 。因此,例如,如果我想将ID哈希(“ my_texture”)的纹理链接到数据文件中的“ ball.PNG”,

|my_texture| = "ball.PNG"

哪里|| 是一个运算符,它告诉编译器对里面的单词进行散列。

因此,基本上我在实际代码和文件(用于加载组件的流)中都使用在编译时映射到int的字符串(因此它们没有任何开销)。为了计算哈希,只需在Google上搜索一下即可,它具有5-10行代码的简单功能。

当然,您可以从文件中加载字符串并在运行时对其进行哈希处理,在这种情况下,您不必自己编写字典,因为算法会帮您完成(从字符串中创建整数),而我认为hasing至少与在地图中搜索一样快,这是由于内存的局限性(您正在循环访问一个只有几个字节长的字符串)。

希望这会有所帮助。


0

通过字符串识别对象并不是最佳方法,int效率更高。为了方便起见,您可以将字符串的字符串表(或字典)维护为整数,以在设计时和调试期间提供帮助。

但是,我主张在您的核心游戏代码中,您只能通过其整数ID(或可读性枚举)来引用对象。这样可以更轻松地将字符串表分解为单独的资产。如果您的核心游戏代码不依赖于此字符串表,则可以将其从已发布的游戏中删除,从而可能节省大量内存-如果您正在开发移动游戏并希望将下载大小保持在最小,则这是一个重要的考虑因素。可能。

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.