在egret项目中,在index可以选择renderMode,用来处理 是否开启webgl

EEM优化是什么_egret

在谷歌浏览器下可以查看

webgl模式:

EEM优化是什么_egret_02


canvas模式:

EEM优化是什么_webgl_03

上图可以看到: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 正在获得更多更广泛的支持。

EEM优化是什么_EEM优化是什么_04

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的话,可以看到下图效果

EEM优化是什么_webgl_05

index中 js判断是否支持webGL

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

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

参考链接:

代码如下:

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里 动态切换就可以了