Cocos Creator | 碰撞检测优化-四叉树
获取更多笔记和源码
公众号:CocosCreator笔记
四叉树原理本人就不赘述了,很多前辈都有详细的讲解
首先说明下四叉树并不是一个碰撞引擎,它只是一种减少碰撞候选者的算法,所以在利用四叉树得到碰撞候选元素后,还需要去检测这些候选元素与目标元素是否发生碰撞
2D中是四叉树,3D中则对应的为八叉树
项目(微信小游戏《宇宙少女》)中实测:
同屏极限情况下,可碰撞元素为:
200左右子弹+70左右怪物+若干buff+玩家
碰撞关系为:
子弹和怪物碰撞
特定怪物和其他怪物碰撞反弹
玩家和怪物碰撞
玩家和buff碰撞
使用cocos的碰撞系统,在H5表现良好,微信小游戏的Android平台也还可以,但是在ios平台上,FPS只有20+
使用四叉树做空间规划,对子弹做进一步的优化,减少碰撞元素
碰撞检测使用圆圆碰撞和圆矩碰撞,放弃了pow()和sqrt()方法, 其相对于加减乘除会消耗更多的CPU(之前在QQ群讨论过)
改良后的碰撞检测在微信小游戏的Android平台性能良好,IOS平台的FPS也达到了50+
项目中使用每帧重建四叉树,当然也可以自己维护四叉树中碰撞元素的位置
1四叉树概念
四叉树(quad-tree)是一种数据结构,是一种每个节点最多有四个子树的数据结构。四叉树是在二维图片中定位像素的唯一适合的算法。因为二维空间(图经常被描述的方式)中,平面像素可以重复的被分为四部分,树的深度由图片、计算机内存和图形的复杂度决定。四叉树可以用来在数据库中放置和定位文件(称作记录或键)。这一算法通过不停的把要查找的记录分成4部分来进行匹配查找直到仅剩下一条记录为止。
2空间规划
游戏编程模式-空间分区
将对象存储在根据位置组织的数据结构中来高效地定位它们。 你有一组对象(可能还挺多),将对象存储在一个根据对象位置来组织的数据结构中,该数据结构可以让你高效查询位于或靠近某处的对象。当对象位置改变时,更新并继续维护该空间数据对象。用更复杂的数据结构(空间)来换取大量查询时的性能优化(时间)。
博客园中一篇讲解详细的blog
https://www.cnblogs.com/xin-lover/p/12216053.html
广告
游戏编程模式
作者:[美]Robert Nystrom(尼斯卓姆)
京东
3
quadtree-js
在GitHub上找到的一个前辈实现的四叉树:
https://github.com/timohausmann/quadtree-js
并提供了两个在线演示的demo,其中红色为四叉树节点,空白方块为四叉树中的元素,灰色方块为鼠标的位置,即目标元素,绿色方块为碰撞候选元素
1.手动添加静态对象并查看四叉树拆分:
https://timohausmann.de/quadtree.js/simple.html
2.在持续运动的对象中查看四叉树拆分:
https://timohausmann.de/quadtree.js/dynamic.html
4使用方法
1.引入quadtree.js
①通过代码引入:
import * as Quadtree from "../R-framework/quadtree.js";
②插件引入:
将quadtree.js文件导入编辑器的时候选择为插件
2.创建四叉树
区域为整个屏幕
let myTree = new Quadtree({
x: -cc.winSize.width / 2,
y: -cc.winSize.height / 2,
width: cc.winSize.width / 2,
height: cc.winSize.height / 2
});
3.插入元素
参数为元素的左下角坐标及其宽高
myTree.insert({
x: 200,
y: 150,
width: 20,
height: 20
});
4.检索元素
参数为目标元素的左下角坐标及其宽高
返回值为碰撞候选元素数组
let elements = myTree.retrieve({
x: 150,
y: 100,
width: 20,
height: 20
});
5.碰撞检测
在得到碰撞候选元素后,需要检测是否与目标元素发生碰撞,检测的方法可以用cocos的碰撞组件,也可以根据项目需求定制碰撞检测
6.清除四叉树
检测完毕后,需要清除四叉树中的元素,以方便下次继续检测
myTree.clear();
或者维护四叉树空间中碰撞元素的位置
Cocos Creator | 碰撞检测优化-四叉树相关推荐
- Cocos Creator 性能优化:DrawCall
Cocos Creator 性能优化:DrawCall(全面!) title: Cocos Creator 性能优化:DrawCall 前言 在游戏开发中,DrawCall 作为一个非常重要的性能指标 ...
- Cocos Creator性能优化---DrawCall
前言 在游戏开发中,DrawCall 作为一个非常重要的性能指标,直接影响游戏的整体性能表现. 无论是 Cocos Creator.Unity.Unreal 还是其他游戏引擎,只要说到游戏性能优化,D ...
- Cocos Creator性能优化-2-包体优化
对于Cocos Creator包体优化可分为 1.项目设置 1.模块设置 通过去除无需使用的模块来减少包体 (微信小游戏还支持引擎插件可在打包时勾选) 2.resources 总而言之不需要动态加载的 ...
- cocos creator 碰撞检测系统collider
cocos creator 内置了简单的碰撞检测系统,会根据当前节点下添加的碰撞组件进行碰撞检测.它可以应用在很多场景,比如可以用来判断子弹是否碰撞到敌人. 碰撞组件 矩形碰撞组件: 圆形碰撞组件: ...
- Cocos Creator | 游戏优化之内存优化-资源管理
更多教程请关注微信公众号: 设备对每个程序都有最大的内存分配限制,如果超过了这个阈值,会被系统强制关闭,造成 crash 因此在开发的过程中,我们要在保证程序运行效率的前提下,尽量压缩程序运行时所占用 ...
- Cocos creator ListView 优化
前面文章发布了ListView代码 再实际使用,和小游戏项目优化的过程中,发现ListView初始创建Item的时候,虽然只有几个,但是如果页面打开时候,有播放动画,在比较差的机型中,还是会有出现卡顿 ...
- cocos creator 碰撞检测
1.普通的碰撞检测 a.给精灵添加boxCollision b.代码里面开启碰撞管理 cc.director.getCollisionManager().enabled = true;//开启碰撞功能 ...
- Cocos Creator 性能优化——对象池
对于游戏开发人员来说,性能优化是一个永远绕不过的话题,极致的性能是我们毕生的追求,今天就来带大家学习一下性能优化方法之一--「对象池」. 为什么要使用对象池? 在开始之前要先弄明白为什么要使用对象池 ...
- cocos creator 四叉树碰撞系统Demo
先挂上demo链接,目前测试的是2000个节点的碰撞 Cocos Creator | QuadTree (myqcloud.com) 检测的节点越多,优化效果越明显. 优化的原理大致就是将屏幕划分成一 ...
- Cocos Creator 性能调优优化集锦
01 为什么要做性能优化? 性能:是一种优秀的能力.唤醒快.运行持久.稳定. 这种能力在游戏上能让你的用户感觉很爽,表征表现为加载快.手机不发热.运行流畅.不卡顿. 所以,性能优化的终极目标是让你的用 ...
最新文章
- 使用GIF(仅限Delphi2007)
- Android项目:proguard混淆之常见开源项目混淆配置
- JSTL标签的用法详解
- Python3.3 学习笔记1 - 初步安装
- Jmeter内置函数功能(五)
- 有什么办法可以判断页面是静态还是动态?_网络营销——网络营销专员到底是教你如何选择网站页面制作...
- LeetCode每日一题 19. 删除链表的倒数第N个节点
- Hadoop之Hadoop基础知识面试复习
- java生日快乐_Java八岁生日快乐!
- Pytorch 神经网络nn模块
- Leetcode--50. Pow(x,y)
- 8个超棒的使用javascript开发的视觉特效网站
- 百度地图服务器不显示本地运行,百度地图定位成功,但地图不显示
- 【图像分割】基于matlab GUI图像提取【含Matlab源码 702期】
- Linux系统——sqlist数据库
- Linux下通过ODBC连接数据库及ODBC相关操作命令
- 分析内网即时通讯软件安全性如何
- element color-picker源码
- Vue.filter过滤器存储单位换算按B、KB 、M、 G显示字节大小
- wt概述-c++ web