在 Chrome 上将 drawImage 与 Canvas 结合使用非常慢

2024-01-08

我一直在尝试使用drawImage 将SVG 文件的大量实例绘制到画布上。通过使用 SVG 作为源创建单个图像元素,然后对画布上的每个实例使用 drawImage,我希望即使有大量实例也可以非常快速地在画布中生成合成图像。

就性能而言,这在 Firefox 中效果很好 - 我可以在大约 300 毫秒内绘制 60,000 个实例。但在 Chrome 上速度非常慢:16,000 个实例花费了 5 秒多的时间。我已经把代码的一个版本放在jsfiddle http://jsfiddle.net/7tgL3/11/,它演示了 Chrome 上的问题。

下面有一个如何调用 drawImage 的示例,其中画布上填充了尽可能多的 size x size 图像。我读过一条建议,尝试使用第二个隐藏画布来缓冲所有实例,然后通过一次调用更新可见画布。但这并没有影响性能,各个drawImage调用似乎仍然让事情陷入困境。

关于出了什么问题以及我能做些什么来解决它有什么想法吗?

            svgImg = new Image;

            can.width = 1800; can.height = 900;
            svgImg.onload = function () {
                if (internalSize == size)
                    return;
                internalSize = size;
                var timeBefore = new Date().getTime();
                var tot = 0;

                var canWidth = can.width;
                var canHeight = can.height;
                for (var x = 0; x < canWidth; x += size) {
                    for (var y = 0; y < canHeight; y += size) {
                        ctx.drawImage(svgImg, x, y, size, size);
                        tot++;
                    }
                }
                document.getElementById('count').innerHTML = "Total Count: " + tot;
                var timeAfter = new Date().getTime();
            };
            svgImg.src = "http://www.w3.org/Icons/SVG/svg-logo.svg";
            svgImg.width = size;
            svgImg.height = size;

减速 1:当源画布或目标画布位于 RAM 中且另一个画布位于 GPU 中时发生。

减速 2:当 src 和 dest 画布尺寸不同时发生


相关错误:http://code.google.com/p/chromium/issues/detail?id=170021 http://code.google.com/p/chromium/issues/detail?id=170021

我注意到了同样的问题,并将情况简化为将一张空白画布绘制到另一张空白画布上。当画布尺寸相同时,这似乎不是问题,但在某个时刻,性能会急剧下降。这里是jspref http://jsperf.com/drawimage-large-canvas-to-small,以及我的结果:

