[更新,bug修复了]chrome开启canvas 2D GPU加速后, clearRect的一个严重bug.

最新版的 chromium. 已经修复了这个bug

[color=red]经过进一步测试 出现此问题的绝大多数是A卡[/color]

=======================================

新版chrome 为我们带来了GPU加速.
但是chrome的GPU加速一直问题多多.
例如 开启之后速度反而变慢.

最近我开发的一个HTML5游戏引擎 在chrome中开启 GPU Accelerated Canvas 2D 后,
画面更是完全乱掉.

花了很多时间去排查到底是我的程序有了问题 还是chrome的问题
,如果是chrome的问题, 那么到底是哪部分出了问题.

最近终于被我找到了, 原来是 clearRect 开启 GPU Accelerated Canvas 2D 后, 无法正常工作, 会出现"清除了不该清除的区域,而该清除的却没有清除".

我写了一个具体的例子之后发现, 清除区域居然发生了垂直翻转.
(该例子 先将画布涂黑, 然后调用clearRect清除一些区域,清除的区域变透明).

这么说可能不容易理解, 看图吧:
[img]http://fins.iteye.com/upload/picture/pic/80616/f20666e8-f985-3a16-b1f0-a821764b5bf1.jpg[/img]

左边是其他支持HTML5 canvas的浏览器 以及 chrome关闭GPU加速后的正确结果.
右边则是开启GPU加速后 chrome的错误结果.

观察图片不能得出"发生了垂直翻转"的结论.

测试代码如下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Cache-Control" content="no-cache" />

<title>Test</title>


<script type="text/javascript">

var clearData=[
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,8,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,8,8,0],
[0,8,8,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,8,8,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,8,8,0,0,0,0,0,8,8,8,8,0,0,0,0,0,0,0,8,8,0,0,0,0],
[0,0,0,0,8,8,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,8,8,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,0],
[0,0,0,8,8,8,0,0,0,0,8,8,0,0,0,0,8,8,0,0,0,0,8,8,8,0,0,0],
[0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0],
[0,0,0,8,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,8,0,0,0],
[0,8,8,8,0,0,0,0,0,0,0,0,0,8,8,0,0,0,0,0,0,0,0,0,8,8,8,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
]

function testCanvasClearRect(){

var rectSize=16;
var rows=clearData.length;
var cols=clearData[0].length;


var canvas = document.getElementById("canvas1");

canvas.width= cols * rectSize ;
canvas.height= rows * rectSize ;

var ctx= canvas.getContext('2d');
// fill background with default color (black);
ctx.fillRect(0, 0, canvas.width, canvas.height );

for ( var r=0;r<rows;r++){
for ( var c=0;c<cols;c++){

var no=clearData[r][c];
var nx= c * rectSize;
var ny= r * rectSize;

// if the number in the array === 0 , call clearRect
if (no === 0 ){
ctx.clearRect(nx,ny, rectSize, rectSize);
}
}
}
}


function init(){
testCanvasClearRect()
}

</script>


</head>
<body onload="init()" >

<canvas id="canvas1" style="border:1px solid blue;" ></canvas>

</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值