代码之家  ›  专栏  ›  技术社区  ›  Sergey Miryanov

如何优化JS画布绘制?

  •  1
  • Sergey Miryanov  · 技术社区  · 15 年前

    我的建议太多了(>3倍)比context2d.fillRect慢。我如何优化我的代码或者为什么内置fillRect更快(一些应用程序加速?)?

    我的建议:

      __fillRect : function (data, x, y)//, r, g, b)
      {
        var w = this.__width * 4;
        var idx = x * 4+ y * w;
        var idx_1 = idx + 4;
        var idx_2 = idx + 8;
        var idx_3 = idx + w;
        var idx_4 = idx_3 + 4;
        var idx_5 = idx_3 + 8;
        var idx_6 = idx_3 + w;
        var idx_7 = idx_6 + 4;
        var idx_8 = idx_6 + 8;
    
        function __setPixelIdx (idx)
        {
          data[idx + 0] = 200;
          data[idx + 1] = 0;
          data[idx + 2] = 0;
          data[idx + 3] = 255;
        }
    
        __setPixelIdx (idx);
        __setPixelIdx (idx_1);
        __setPixelIdx (idx_2);
        __setPixelIdx (idx_3);
        __setPixelIdx (idx_4);
        __setPixelIdx (idx_5);
        __setPixelIdx (idx_6);
        __setPixelIdx (idx_7);
        __setPixelIdx (idx_8);
    
      },
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   pimvdb    14 年前

    由于以下几个原因,您的实现速度较慢:

    • 您正在写入数组,然后将其复制并转换为画布帧缓冲区。
    • context2d可能使用图形硬件来绘制
    • 您一次只能写入一个字节,而即使是未加速的本机库也可以写入整个int32像素值

    我的建议是使用原生的fillRect方法,除非你有一个很好的理由(例如,做你自己的着色或掩蔽)。你将无法接近库函数的速度。

    __setPixelIdx 而不是 data 主要访问 __fillRect 功能可能帮不了什么忙。

        2
  •  1
  •   gblazex    15 年前

    推荐文章