- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的这幅 Canvas 动画展示了一些奇怪的特征:
http://jsbin.com/olasol/2/edit
我使用的是最新版本的 Chrome。我正在使用 Chrome 的内置 FPS 监视器(您可以通过转到 about:flags
来激活它)。我在 JavaScript 部分标记了我认为是潜在罪魁祸首的行:
fallingctx.clear();
这一行没有什么特别的。它调用一个函数,该函数又调用 clearRect()
。
我注意到的“奇怪”的事情是:
clear();
函数在我的笔记本电脑 (Core 2 Duo) 上导致非常明显的 FPS 下降,但在我的台式机 (i5 2500k) 上却没有。
仅删除该行就足以在我的笔记本电脑上产生 60fps。正如预期的那样, Canvas 不会在每一帧后清除,但它仍然会产生稳定的 60fps。
FPS 下降仅在我的 Chrome 窗口较大时发生!当我缩小窗口并重新加载时,它不会发生! (清除更大的矩形是否更昂贵?)。
我尝试用全白 JPEG 的 drawImage()
替换 clear()
以覆盖 Canvas 。 JavaScript 能够在每个周期为较小的图像粒子执行 200 次 drawImage()
(从第二点可以看出)。但是,当我为整个 Canvas 添加一个 drawImage
时,它再次滞后! (确保输出占据整个屏幕以重现结果。)
为什么会发生这一切?我该如何解决?
最佳答案
它确实取决于硬件,但想想调用clearRect
必须做什么!本质上必须将一 block 足够大的内存清零以处理 Canvas 内容。这可能代价高昂。想一想在高清分辨率下需要多少内存来保存 RGBA...那是超过 200 万像素的数据,大约 8 MB 字节无可否认,现在一般情况下还不是那么多,但是如果有的话与将内存推送到视频卡或您每秒执行 60 次操作相关的任何带宽或缓存问题……好吧,预计会出现问题。
我听说经常起作用的只是清除以前绘制图像的位置。参见 http://jsbin.com/olasol/6/edit
我为您做了以下更改。
for (var i=0; i< noOfDrops; ++i)
{
fallingctx.clearRect(
fallingDrops[i].x-1,
fallingDrops[i].y-1,
fallingDrops[i].image.width+2,
fallingDrops[i].image.height+2);
}
for (var i=0; i< noOfDrops; ++i)
{
fallingDrops[i].y += fallingDrops[i].speed; //Set the falling speed
fallingctx.drawImage (fallingDrops[i].image, fallingDrops[i].x, fallingDrops[i].y);
}
我需要 clearRect
around 渲染图像的位置可能有一个很好的理由,但一个简单的原因让我无法理解。 (这与不完全在指定像素处呈现的事物有关......我完全忘记了)。
你还需要做一些关于你在加载图像之前启动渲染循环的事实(也在 jsbin 中)所以我添加了
var imgSource = "http://lorempixel.com/20/20/sports/";
var imgObj = new Image();
并替换了superinit
function superinit()
{
imgObj.onload = function(){
flowerfallsetup();
requestAnimFrame(flowerfall);
}
imgObj.onerror = function (){
alert("could not load image");
}
imgObj.src = imgSource;
}
编辑:由于先前的图像设置,我忘了提及,我确实更改了您的 flowerfallsetup
中的行:
fallingDr["image"] = imgObj;
有很多方法可以处理图片的异步加载,我只是选择了一种对这个例子来说很容易的方法。
编辑:我不得不承认,这可能还有更多内容。它在桌面浏览器上运行良好,但在 iPhone 上, 存在裁剪问题。如果我能找出导致问题的原因,我会尝试发布更新。
关于javascript - context.clearRect() 真的那么贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529153/
所以我每秒做一个正方形,沿着页面慢慢移动。然后我调用 clearRect 来清除 Canvas ,这样旧的方 block 就会被移除,只剩下新的方 block ,但我做错了什么, Canvas 没有被
似乎 clearRect 没有将我的 BufferedImage 设置为透明而是黑色。创建一个新的 BufferedImage 可以,但我不想产生太多垃圾。我的国际象棋程序有以下代码: //graph
ClearRect 的工作方式很奇怪;我试图刷新 Canvas ,但它不适用于此代码 Crypt
为准备 Flash 的衰落,我正在尝试在 AS3 和 Javascript 之间转换。 然而,有些事情让我感到困惑(可能是由于缺乏知识)。在 Flash 中,我可以创建并明确修改我在舞台上绘制的对象的
我正在用 javascript 做一个 Pong 游戏来学习制作游戏,我想让它面向对象。 我无法让 clearRect 工作。它所做的只是画一条越来越长的线。相关代码如下: function Ball
我在正文 onmousemove 函数上使用此脚本: function lineDraw() { // Get the context and the canvas: var canv
所以我用 JavaScript 制作了这个太空入侵者游戏。我现在的问题是,当敌人左右移动时,他们不会清除矩形,因此您可以看到他们的镜头,如下所示: 我只是想知道我可以解决什么问题来解决这个问题。如果您
我正在尝试在 Canvas 中绘制矩形,用户单击该点并移动鼠标,将绘制矩形,完成后只剩下一个矩形,即最后一个。然而使用 let canvas = document.querySelector("can
我在 HTML5 Canvas 上使用 clearRect 重绘矩形。使用浮点坐标时,clearRect 在 Canvas 上留下我的矩形的边框。 以下代码演示了使用整数坐标的矩形被完全清除而使用浮点
我的这幅 Canvas 动画展示了一些奇怪的特征: http://jsbin.com/olasol/2/edit 我使用的是最新版本的 Chrome。我正在使用 Chrome 的内置 FPS 监视器(
我想用 Canvas 在一张图片上画多幅画。 在我的代码中,我使用 ctx.clearRect(0,0,canvas.width,canvas.height);因此,它不允许我做多幅画。如果我没有使用
我在工作中遇到了一个用 Canvas 构建东西的奇怪边缘案例。 clearRect 在绘制从 Canvas 顶部到底部的垂直线时不会清除 Canvas 。渲染其他东西时,clearRect 工作正常。
这不是完整的代码,其他部分只是大括号和一些函数。它是循环中要做的事情的主要部分。我想要获得具有边框半径(如 Angular )的矩形,以便通过它们查看 Canvas 下的内容。但我只是第一次得到cle
我想知道如何改变我的Javascript以仅清除掉落的 Sprite ,而不是整个 Canvas (就像目前所做的那样)。 我希望在 Canvas 上放置多个其他(动画) Sprite ,这些 Spr
我有一些代码应该清除 rect() 中 50px 宽的间隙。但由于某种原因它不起作用。我尝试了几种不同的方法,但似乎无法使其发挥作用。任何帮助将不胜感激! 我的代码 var canvas = docu
我正在研究 html canvas 并尝试制作简单的动画。我想让矩形向右移动。你可以在这里查看我的代码。 http://codepen.io/inkluter/pen/GgeQqj var x = 0
下面的代码适用于 Chris 类(class)“圆周运动”教程,但我不明白为什么我的clearRect 不起作用。这一定是我没有看到的东西,我现在还有另外两个 Canvas 动画正在工作,但这一个不会
我想用 javascript 和 html canvas 制作一个动画,只是让一个矩形从窗口的顶部移动到底部,我使用 canvas.clearRect 清除 Canvas 上的所有像素,但是,看起来这
我是 HTML5 新手,开始学习 Canvas 。 目前,我正在使用 Canvas 使一些对象旋转。我创建的矩形确实会移动,但是,我遇到了一个问题,在对象移动后,一些阴影仍然存在,正如您从我捕获的图像
我正在为 html5 canvas 制作一个文本缓存系统。我需要知道哪一个性能更好。使用 clearRect 清除现有 Canvas 还是再次创建 Canvas ? 编辑:添加了一些代码。 funct
我是一名优秀的程序员,十分优秀!