【问题标题】:Chrome decodes large image every frameChrome每帧解码大图像
【发布时间】:2015-08-05 11:36:49
【问题描述】:

我正在尝试制作一些交互式地图,其中我使用了两个非常大的图像(3200x800 和 4096x1024 像素)。问题是,Chrome 解码图像时每帧都带有云彩……所以性能真的很差(例如 sn-p)。

发现类似问题here,但没有帮助。我在 Linux Mint 17.1(64 位)上使用 Chrome 43(64 位)。我也试过火狐,没有问题...

html, body {
  height: 100%;
}

body {
  margin: 0;
  overflow: hidden;
}

div {
  position: absolute;
  width: 3200px;
  height: 1800px;
  background: url('http://i.imgur.com/p1Jf722.png'), url('http://i.imgur.com/zUkgN3j.jpg');
  animation: clouds 200s linear infinite;
  transition: 5s;
  left: 0;
  top: 0;
}

@keyframes clouds {
  from { background-position: 0 0, left top; }
  to { background-position: 4096px 0, left top; }
}

body:hover > div {
  left: -500px;
  top: -250px;
}
<div></div>

【问题讨论】:

    标签: html css google-chrome css-animations


    【解决方案1】:

    使用伪元素和transform仍然会占用大量CPU,但还是比较流畅的。它绝对消除了图像解码。

    我认为 Chrome 正在为 div 背景使用单个缓冲区。当您更改此缓冲区中 2 个图像的相对位置时,它变得无效并且必须再次进行解码。大概 FF 可以为每张图片分配一个中间缓冲区,即使在同一个背景下使用也是如此

    html, body {
      height: 100%;
    }
    
    body {
      margin: 0;
      overflow: hidden;
    }
    
    div {
      position: absolute;
      width: 3200px;
      height: 1800px;
      background: url('http://i.imgur.com/zUkgN3j.jpg');
      transition: 5s;
      left: 0;
      top: 0;
      background-position: left top;
      transform: translateZ(0px);
    }
    
    div:after {
      content: "";
      position: absolute;
      width: 100%;
      height: 100%;
      background: url('http://i.imgur.com/p1Jf722.png');
      animation: clouds 200s linear infinite;
      transition: 5s;
      left: 0;
      top: 0;
      transform: translateZ(0px);
    }
    
    
    @keyframes clouds {
      from { background-position: 0 0; }
      to { background-position: 4096px 0; }
    }
    
    body:hover > div {
      left: -500px;
      top: -250px;
    }
    <div></div>

    【讨论】:

      【解决方案2】:

      这里可能有多种方法可以提高性能,但最简单的方法就是通过向 div 添加不失真的变换将所有内容卸载到 GPU 上。瞧,没有更多的图像解码。

      html, body {
        height: 100%;
      }
      
      body {
        margin: 0;
        overflow: hidden;
      }
      
      div {
        position: absolute;
        width: 3200px;
        height: 1800px;
        background: url('http://i.imgur.com/p1Jf722.png'), url('http://i.imgur.com/zUkgN3j.jpg');
        animation: clouds 200s linear infinite;
        transition: 5s;
        left: 0;
        top: 0;
        transform: translateZ(0);
      }
      
      @keyframes clouds {
        from { background-position: 0 0, left top; }
        to { background-position: 4096px 0, left top; }
      }
      
      body:hover > div {
        left: -500px;
        top: -250px;
      }
      <div></div>

      【讨论】:

      • 感谢您的建议,但didn't help。看起来 Chrome 仍然只使用 CPU(2 个内核和 4 个线程。全部使用 50%。Firefox 在没有任何 CPU 工作的情况下运行)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      相关资源
      最近更新 更多