• Cocos Creator CollisionManager碰撞效率测试


    版本:2.3.4

    CollisionMananger源码

    源码位置cocos2d/core/collider/CCCollisionManager.js

    collisonMananger默认会检查所有collider的碰撞,计算还是相当复杂的。

    BoxCollider测试

    在pc上写一段简单测试代码

    const {ccclass, property} = cc._decorator;
    
    @ccclass
    export default class ColliderTest extends cc.Component {
    
        @property(cc.Canvas)
        canvas:cc.Canvas = null;
    
        start () {
            let manange:cc.CollisionManager = cc.director.getCollisionManager();
            manange.enabled = true;
            manange.enabledDebugDraw = true;
    
            this.boxColliderTest();
        }
        public boxColliderTest(){
            for(let i=0;i<1000;i++){
                let node:cc.Node = new cc.Node();
                node.width = 100;
                node.height = 100;
                node.x = i*100;
                node.y = i*100;
                let box:cc.BoxCollider = node.addComponent(cc.BoxCollider);
                this.canvas.node.addChild(node);
            }  
        }
    
        onCollisionEnter(other,self) {
            console.log(other, self);
        } 
    }

    自写碰撞测试

    const {ccclass, property} = cc._decorator;
    
    @ccclass
    export default class ColliderTest extends cc.Component {
    
        @property(cc.Canvas)
        canvas:cc.Canvas = null;
    
        start () {
            this.rectColliderTest();
        }
    
        private boxList= [];
        public rectColliderTest(){
            for(let i=0;i<2000;i++){
                let node:cc.Node = new cc.Node();
                node.width = 100;
                node.height = 100;
                node.x = i*100;
                node.y = i*100;
                let box:cc.BoxCollider = node.addComponent(cc.BoxCollider);
                this.canvas.node.addChild(node);
                this.boxList.push(box);
            }
        }
    
        update(){
            let len = this.boxList.length;
            for(let i=0;i<len;i++){
                for(let j=i+1;j<len;j++){
                    cc.Intersection.rectRect(this.boxList[i].world.aabb, this.boxList[j].world.aabb);
                }
            }
        } 
    }
    

      

    BoxCollider测试结果

    碰撞体数量    pc消耗时间     mate9消耗时间   iphone6消耗时间

    500                4-4.5ms          27-29ms             7-8ms

    1000              12-13ms        85-87ms               30-32ms

    1500             29-30ms        178-180ms             70-75ms

    自写碰撞类结果

    碰撞体数量    pc消耗时间     mate9消耗时间   iphone消耗时间

    500                1.7-1.8ms       8-10ms                5-6ms

    1000              4.9-5ms          32-43ms              9-10ms

    1500             10-10.8ms       56-58ms               28-30ms

    如果碰撞体都是一些矩形,例如一些瓦片地图的游戏。可以看到不使用BoxCollider的话,碰撞检测要快3倍左右。

  • 相关阅读:
    tesseract动态库依赖关系
    面向对象分析与设计笔记(一)
    用例图笔记
    矩阵乘法求解
    二维数组 Visual Studio怎么监视
    cmake windows caffe cuda版本的切换
    Python入门
    Python基本数据类型
    【LabVIEW】二进制文件的存储与读取方法
    【LabVIEW】文件对话框点击取消后报错、实现自定义文件名
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/13069706.html
Copyright © 2020-2023  润新知