egret优化--自动切换webgl模式

在egret项目中,在index可以选择renderMode,用来处理 是否开启webgl
在这里插入图片描述

在谷歌浏览器下可以查看

webgl模式:
在这里插入图片描述
canvas模式:
在这里插入图片描述

上图可以看到:webgl模式 和 canvas模式, 创建 的element 名字都是 canvas. 所以如果需要调用原生的element,修改层级关系.可以通过下面代码取到canvas对象

const _player = document.getElementsByClassName("egret-player")[0];
const _canvas = _player.getElementsByTagName("canvas")[0];

但是 webgl 模式下 会添加两个webgl相关的监听,用来处理相关 webgl相关的逻辑

WebGL 兼容性

使用 WebGL 渲染可以获得硬件加速渲染,获得性能上的提升。我们当然希望可以在所有环境中使用 WebGL 渲染。好消息 WebGL 正在获得更多更广泛的支持。在这里插入图片描述

egret webgl相关注意

  • WebGL 与脏矩形

    我们知道在 Egret Engine 2.5 版本开始提供自动脏矩形功能,通过减少重绘区域减少渲染的负担来获得程序性能上的提升。在开启自动脏矩形的模式下,只会重绘场景中实际移动的区域。由于实际上 WebGL 和 Canvas 渲染的原理是不同的,在 WebGL 渲染模式下是没有脏区域的。

    如果我们打开重绘区域显示,在 index.html 中设置 data-show-paint-rect:

    data-show-paint-rect=“true”

    在 Canvas 模式下我们可以看到重绘部分会被红色矩形包裹起来。而如果开启了 WebGL 渲染模式,发现并没有重绘区域,因为在 WebGL 模式下并没有脏区域。

  • 当引擎发现用户浏览器并不支持 WebGL 时,则会自动切换回到 Canvas 渲染模式中。

  • 文本和矢量绘图

    我们知道使用 WebGL 渲染是可以得到性能提升的。但在使用很多文本和矢量绘图的情况下,可能有更多的开销,起不到提升性能的作用。因为在 WebGL 渲染模式下文本和矢量绘图是需要在 Canvas 中缓存下来再渲染到 WebGL 中。由于多了在 Canvas 渲染的过程,如果使用大量的文本或者矢量绘图将不能得到相应的性能提升。

  • 在 WebGL 渲染模式中太多的 cacheAsBitmap 和 RenderTexture,因为每个相当于申请一个新的 canvas ,而 webglContext 的数量是有限制的,如果申请多了,之前的就会丢失。

  • WebGL 标准正在普及,在手机上有些特性支持还不是很友好。手机上非 Chrome 浏览器现在对不规则遮罩支持还不是很好,在使用 WebGL 渲染器时可以尽量避免使用不规则遮罩。

判断浏览器是否支持webgl

如果你只是单纯的想知道当前浏览器 是否支持webgl
可以直接在浏览器访问https://get.webgl.org/
如果浏览器支持webgl的话,可以看到下图效果
在这里插入图片描述

index中 js判断是否支持webGL

webgl模式下 会提升一部分性能,但是并不是所有的浏览器就支持开启webgl.

需要浏览器自动切换支持webgl的,切换到webgl模式

参考链接:https://www.cnblogs.com/jichi/p/10491632.html

代码如下:

var Detector = {
    canvas: !!window.CanvasRenderingContext2D,
    webgl: (function() {
        try {
            var canvas = document.createElement('canvas');
            return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));
        } catch(e) {
            return false;
        }
    })(),
    workers: !!window.Worker,
    fileapi: window.File && window.FileReader && window.FileList && window.Blob,
    getWebGLErrorMessage: function() {
        var element = document.createElement('div');
        element.id = 'webgl-error-message';
        element.style.fontFamily = 'monospace';
        element.style.fontSize = '13px';
        element.style.fontWeight = 'normal';
        element.style.textAlign = 'center';
        element.style.background = '#fff';
        element.style.color = '#000';
        element.style.padding = '1.5em';
        element.style.width = '400px';
        element.style.margin = '5em auto 0';
        if(!this.webgl) {
            element.innerHTML = window.WebGLRenderingContext ? [
                'Your graphics card does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" rel="external nofollow" rel="external nofollow" style="color:#000">WebGL</a>.<br />',
                'Find out how to get it <a href="http://get.webgl.org/" rel="external nofollow" rel="external nofollow" style="color:#000">here</a>.'
            ].join('\n') : [
                'Your browser does not seem to support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation" rel="external nofollow" rel="external nofollow" style="color:#000">WebGL</a>.<br/>',
                'Find out how to get it <a href="http://get.webgl.org/" rel="external nofollow" rel="external nofollow" style="color:#000">here</a>.'
            ].join('\n');
        }
        return element;
    },
    addGetWebGLMessage: function(parameters) {
        var parent, id, element;
        parameters = parameters || {};
        parent = parameters.parent !== undefined ? parameters.parent : document.body;
        id = parameters.id !== undefined ? parameters.id : 'oldie';
        element = Detector.getWebGLErrorMessage();
        element.id = id;
        parent.appendChild(element);
    }
};



通过调用Detector.webgl,如果返回true为支持,false为不支持。

添加到index里 动态切换就可以了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值