请注意 255x255 到 100x100 和 260x260 到 100x100 之间的差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Chrome 上将 drawImage 与 Canvas 结合使用非常慢 的相关文章

  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • 使用flex-basis控制行上显示的项目数

    我想在使用 Flex 时将元素推出以隐藏它们 例如 如果flex basis为 50 仅显示两个项目弯曲到给定空间 而其他元素则在overflow hidden 领土 Or if flex basis为 25 则仅显示 4 个 Flex 元
  • 使用变量显示文本的 HTML

    我正在 HTML 中创建一个复选框 如下所示
  • 使用 z-index 的链接在 Firefox 和 IE 中无法单击,即使它位于顶部

    我试图让文本链接出现在部分透明图像的顶部 而该图像又位于纯色背景的顶部 我希望在打印页面时打印链接文本和图像 但不打印彩色背景 这就是为什么我不使用背景图财产 问题在于 虽然链接显示在图像顶部 并且图像按需要显示在背景顶部 但无法单击该链接
  • CSS3 - 性能最佳实践是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 需要存储表的属性值以用于空手道中的断言

    我有一个情况 定位器没有文本值 但它的名为 title 的属性有一个我需要断言的文本值 在为其编写自定义定位器时 我只能获取文本值 而不是特定的属性值 例如 title abcdd Example div class table cell
  • 在phonegap中的两个html页面之间传递数据

    我正在使用phonegap 来创建移动应用程序 我不想将所有内容都放在一个 html 页面中 因此我创建了其中的一些内容 每一个都附有 js 文件 如何在这些 html 页面之间发送数据 最便携和最简单的方法是使用本地存储 http doc
  • 喜欢和不喜欢用户对产品的评论

    用户架构 var UserSchema new Schema review likes type String review dislikes type String 审查架构 var ReviewSchema new Schema pro
  • 通过php变量的值设置输入字段的值

    我有一个简单的 php 计算器 代码是 h1 align center This is PHP Calculator h1
  • 正则表达式从 img 标签获取 src 值

    我正在使用以下正则表达式来获取src第一个的值imgHTML 文档中的标签 string match src
  • Javascript 制作音频 blob

    我正在测试 html 音频标签 我想制作音频 blob url 就像 youtube 或 vimeo 那样 并将其添加到 src 开始播放音频 我一直在测试new Blob and URL createObjectURL 但我不知道如何使用
  • Opera 中 margin-bottom 的计算方式不同

    我有一个具有相对位置的 div 和一个具有绝对位置的子 div div class out div div div CSS container width 100px height 100px position relative insid
  • 使绝对定位的div扩展父div高度

    正如你在下面的 CSS 中看到的 我想要child2将自己定位在之前child1 这是因为我目前正在开发的网站也应该在移动设备上运行 在移动设备上child2应该位于底部 因为它包含我想要在移动设备上的内容下方的导航 为什么不是 2 个母版
  • 如何在引导程序中制作两个等高的列?

    我有这个代码 HTML div class container fluid div class row div class col md 6 p Line p p Line p p Line p p Line p p Line p p Li
  • 输入字段名称以数字开头

    我有一个输入字段 其名称是 MD5 字符串 例如
  • 在 R 中,为什么 sum 与其他方法(例如 cumsum)相比如此慢?

    我正在尝试实现一个需要非常快的函数 主要是因为它一遍又一遍地处理巨大的数据帧 R 总是让我感到困惑 为什么它有时有点慢 而有时又慢得离谱 不幸的是 它从来都不快 不管怎样 我一直认为 如果可能的话 当以某种方式推入 apply sapply
  • HTML/CSS:页面左侧的导航栏

    我发现创建这样具有良好语义的布局很尴尬 左侧是大约 150 像素宽的列 其中包含导航元素 我想将网站这部分的 HTML 放在 HTML 代码的开头 然后有一个简单的方法来强制页面的其余部分不侵占左侧的区域 150 像素列 我考虑过一些选择
  • 将 div 附加到另一个 div 的右侧

    我有一个 div 它就像一个容器 里面有 2 个图像 一张图像位于 div 的左侧 另一张图像位于右侧 我的容器是Bootstrap的容器 它们都用 div 包裹 并且div s position is fixed 我的问题是我无法找到要附
  • 检测 html 选择框上的编程更改

    有没有办法让 HTML 选择元素在每次以编程方式更改其选择时调用函数 当使用 JavaScript 修改选择框中的当前选择时 IE 和 FF 都不会触发 onchange 此外 更改选择的 js 函数是框架的一部分 因此我无法更改它以在结束
  • Flexbox 列的垂直间距相等

    我在CSS中努力让我的Flexbox在垂直等距的列中显示项目 从而使列的每行之间的空间均匀 html body flex container margin 0 height 100 width 100 body font family Dr

