Cocos Creator 初探:修改Engine来调整FPS信息显示

Stella981
• 阅读 899

Cocos Creator 刚用上,感觉这不就是Unity的孪生兄弟嘛,简单看完example,然后翻了翻手册,开始上手第一个小项目。

创建了一个TypeScript项目,刚画了个背景,调整了一下大小为1920*1080(为了适应手机屏),选择长宽自适应,然后选择在Chrome内预览:

Cocos Creator 初探:修改Engine来调整FPS信息显示

发现左下角的FPS调试信息小的看不清,看了半天文档也没发现哪里能调整FPS字体的大小,在QQ群里咨询半天也没人鸟我,终于有人来了一句:改引擎啊。

为了这点小事就改引擎,那日子还过不过了?

求人不如求己,按F12启动开发者工具,查看前端代码,首先看能不能通过修改Css的方式来调整字体,然而事情并没有这么简单,FPS信息居然是直接在Canvas上绘制出来的,并不能直接修改Css,看来只能另辟蹊径。

由于FPS信息是由一个ShowFPS的Btn组件控制是否显示的,顺着这个线索往下走,查看它调用的js:

,id为btn-show-fps,搜索了一下:

var btnShowFPS = document.getElementById('btn-show-fps');
 btnShowFPS.addEventListener('click', function () {
            var show = !cc.debug.isDisplayStats();
            cc.debug.setDisplayStats(show);
            setCSSChecked(btnShowFPS, show);
            setCookie('showFPS', show.toString());
        });

 查找API手册:setDisplayStats:设置是否在左下角显示 FPS:定位于cocos2d/core/CCDebug.js:365,继续走:

setDisplayStats: function (displayStats) {
        if (cc.profiler) {
            displayStats ? cc.profiler.showStats() : cc.profiler.hideStats();
            cc.game.config.showFPS = !!displayStats;
        }
    }

    showStats () {
        if (!_showFPS) {
            generateAtlas();
            generateStats();

            if (_rootNode) {
                _rootNode.active = true;
            }

            cc.director.on(cc.Director.EVENT_BEFORE_UPDATE, beforeUpdate);
            cc.director.on(cc.Director.EVENT_AFTER_UPDATE, afterUpdate);
            cc.director.on(cc.Director.EVENT_AFTER_DRAW, afterDraw);
            _showFPS = true;
        }
    }

//  CCProfiler.jsfunction generateAtlas () {
    if (_atlas) return;

    let textureWidth = 256,
        textureHeight = 256;

    let canvas = document.createElement("canvas");
    canvas.style.width = canvas.width = textureWidth;
    canvas.style.height = canvas.height = textureHeight;

    // comment out this to show atlas
    // document.body.appendChild(canvas)

    let ctx = canvas.getContext('2d');
    ctx.font = `${_fontSize}px Arial`;
    ctx.textBaseline = 'top';
    ctx.textAlign = 'left';
    ctx.fillStyle = '#fff';
    
    let space = 2;
    let x = space;
    let y = space;
    let lineHeight = _fontSize;

    _atlas = new cc.LabelAtlas();
    _atlas._fntConfig = {
        atlasName: 'profiler-arial',
        commonHeight: lineHeight,
        fontSize: _fontSize,
        kerningDict: {},
        fontDefDictionary: {}
    };

    _atlas._name = 'profiler-arial';
    _atlas.fontSize = _fontSize;

    let dict = _atlas._fntConfig.fontDefDictionary;
    
    for (let i = 32; i <= 126; i++) {
        let char = String.fromCharCode(i);
        let width = ctx.measureText(char).width;
    
        if ((x + width) >= textureWidth) {
            x = space;
            y += lineHeight + space;
        }
        ctx.fillText(char, x, y);

        dict[i] = {
            xAdvance: width,
            xOffset: 0,
            yOffset: 0,
            rect: {
                x: x,
                y: y,
                width: width,
                height: lineHeight
            }
        }

        x += width + space;
    }

    let texture = new cc.Texture2D();
    texture.initWithElement(canvas);

    let spriteFrame = new cc.SpriteFrame();
    spriteFrame.setTexture(texture);

    _atlas.spriteFrame = spriteFrame;
}

可以看到,这个CCProfiler.js文件里面设置的就是绘制Canvas中调试信息的各种参数,进行修改以后,重新编译代码即可。

修改其中几个参数:

let _fontSize = 30;  //字体大小

let textureWidth = 512,  //canvas的长宽

textureHeight = 512;

ctx.fillStyle = '#000';  //字体颜色

right.x = 400; //右侧信息的x坐标,这个如果不修改,会导致左右重叠在一起

