【问题标题】:What's the fastest way to display images in browser?在浏览器中显示图像的最快方法是什么?
【发布时间】:2015-07-25 01:29:45
【问题描述】:

假设我从某个地方(在我的例子中是网络套接字)获取二进制图像数据,那么在网络浏览器中呈现它们的最快方法是什么?

我使用 Canvas 和 Blob 提出了这种方法。

    var context = canvas.getContext('2d')
    var img = new Image()

    img.onload = function() {
      context.drawImage(img, 0, 0)
      window.URL.revokeObjectURL(this.src)
    }

    img.src = window.URL.createObjectURL(new Blob([data], {'type': 'image\/jpeg'}))

它已经非常快了(大约 3 毫秒 - 10 毫秒的渲染时间 vor 全高清 jpeg)。是否有另一种(更快)方式,可能没有 Image 元素?

编辑:是的,这是疯狂的科学,但为了达到每毫秒 60fps 的速度很重要。

【问题讨论】:

  • 10ms 不够快你到底在做什么?
  • 你怎么知道需要那个时间?
  • 那么,在这种情况下,更快的速度将是一毫秒或更短...... ??真的吗?想想吧!
  • 你不能只使用像this这样的base64字符串吗?
  • 使用 img src-data 非常快,例如 this

标签: javascript browser jpeg


【解决方案1】:

你可以试试 requestAnimationFrame。这是来自 Paul Irish 的垫片。

// shim layer with setTimeout fallback
window.requestAnimationFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();

// ...

img.onload = function() {
    var self = this;
    requestAnimationFrame(function(){
        context.drawImage(self, 0, 0)
        window.URL.revokeObjectURL(self.src)
    });
};

【讨论】:

  • WTH 推迟通话会比立即拨打drawImage 快吗?
  • 这将加快处理多个图像的速度。将渲染结合到一次重绘中将使画廊之类的东西运行得更顺畅。对于一个图像页面,它不会有太大帮助。 @Bergi
  • 啊,我明白了。但是,如果您在一帧内多次调用requestAnimationFrame(对于多个图像),那么setTimeout shim 将不起作用。
  • ……你需要更高级的东西,比如(function(cbs){function frame(){while(cbs.length)cbs.shift()();cbs=null}return function raf(cb){if(!cbs){setTimeout(frame,100/6);cbs=[];}cbs.push(cb)}}(null))
  • 这个不错。看看它是否可以在某些浏览器上实现更高的帧速率会很有趣。也许是 1000/120。那将是8毫秒。 @Bergi
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 2021-02-17
  • 2022-06-19
  • 2015-07-19
  • 1970-01-01
  • 2011-09-23
  • 2021-06-13
  • 2023-03-25
相关资源
最近更新 更多