Javascript 我如何知道HTML5画布';渲染完成了吗?

Javascript 我如何知道HTML5画布';渲染完成了吗?,javascript,html,canvas,html5-canvas,Javascript,Html,Canvas,Html5 Canvas,html: 我想在画布完成渲染后显示警报。但在绘制图像之前会显示警报 如何等待GUI线程完成渲染?作为一种解决方法,您可以尝试以下操作: var img = new Image(), cnv = document.getElementById('cnv'); var context = cnv.getContext('2d'); img.onload = function () { context.drawImage(img, 0, 0, 786, 1113);

html:

我想在画布完成渲染后显示警报。但在绘制图像之前会显示警报


如何等待GUI线程完成渲染?

作为一种解决方法,您可以尝试以下操作:

var img = new Image(),
    cnv = document.getElementById('cnv');

var context = cnv.getContext('2d');

img.onload = function () {

    context.drawImage(img, 0, 0, 786, 1113);
    alert('finished drawing');

}

img.src = 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png';

作为一种解决方法,您可以尝试以下方法:

var img = new Image(),
    cnv = document.getElementById('cnv');

var context = cnv.getContext('2d');

img.onload = function () {

    context.drawImage(img, 0, 0, 786, 1113);
    alert('finished drawing');

}

img.src = 'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png';

Canvas
drawImage
是同步的。甚至

您的问题是
alert()
正在阻塞,甚至真正阻塞

我的意思是,它不仅会阻止js执行,还会阻止页面呈现。因此,浏览器已将您的图像绘制在画布上,但在您调用
alert()
时尚未显示图像

应始终避免使用
警报
,并用普通DOM元素替换它


Ps:您的图像确实已经绘制在画布上。

canvas
drawImage
是同步的。甚至

您的问题是
alert()
正在阻塞,甚至真正阻塞

我的意思是,它不仅会阻止js执行,还会阻止页面呈现。因此,浏览器已将您的图像绘制在画布上,但在您调用
alert()
时尚未显示图像

应始终避免使用
警报
,并用普通DOM元素替换它

Ps:您的图像确实已经绘制在画布上。

双缓冲画布 屏幕画布有两个像素缓冲区。一种称为后缓冲区,所有渲染都直接到后缓冲区进行。进行渲染调用时,
ctx.drawImage(foo,0,0)函数在绘制后缓冲区像素之前不会返回。即使GPU正在进行渲染,而CPU什么也不做,Javascript也会等到渲染完成后再转到下一行

当画布在屏幕上时,在当前执行完成之前,您不会看到任何渲染的结果

//after the rendering
setTimeout(function(){
 alert("Yay");
 },100);
myLoop
函数返回且javascript无事可做时,DOM将看到画布backbuffer已更改。然后,它将后缓冲区移动到前缓冲区,以便创建显示信号的硬件可以看到它

这称为双缓冲,它可以阻止在绘制到屏幕时产生的剪切和闪烁等瑕疵,并且屏幕在渲染完成之前显示部分渲染

//after the rendering
setTimeout(function(){
 alert("Yay");
 },100);
当画布在屏幕外时,没有前缓冲区

所有DOM内容也是如此。

双缓冲画布 屏幕画布有两个像素缓冲区。一种称为后缓冲区,所有渲染都直接到后缓冲区进行。进行渲染调用时,
ctx.drawImage(foo,0,0)函数在绘制后缓冲区像素之前不会返回。即使GPU正在进行渲染,而CPU什么也不做,Javascript也会等到渲染完成后再转到下一行

当画布在屏幕上时,在当前执行完成之前,您不会看到任何渲染的结果

//after the rendering
setTimeout(function(){
 alert("Yay");
 },100);
myLoop
函数返回且javascript无事可做时,DOM将看到画布backbuffer已更改。然后,它将后缓冲区移动到前缓冲区,以便创建显示信号的硬件可以看到它

这称为双缓冲,它可以阻止在绘制到屏幕时产生的剪切和闪烁等瑕疵,并且屏幕在渲染完成之前显示部分渲染

//after the rendering
setTimeout(function(){
 alert("Yay");
 },100);
当画布在屏幕外时,没有前缓冲区


所有DOM内容也是如此。

使用timeout
setTimeout(函数(){alert('finished drawing');},200)使用超时<代码>设置超时(函数(){alert('finished drawing');},200)不是一个真正的bug不。@kaido:规范说它是同步的。代码说它不是->错误不,你没有正确阅读代码,只要检查imageData,你就会看到它是同步的。页面呈现(CSS+媒体+…)并不是一个真正的错误。不。@kaido:规范说它是同步的。代码说它不是->错误不,你没有正确阅读代码,只要检查imageData,你就会看到它是同步的。什么不是页面呈现(CSS+媒体+…),如果它真的是同步的,那么它不应该在返回之前完全呈现吗?不,在firedive得到它之前,呈现被警报阻止。但是如果它实现得很好,它不是drawImage->render Canvas->Wait Browser rendering->Wait OS rendering return否!!!您如何在同一帧上制作多个drawImage+图像处理???那么。。DOM渲染和js是两个不同的线程,但只有一个线程可以运行,是吗?如果它真的是同步的,那么它不应该在返回之前完全渲染吗?不,渲染在firedive获得之前被警报阻止。但是如果它实现得很好,它不是drawImage->render Canvas->Wait Browser rendering->Wait OS rendering return否!!!您如何在同一帧上制作多个drawImage+图像处理???那么。。DOM渲染和js是两个不同的线程,但它们中只有一个可以运行,是吗?