查看官方文档中有关定制引擎的内容:https://docs.cocos.com/creator/manual/zh/advanced-topics/engine-customization.html

只需要安装nodejs,npm,gulp,再在engine目录下调用gulp指令进行编译即可。

当然编译过程也是曲折的,缺少了很多包,逐个装上以后,终于编译通过,反复修改编译的时候,频繁出现这个堆内存溢出的错误:

....Ineffective mark-compacts near heap limit Allocation failed....

这个错误暂时没有发现好的解决方案,只能通过给node进程分配更多的内存来解决。不解决也可以,多编译几次就过了。

最终效果图:

Cocos Creator 初探:修改Engine来调整FPS信息显示

可以看到在没有修改Camera以及其他参数的情况下:FPS信息清晰显示在了左下角,颜色修改为黑色。

原来还真得改引擎啊!

点赞
收藏
评论区
推荐文章
Python进阶者 Python进阶者
2年前
基于HTML5打造的一款别踩白板小游戏
背景简介别踩白板这个游戏相信大家都玩过,这个是基于HTML5打造的简单小游戏,在PC端和移动端都能够运行,适应多种平台,今天我们使用原生JS搭配JQuery构建这个小游戏别踩白板。一、思路分析整体页面是一个大的矩形,长宽比例大概是3:2,然后游戏开始,不断有白板降落,然后一行是4个板,一块黑色板块,其余三块是白色板块,通过板块的点击事件绑定,然后判定是什么
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Karen110 Karen110
3年前
Python项目实战——手把手教你使用Django框架实现支付宝付款
一、前言大家好,我是Python进阶者。春节即将过去,大家过年期间肯定各种掏腰包花花花,小编相信大家在支付时候,微信、支付宝支付肯定是优先选择。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用Pythonweb框架Django来实现支付宝支付,废话不多说,一起来看看如何实现吧。二、建立django应用我们来建立一个Django项目然后在里面创建
Stella981 Stella981
3年前
SpringBoot配置lombok,与logback
目录:一什么是lombok二lombok安装三使用lombok四使用logback一什么是lombok  在写Java程序的时候经常会遇到如下情形:新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter,setter方法还有构造函数等。  lombok项目的产生就是为了省去我们手动创
Wesley13 Wesley13
3年前
Unity使用TUIO协议接入雷达
本篇文章不介绍Unity、TUIO、雷达是什么以及有什么作用。刚接触TUIO的亲们,建议直接硬刚。至于刚接触Unity的亲,这边建议亲直接放弃治疗呢!手机贴吧版泡泡(7)(https://oscimg.oschina.net/oscnet/45c3785a9c031956bcd9ba6243d37201f3f.png"手机贴吧版泡泡(7)")(
Stella981 Stella981
3年前
Spring Boot快速搭建
一.新建项目选择SpringInitiallizr,选择JDK版本为1.8,选择default的URL,然后选择下一步;修改项目信息,确保JDK版本与上文一直都为1.8,然后下一步;选择web选项,然后勾选web,下一步;修改项目名字和路径,然后创建完成;springboot创建完成的项目结构;SpringbootAppli
Wesley13 Wesley13
3年前
IDEA插件开发(一)——初识
下面我们通过创建一个小示例来学习。1.这里是列表文本打开IDEA,新建项目选择IdeaPlateformPlugin,界面如下所示:!截图1(https://static.oschina.net/uploads/img/201712/08135509_t1sv.png"在这里输入图片标题")2.输入项目名称,点击finish创
Stella981 Stella981
3年前
Creator模块介绍—领略模块化的力量
从Cocos2djs到Creator,一直以来都有模块裁剪的能力,可以将游戏中没有用到的功能代码,在编译输时移除,从而减少包体大小,这对H5游戏来说影响比较明显。Creator比Cocos2djs做的更好,通过主菜单项目设置模块设置有一个图形化的界面,可以方便模块配置。!(https://oscimg.oschina.net/oscnet
Easter79 Easter79
3年前
SpringBoot配置lombok,与logback
目录:一什么是lombok二lombok安装三使用lombok四使用logback一什么是lombok  在写Java程序的时候经常会遇到如下情形:新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter,setter方法还有构造函数等。  lombok项目的产生就是为了省去我们手动创
Stella981 Stella981
3年前
Cocos Creator导出场景和预制的问题
CocosCreator支持导出当前项目中的场景和预制为另一个项目所用:1,选择要导出的场景或者预制;2,选择要导出到的目标文件夹位置并进行可能的重新命名;3,导出一个压缩文件.zip。4,解压压缩文件.zip,然后可以拖动其中的内容到目标项目指定位置进行使用即可。但是也有一些小问题:1,