zoukankan      html  css  js  c++  java
  • 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倍左右。

  • 相关阅读:
    资源汇总
    最近面试经历
    Screen Space Ambient Occlusion
    实时渲染下的多线程协作:实践
    High Dynamic Range
    Deferred Shading
    实时渲染下的多线程协作
    9.了解四个相等判断的用法
    14.使用构造函数链
    16.垃圾最小化
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/13069706.html
Copyright © 2011-2022 走看看