随机推荐

  • 为什么 BindingSource 不告诉我哪个属性已更改?

    我正在考虑使用数据绑定 最简单的事情似乎是使用 BindingSource 来包装我的数据对象 然而 虽然 CurrentItemChanged 事件告诉我属性何时发生更改 但它并没有告诉我是哪一个属性发生更改 而这是我需要的重要部分 有什
  • 动画关键帧的 scss 函数

    我想做一个可重用的 sass 函数 让我可以轻松编写 keyframescss 动画 无需编写太多代码 但我不知道如何去做 尤其是数学部分 我有一个包含带有此 css 的单个背景图像的 div height 100vh width 8000
  • 与页面交互时图像质量第二次下降

    当页面以任何方式移动时 窗口大小调整 滚动 悬停 用作图标的图像会重新渲染并使侧面变得粗糙 它在具有透明背景和圆形边框的图像上非常明显 如示例中所示 有什么办法解决这个问题吗 例子 img src http www iconsd
  • 基本 Firebase 数据库保存

    任何人看到下面的内容都是正确的答案 并且我的所有设置都正确 我仍然不知道问题是什么 我用 facebook 登录 用它来创建一个 firebaseuser 对象 然后发送以下内容作为测试数据 我发现这是一个间歇性问题 从设备上卸载应用程序并
  • Reactjs - 控制多个复选框

    我在 Reactjs 中构建了一个 CheckAllBoxes 组件 我有一个物品清单 fruits orange apple grape 将军
  • 如何在不使用“return”语句的情况下退出异步协程?

    我在决定如何打破这个协程时遇到了一些麻烦 如果except声明捕获 通常 我只会使用 def f x try foo var next a volitile generator x except Exception print it bro
  • 如何在 Room 中动态创建新表?

    请帮帮我 在我的应用程序中 用户可以通过按按钮创建新的数据库表 用户还可以稍后访问该表以接收其中的数据 目前我通过 dataBaseHelper 类利用旧的 SQLite 所以我可以 public static void createTab
  • 如何在 Airflow 中的 PythonOperator 中登录 Python 函数

    我在 Airflow DAG 中使用 PythonOperator 并且需要在操作符的 Python 函数中打印一些内容 我尝试打印 但显然没有成功 不太确定这会起作用 接下来我尝试在 PythonOperator 中传递 self log
  • XAML 中的属性 Duration 不允许值类型 Duration

    我正在尝试使用普通的 Windows Metro 风格应用程序执行以下操作 public class MyButton Button public Duration Duration get set
  • 元类冲突:基类和派生类具有不同的元类

    class AbstractBaseClass metaclass abc ABCMeta abc abstractmethod def someMethod class DerviedClass AbstractBaseClass met
  • Sqlite + Java:表未更新

    我正在使用 SQLite 的 Java 包装器 名为SQLiteJDBC http www zentus com sqlitejdbc 这可能会对任何答案产生一些影响 我有一个在 GUI 中显示的表 在该 UI 中 我有一个用于该表的单个行
  • 地址可达性 - 服务器和端口 - iOS 5

    我正在尝试检查服务器是否在线或离线 连接到服务器时我面临一个问题 即它有一个端口 我现在的代码 struct sockaddr in address address sin len sizeof address address sin fa
  • 需要帮助用delphi打印文本文件

    我正在尝试使用 Delphi 2010 打印文本文件 我找到了一些代码 但是当我运行时 它要求保存 xps 文件 但不显示打印对话框 代码位于http www delphipages com forum showthread php t 7
  • curl 可以工作,但不会在 BASH 脚本中执行

    以下curl 命令在命令行中运行 我从服务器得到了有效的响应 curl X POST https somebaseurl api v1 auth login H Content Type application json d email f
  • Jersey / ServletContext 和启动时加载资源

    我是 Java Web 开发领域的新手 我正在开发一个网络服务 我选择了 REST Jersey for it 我想在服务启动时初始化一些东西并保留它们 贯穿整个服务生命周期 第一个问题 构造函数是JerseyServlet 是做这件事的好
  • 解析 Facebook logInInBackgroundWithReadPermissions (Swift)

    我已成功设置 Parse 1 7 1 SDK 和 Facebook v4 SDK 设置桥接头文件和 AppDelegate swift 现在在我的 ViewController 中 我正在尝试创建 Facebook 登录 并且我正在尝试使用
  • read.csv 在 R 中警告“EOF 在引用的字符串中”,但在 EXCEL 中成功读取

    我尝试读取从下载的 csv 文件here https d396qusza40orc cloudfront net repdata 2Fdata 2FStormData csv bz2 我用下面的代码阅读 storm data read cs
  • 网络爬虫的典型礼貌因素?

    网络爬虫的典型礼貌因素是什么 除了始终遵守robot txt 禁止 和非标准 抓取延迟 但是 如果站点没有指定显式的抓取延迟 则默认值应该设置为多少 我们使用的算法是 If we are blocked by robots txt Make
  • RazorEngine 中的 using-Statement(没有 MVC 中的 HtmlHelper)

    我使用的是 RazorEngine 没有 MVC 框架 这意味着我没有用于创建模板的 HtmlHelper 没关系 反正我不需要它的任何方法 但我需要创建自己的方法 例如 BeginForm 现在这些都是用 HtmlHelper ViewC
  • 在 Chrome 上将 drawImage 与 Canvas 结合使用非常慢

    我一直在尝试使用drawImage 将SVG 文件的大量实例绘制到画布上 通过使用 SVG 作为源创建单个图像元素 然后对画布上的每个实例使用 drawImage 我希望即使有大量实例也可以非常快速地在画布中生成合成图像 就性能而言 这在