gpt4 book ai didi

javascript - CSS缩放比drawImage缩放更有效吗?

转载 作者:行者123 更新时间:2023-12-02 22:54:09 24 4
gpt4 key购买 nike

我想知道缩放与 drawImage 有什么区别CSS 是。我都尝试过,CSS 似乎给出了稍微平滑的结果,而 drawImage往往会有点扭曲 - 特别是当我平移图像时,在几个动画帧的过程中从不同的源 x 和 y 进行位 block 传输。我在对许多不同的比例因子进行测试后得出了这个结论。我在下面有一个简单的例子。

var img = new Image();
var ctx = document.querySelector("canvas").getContext("2d");

img.src = "img1000x1000.png";// width and height are 1000

ctx.canvas.width = 100;
ctx.canvas.height = 100;
ctx.imageSmoothingEnabled = false;

这会在 img 完全加载后运行。

// method 1 uses drawImage to scale
ctx.drawImage(img, 0, 0, 100, 100, 0, 0, 200, 200);

// method 2 draws the img with no scaling and then uses css to scale
ctx.drawImage(img, 0, 0, 100, 100, 0, 0, 100, 100);
ctx.canvas.style.width = 200;
ctx.canvas.style.height = 200;

请记住,我并不总是精确地缩放 2 倍大小,并且我是从 img 的不同区域进行位 block 传输。我只将整数交给drawImage,以尽可能保持清晰。我还有image-rendering:pixelated以及在 CSS Canvas 上定义的其他变体,用于 CSS 缩放以保持清晰。

我知道对于我的具体示例,我可以将 img 放大一次并平移最终缩放的 img,但这不是问题。问题是哪个性能更高。对于我的应用程序,我必须在每一帧上放大动画图 block map ,因此我从多个源传输到 1:1 空间的 Canvas ,然后使用 requestAnimationFrame 将最终 Canvas 每秒放大 30 到 60 倍。

最终,他们给出了非常相似的结果。 CSS 几乎没有比原始图像更清晰和真实。 CSS 更快/更高效吗?或者使用drawImage进行缩放性能更高吗?

注意/编辑:

我发现如果我使用标准模式 <!DOCTYPE html>我必须将字符串值传递到 style.widthstyle.height对于 CSS 方法。因此,如果您使用标准模式,请确保将它们设置为 "200px"而不仅仅是200否则你的 Canvas 将无法缩放。

最佳答案

Canvas Alpha 与众不同

为了获得最佳效果,您应该保持 Canvas 大小与其分辨率相同。如果 Canvas 没有任何透明像素,您应该关闭 Alpha。

使用 const ctx = canvas.getContext("2d",{alpha: false}) 关闭 Canvas alpha

缩放无关

对于大多数设备来说,缩放并不比绘制未缩放的图像更昂贵。

渲染成本取决于绘制的像素数量,而不是源中的像素数量。

估计渲染成本

drawImage的成本

如果 Canvas 分辨率为 200 x 200,并且您绘制一个图像 ctx.drawImage 来填充需要渲染的 40,000 像素。

合成成本

如果通过 CSS 规则缩放 Canvas ,即使 alpha 关闭, Canvas 元素也必须合成才能显示。成本将是 Canvas 大小占用的像素数。

如果 Canvas 的 alpha 值为 true,那么它必须与背景合成,因此渲染成本是 Canvas 的显示大小(以像素为单位)。

如果 Canvas 大小 (CSS) 与分辨率匹配并且 Alpha 关闭,则不需要为最终演示文稿合成 Canvas ,并且没有额外的合成成本。

渲染成本示例

  • canvas 是可见的 Canvas 元素
  • image 是适合 GPU RAM 的图像

最好关闭 Alpha 且无 CSS 缩放

canvas.width = canvas.height = 100;
canvas.style.width = canvas.style.height = "100px";
const ctx = canvas.getContext("2d", {alpha: false});
ctx.drawImage(image, 100, 100);

// Total rendering cost 100 * 100 = 10,000 pixels

通过 CSS 和 alpha 进行缩放

canvas.width = canvas.height = 200;
canvas.style.width = canvas.style.height = "100px";
const ctx = canvas.getContext("2d", {alpha: false});
ctx.drawImage(image, 200, 200);

// Total rendering cost 200 * 200 + 100 * 100 = 50,000 pixels

开启 Alpha 渲染,无 CSS 缩放

canvas.width = canvas.height = 100;
canvas.style.width = canvas.style.height = "100px";
const ctx = canvas.getContext("2d"); // alpha is on
// same as const ctx = canvas.getContext("2d", {alpha: true});
ctx.drawImage(image, 100, 100);

// Total rendering cost 100 * 100 + 100 * 100 = 20,000 pixels

注释

  • 由于页面设置、滚动和各种其他因素,不可避免地会产生渲染成本。这些成本被忽略,因为它们无法避免。
  • 关闭 Alpha 的选项可能不适用于所有浏览器。
  • 软件渲染和设备功能将对渲染性能产生最显着的影响。

关于javascript - CSS缩放比drawImage缩放更有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58062934/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com