`

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

阅读更多
最新版的 chromium. 已经修复了这个bug

经过进一步测试 出现此问题的绝大多数是A卡

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

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

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

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

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

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

这么说可能不容易理解, 看图吧:


左边是其他支持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>




2
6
分享到:
评论
1 楼 superobin 2011-02-17  
那天我再开启了2dcanvas加速的chrome上跑我之前写的boxorz原型结果同样出现了这类的问题,clearRect的很混乱完全没法看

相关推荐

    在苹果和安卓手机平台中让DrawEngine在FMX中加速工作1

    3. 在 `FMX.Canvas.GPU.pas` 中添加一个全局变量 `lastCanvasHelper: TCanvasHelper`,并在 `TCanvasGpu.CreateResources` 方法中初始化,同时在 `TCanvasGpu.FreeResources` 方法中释放资源。 通过以上步骤,我们...

    基于canvas 2D实现微信小程序自定义组件-环形进度条

    本教程将探讨如何利用canvas 2D API来实现一个高效、可定制的环形进度条自定义组件。Canvas 2D 提供了一套丰富的绘图接口,让我们能够动态绘制复杂的图形,如环形进度条。 首先,我们需要了解canvas的基本使用。在...

    Canvas2D梯形拉伸.zip

    在JavaScript的世界里,Canvas2D API提供了一个强大的图形绘制平台,允许开发者在网页上进行动态图形操作。"Canvas2D梯形拉伸"的主题聚焦于如何利用Canvas2D API在不规则四边形(比如梯形)上进行图像的拉伸和绘制。...

    gpu.js:GPU加速JavaScript

    创建一个从javascript函数转换而来的GPU加速内核,该javascript函数计算512 x 512矩阵(2D数组)中的单个元素。 内核功能是在GPU上串联运行的,通常会导致非常快速的计算! 您可以在运行基准测试。 通常,根据硬件...

    微信小程序-新版海报分享canvas2d实现(淘宝、京东、拼多多等都在用)

    1、老版微信小程序canvas微信官方已经发声不再维护。 2、新版canvas2d海报,官方文档比较乱,开发起来难度大。 3、canvas2d生成海报效率高,资源开资少,性能强。 4、普通canvas生成海报比canvas2d稍慢。 5、通过...

    小游戏webgl与canvas2d混合使用demo

    3. **捕获Canvas2D为WebGL纹理**: 使用`canvas.toDataURL()`方法获取Canvas2D内容的位图数据,然后在WebGL中创建一个新的纹理,并将其数据加载到该纹理中。 4. **在WebGL中绘制纹理**: 在WebGL的渲染循环中,使用这...

    html 5 Canvas绘制2D背景1

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态的2D图形绘制。这个技术的引入极大地扩展了网页的交互性和视觉效果,使得开发者可以创建丰富的、自定义的图形,包括背景图像。在这个...

    html2canvas.js 下载

    在实际项目中,选择稳定且适合需求的版本非常重要,因为不同的版本可能修复了一些bug,或者增加了新的特性。 总结来说,html2canvas.js是一个强大的前端库,它为开发者提供了在浏览器环境中生成网页截图的能力,...

    Canvas2DtoWebGL:将(几乎)所有 Canvas2D 函数移植到 GPU,以便它可以与 WebGL 画布混合

    Canvas2DtoWebGL.js Canvas2DtoWebGL.js 将几乎所有方法从 HTML5 的常规 Canvas2D 上下文 (CanvasRenderingContext2D) 移植到 WebGL 调用,这允许在 2D Canvas 中混合 3D 或相反(创建 GUI、调试信息等),并且在...

    Canvas2D introduction.pptx

    在给定的示例代码中,首先通过`&lt;canvas id="c"&gt;&lt;/canvas&gt;`定义了一个 `&lt;canvas&gt;` 元素,并为其分配了ID `c`。接着通过 JavaScript 获取该元素,并调用 `getContext("2d")` 方法获取 2D 渲染上下文。此上下文提供了...

    【更新】一个HTML5 Canvas 2D & Dom 动画的demo 兼 性能测试.

    Canvas作为HTML5的一个核心元素,提供了在浏览器中绘制2D图形的能力,而DOM(Document Object Model)则允许我们操作HTML元素,实现动态交互。本项目提供了一个结合两者进行动画展示的demo,同时也作为一个性能测试...

    html2canvas-rc4.js和html2canvas.min.js

    HTML2canvas是一个JavaScript库,它的主要功能是将HTML页面或者DOM元素转换为Canvas图像或图片。这个库在前端开发中非常有用,特别是在需要保存网页截图或者实现动态生成图像的场景中。然而,像所有软件一样,...

    Genome2D, 2D GPU框架.zip

    Genome2D, 2D GPU框架 Genome2D什么是 Genome2D?Genome2D是一个面向游戏开发的多平台 2D GPU框架。 它使用 Haxe面向对象编程语言构建,使它能够部署到多个目标。 目前,Genome2D支持使用WebGL和Canvas回退和 F

    使用新版canvas-2d接口在微信小程序中生成二维码(外部二维码)的js包

    使用新版canvas-2d接口在微信小程序中生成二维码(外部二维码)的js包

    ecdevtools是支持canvas库的chrome调试工具

    它是一个专为Chrome浏览器打造的调试插件,极大地提升了canvas元素的调试效率。 ec-devtools的核心功能在于提供了一个直观的界面,允许开发者对canvas元素的样式和物理属性进行实时修改。通过这个工具,开发者可以...

    详解使用双缓存解决Canvas clearRect引起的闪屏问题

    因为功能简单,所以用了原生 canvas 实现这个功能。但在使用 clearRect 清除画布的时候会出现闪烁的情况。 代码实现(问题代码) 以下代码即为出现闪屏的关键代码,省略了图片的定义与 onload: // 点击二级菜单后...

    Canvas2D基础讲义

    Canvas2D是HTML5中的一个重要组成部分,用于在网页上进行动态图形绘制。它提供了一种JavaScript接口,使得前端开发者能够通过编程方式创建丰富的、交互式的2D图形。本讲义将深入探讨Canvas2D的基本概念、语法以及...

    html5 Canvas绘制2D背景2

    HTML5 Canvas是一个强大的Web图形接口,它允许开发者在网页上直接用JavaScript绘制2D图形。Canvas元素是HTML5新增的一部分,通过JavaScript API提供了丰富的绘图功能,为网页设计师和开发者提供了一个灵活且高效的...

    draw2d.js v2.9.1最新版本附带完整demo

    Draw2D.js是一个专门用于创建和编辑二维图形的JavaScript库,特别适用于绘制工作流图。最新版本v2.9.1为开发者提供了更多功能和优化,使其在前端应用中的表现更加出色。本文将详细介绍Draw2D.js的核心特性、使用方法...

    html5 Canvas绘制2D背景 7款

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态的2D图形绘制,无需依赖任何外部插件。"html5 Canvas绘制2D背景 7款"这个主题意味着我们将探讨七种不同的方法或者样式,利用Canvas API来创建...

Global site tag (gtag.js) - Google Analytics