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倍左右。

原文地址:https://www.cnblogs.com/gamedaybyday/p/13069706.html