技术标签: 算法/数据结构 业务-游戏 视野 aoi 编程语言-c/c++
参考:
云风的BLOG http://blog.codingnow.com/2012/03/dev_note_13.html
网易pomelo开源项目的灯塔aoi模块 https://github.com/NetEase/pomelo-aoi
网上看到的一个对十字链表法的实现 http://www.codedump.info/?p=388
1.最直接了当的实现:扫格子,每次地图上对象出现、消失、移动都扫描该对象所属格子的周边的格子(扫几格的范围就据视野而定了)找到玩家角色做通知;如果移动的是玩家,则要把周边地格的对象出现和消失通知给玩家
2.十字链表,没细研究,上面有一篇介绍和实现,感觉有些粗糙
3.灯塔,前几天把pomelo中的tower aoi的js实现看了一遍,总结如下:
1>js代码写得不是很好,发现了几个小问题;
2>“对象(包括观察者)出现”“对象(包括观察者)消失”“对象(包括观察者)位置变化”“观察者位置变化”的回调通知(前三者通知对应灯塔区域的观察者,第四个通知观察者本身)没有可测试的样例,采用的话需要自己实现和测试;
3>只考虑了起点和终点,移动路径上的玩家被忽视了,路径短的话也可能不是问题(长路径切分成多个短路径做位置更新);
4>观察者可能收到超出自己视野范围的消息;
5>优点是可处理视野不同的观察者,相对于普通扫格子的实现在代码层面耦合度降低、效率提升不明显(把扫格子实现的地格看做一个灯塔区域,在地格上记录观察者就可以模拟这种灯塔模型,削去了遍历周边地格所有对象的逻辑)
6>这里做的是四边形灯塔区域,云风提的那种六边形灯塔区域减少查询灯塔个数是特指视野半径<=六边形边长的一半这种情况
7.tower aoi其实就是处理地图视野的一个设计,类似于订阅-发布,我订阅某一块区域表示对这一块区域感兴趣,那么有对象在这一块区域出现消失移动你就通知我
这里是我对pomelo-aoi的C++改写:https://github.com/xiarendeniao/pomelo-aoi
除了改写代码以外也修复了一个小问题:AddWatcher对于订阅区域的所有对象出现、RemoveWatcher对于取消订阅区域的所有对象消失,这两项没有通知watcher
这个版本的实现完全是对pomelo-aoi改写,如果要加到游戏项目中需要根据需要稍微定制以提升效率或节省内存,既然是项目无关,那么公开到网上也无可厚非,哈哈哈哈
还有一些改进的想法是:把每个watcher的视野半径和位置记录在aoi内部,这样AddWatcher/RemoveWatcher/UpdateWatcher的时候可以做一下校验;在灯塔记录该区域所有watcher的同时,在watcher身上记录其所有订阅的灯塔,这样游戏业务中不可避免且频繁获取watcher视野内对象时,直接遍历watcher身上的灯塔拿灯塔记录的所有对象(灯塔身上的对象,不等同于灯塔身上的watcher!)
最后,贴一张C++实现灯塔aoi的测试界面(不善于图形编程故没法像云风那样可视化显示 :( )
Valgrind检测内存泄漏,结果正常:
sudo yum install valgrind valgrind-devel -y g++ -g -o0 -o aoi test.cpp valgrind -v ./aoi Q --29416-- REDIR: 0x35c18bb330 (operator delete[](void*)) redirected to 0x4a05a9f (operator delete[](void*)) press enter to continue... ==29416== ==29416== HEAP SUMMARY: ==29416== in use at exit: 0 bytes in 0 blocks ==29416== total heap usage: 21,667 allocs, 21,667 frees, 914,829 bytes allocated ==29416== ==29416== All heap blocks were freed -- no leaks are possible ==29416== ==29416== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6) --29416-- --29416-- used_suppression: 4 U1004-ARM-_dl_relocate_object --29416-- used_suppression: 2 glibc-2.5.x-on-SUSE-10.2-(PPC)-2a ==29416== ==29416== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
过滤源ip、目的ip。在wireshark的过滤规则框Filter中输入过滤条件。如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8;查找源地址为ip.src==1.1.1.1端口过滤。如过滤80端口,在Filter中输入,tcp.port==80,这条规则是把源端口和目的端口为80的都过滤出来。使用tcp.dstport==80只过滤目的端口为80的,tcp.srcport==80只过滤源端口为80的包协议过滤比较简单,直接在F...
1 通过 JS函数 创建(无状态组件)2 通过 class 创建(有状态组件)函数式组件 和 class 组件的使用场景说明:1 如果一个组件仅仅是为了展示数据,那么此时就可以使用 函数组件2 如果一个组件中有一定业务逻辑,需要操作数据,那么就需要使用 class 创建组件,因为,此时需要使用 stateJavaScript函数创建注意:1 函数名称必须为大写字母开头,React...
文本来源大数据咖啡,作者王健傅一平评语:非常深刻且通俗易懂的讲解了数字化本质的文章,抽象的很好,我从这篇文章得到了六点收获:1、数字化的三种典型场景:(1)把人与人的交互迁移到数字世界,如游戏(2)物体信息映射到数字世界,滴滴出行(3)把业务场景迁移或映射到数字世界,如天猫2、数字化和信息化的关系:第一阶段:信息记录,物理世界为主,数字世界为辅,第二阶段:用户活动迁移,数字世界为主,物理世界沦为辅助,第三阶段,业务数字化重塑,数字世界从模仿物理世界演化到用数字世界的特质(大数据,人工智能,.
前言Spring 是一个非常流行和成功的 Java 应用开发框架。Spring Security 是 Spring 家族中的一个安全管理框架,提供了一套 Web 应用安全性的完整解决方案。在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access
为什么80%的码农都做不了架构师?>>> ...
前言使用natapp实现网路调试助手远程测试,不再局限于本机方法访问官网,注册账号并实名认证。登陆账号,进入用户界面。购买一个免费隧道进行测试。点击页面左侧菜单“购买隧道”-&amp;amp;amp;gt;“免费隧道” 进入配置页面配置免费性隧道,名称自定义,协议选择tcp,端口根据需求配置,然后点击“免费购买”点击左侧菜单“我的隧道”,就可以看到刚才买到的隧道,点击“显示”就可以看到配置使用的...
点击打开链接Recipesjwilson edited this page on 2 Jan · 17 revisions Pages 10Using OkHttpCallsConnectionsRecipesInterceptorsHTTPSJavadocokhttpokhttp-urlconnectio
/*题目描述将字符串t插入到字符串s中,在位置pos后插入。不得使用字符串操作函数,输出组合成的字符串。输入输入两个字符串(t和s)和要插入的位置(pos)输出输出组合后的字符串样例输入qwejij3样例输出jijqwe
浅谈 .axf,.bin,*.hex 文件 在Keil_MDK 中若编译过程无误,即可生成工程的*.axf 文件,而在 MDK 中使用下载器(DAP/JLINK/ULINK 等)下载程序或仿真的时候,MDK 调用的就是*.axf 文件,它解释该文件,然后控制下载器把*.axf 中的代码内容下载到 STM32 芯片对应的存储空间,然后复位后芯片就开始执行代码了。然而,脱离了 MDK 或 IAR ...
秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒)皮秒皮秒,符号ps(英语:picosecond ).1皮秒等于一万亿分之一秒(10-12秒)1,000 皮秒 = 1纳秒1,000,000 皮秒 = 1微秒1,000,000,000 皮秒 = 1毫秒1,000,000,000,000 皮秒 = 1秒纳秒纳秒,符号ns(英语:nanosecond )....
这个在做网页中常要用到,有些通用的内容可集中放在一个页面文件中,其它要用到这些内容的页面只需要包含(引用)这个通用文件即可。这样便于维护,如果有很多网页,当通用内容需要修改时,只改一个文件就可以了,不需要每个文件单独修改。最典型的应用比如页脚的版权信息等内容可以放在一个叫做footer.html文件里, 然后其他页面文件在页面内容的最后包含这个文件就可以了,具体例子下面有。要 h...
转码方式bota和atob从base64到atob和btoa的一些理解https://segmentfault.com/a/1190000016379916附上菜鸟教程链接botahttps://www.runoob.com/jsref/met-win-btoa.htmlatobhttps://www.runoob.com/jsref/met-win-atob.html演示链接https://www.runoob.com/try/try.php?filename=t...