Cocos2d-x C++ Node 使用name取代tag
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Cocos2d-x C++ Node 使用name取代tag,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2312字,纯文字阅读大概需要4分钟。
内容图文
![Cocos2d-x C++ Node 使用name取代tag](/upload/InfoBanner/zyjiaocheng/747/8712063645df406a91df864484b317c5.jpg)
文章目录
在最新的cocos注释中,官方推荐使用name替代tag,本文对此改动进行分析。
优势
-
name相比tag更加直观,tag一般通过常量赋值,调试时显示数字往往还要去查询对应的常量名称,而name可以直接显示。
-
tag表示的内容单一,数字只能代表单一的信息,无法表示多种信息。而name可以自定义内容,并可以调用enumerateChildren函数使用复杂条件枚举节点。
劣势
- 相比于整型的tag,字符串类型的name查找效率相对较低,引擎使用hash来尽可能的避免性能损耗,实际效率与使用tag相差无几。
- name相比与tag占用更多的内存空间。
使用hash避免性能损耗
在Node的关于name属性的变量中,除了_name外,还有一个变量_hashOfName,这个变量在每次setName时更新,存储了节点名称的hash值:
void Node::setName(const std::string& name)
{
_name = name;
std::hash<std::string> h;
//根据新名称计算hash
_hashOfName = h(name);
}
计算hash时,对于相同的字符串必定会得出相同的hash值,而对于不同的字符串计算时会尽可能的避免hash值相同。计算hash值时间复杂度极低,最优时间复杂度为O(1),最坏时间复杂度为O(N),因此这步操作对性能影响不大。
上面提到,对于不同的字符串计算时会尽可能的避免hash值相同。因此在获取某name的节点时,先对hash进行判断,即可达到与tag几乎相同的性能:
Node* Node::getChildByName(const std::string& name) const
{
//...
std::hash<std::string> h;
//计算需要获取的节点名字的hash
size_t hash = h(name);
for (const auto& child : _children)
{
//先进行hash判断,绝大多数情况name不同hash也是不同的,就不需要比较字符串了
if(child->_hashOfName == hash && child->_name.compare(name) == 0)
return child;
}
return nullptr;
}
调用enumerateChildren函数使用复杂条件枚举节点
enumerateChildren函数支持使用正则表达式和引擎规定的特殊语法来枚举符合条件的子节点。特殊语法有三种:
-
//
只能放在字符串首。添加“//”代表从子节点中递归查找符合条件名称的子节点,而不仅局限于这个节点的子节点。
-
/…
只能放在字符串尾。目前此功能注释与实现有误,官方更新后更新此内容
-
/
可以放在任何位置,代表继续从子节点开始查找。
例:
场景树:scene - node1 - node2 - node3(从左到右父子关系, name和变量名相同)
scene调用此函数,条件为"//[[:alnum:]]+"([[:alnum:]]+匹配所有节点name,正则表达式用法点此),此时会依次将node1、node2、node3作为参数调用回调。
scene调用此函数,条件为"node1/node2"(意为寻找父节点名为node1,且节点名为node2的节点),此时会将node2作为参数调用回调。
scene调用此函数,条件为"node3",此时不会调用回调,因为默认情况只寻找子节点(只有node1是scene的子节点)。
内容总结
以上是互联网集市为您收集整理的Cocos2d-x C++ Node 使用name取代tag全部内容,希望文章能够帮你解决Cocos2d-x C++ Node 使用name取代tag所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。