通常,数据驱动设计中的实体和组件或游戏代码的其他部分都会有名称,如果您想准确地找出正在处理的对象,则需要检查这些名称。
void Player::Interact(Entity *myEntity)
{
if(myEntity->isNearEnough(this) && myEntity->GetFamilyName() == "guard")
{
static_cast<Guard*>(myEntity)->Say("No mention of arrows and knees here");
}
}
如果您忽略这可能是过早优化的可能性,那么很明显,如果实体的“名称”是一个简单的 32 位值而不是实际的字符串,则查找实体会快得多。
从字符串名称中计算哈希值是一种可能的选择。我实际上还没有尝试过,但是有了 32 位的范围和良好的散列函数,冲突的风险应该是最小的。
问题是这样的:显然我们需要某种方法将代码内(或某种外部文件)字符串名称转换为这些整数,因为处理这些命名对象的人仍然希望将该对象称为“guard” ”而不是“0x2315f21a”。
假设我们使用 C++ 并且想要替换代码中出现的所有字符串,这是否可以通过语言内置的功能来实现,或者我们是否必须构建一个外部工具来手动查看所有文件并交换值?
杰森格雷戈里写了这个his book http://www.gameenginebook.com/ :
在 Naughty Dog,我们使用了 CRC-32 算法的变体来对字符串进行哈希处理,并且在《神秘海域:德雷克的财富》的两年多开发过程中,我们没有遇到任何冲突。
所以你可能想调查一下。
关于你提到的构建步骤,他也谈到了。它们基本上封装了需要散列的字符串,如下所示:
_ID("string literal")
并在构建时使用外部工具对所有出现的情况进行哈希处理。这样您就可以避免任何运行时成本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)