调查:是否还有玩家的手机浏览器是只能跑 Canvas 的呢?

可以根据5.0以下的占比来看。 不过,这是googleplay的。 要是能拿到微信的就更好了。

1赞

找到了 ·· 是deleteframebuffer的问题 去掉就可以了

cc.director.once(cc.Director.EVENT_AFTER_DRAW, () => {
var target = tar._sgNode;
//设置节点位置否则会在左下角
tar.opos = tar.getPosition();
tar.setPosition(tar.width/2,tar.height/2);

        // 以下width, height变量为局部截图的宽高
        var width = tar.width;
        var height = tar.height;
        // 用rt截图
        var rt = cc.RenderTexture.create(width,height,cc.Texture2D.PIXEL_FORMAT_RGBA8888, gl.DEPTH_STENCIL);
        rt.begin();
        rt.beginWithClear(0,0,0,0)
        target.visit();
        rt.end();
        tar.setPosition(tar.opos);

        let texture = rt._texture._glID;
        let frameBuffer = gl.createFramebuffer();
        gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);
        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
        // 每个像素点需要rgba四个值
        let data = new Uint8Array(width * height * 4);
        gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);

        // RenderTexture截出来的图是反向的,下面这段代码通过把data数组反向,来把图像反过来。
        let halfHeight = Math.floor(height / 2);
        let bytesPerRow = width * 4;
        let temp = new Uint8Array(width * 4);
        for (let y = 0; y < halfHeight; ++y) {
            let topOffset = Math.round(y * bytesPerRow);
            let bottomOffset = Math.round((height - y - 1) * bytesPerRow);
            temp.set(data.subarray(topOffset, topOffset + bytesPerRow));
            data.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow);
            data.set(temp, bottomOffset);
        }
        // RenderTexture截出来的图是反向的,上面这段代码通过把data数组反向,来把图像反过来。
        //不知道什么原因这行会导致canvas整体被拉伸 但是删除这句话会导致画面固定 = =
        //gl.deleteFramebuffer(frameBuffer);

        // 创建一个2D Canvas来保存截图结果
        let canvas = document.createElement('canvas');
        canvas.width = width;
        canvas.height = height;
        let context = canvas.getContext('2d');
        let imageData = context.createImageData(width, height);
        imageData.data.set(data);
        context.putImageData(imageData, 0, 0);

        // str即为截图结果
        var str = canvas.toDataURL('image/png');

});

1.9.3目前webgl可用的针对任意节点的截图方法(未完善)
deleteframebuffer后的canvas绘制有问题 输出查看canvas大小和缩放是正常的

如果有大佬有时间希望看看能给个方法不···

请单独发贴,不要挖坟

是我失策了,之前我统计的时候,只统计了国内用户,我曾以为…… 国内已经能代表最落后的版本了,哈哈哈。后来有 CP 反馈,他们的游戏要发往非洲等国家……………… Canvas 还是有需求的。不过开弓没有回头箭,我们也确实没办法在保持 WebGL 架构比较精简的前提下兼容 Canvas 了。

怎么强制使用WebGL

2.0 开始只有 webgl 了,不用操心这个

后面版本还有计划支持么?

没有了~ Laya 最近也宣布不支持 Canvas 了