【问题标题】:Speeding Android drawRect calls加速 Android drawRect 调用
【发布时间】:2014-09-14 03:27:05
【问题描述】:

我目前正在制作 Android 动态壁纸。在这个特殊的壁纸中,我有一系列从用户接触的地方生成的圆圈。在应用程序的设置中,我将允许他们更改所述功能的分辨率,因为这与这一点有关。因此,我编写了自己的抗锯齿圆函数。

渲染是通过类似于粒子的效果来完成的——我计算我用圆圈经过的矩形的颜色,并相应地渲染它们。这些矩形为我存储值,所以我需要单独渲染每个。我已经尽我所能来加快速度 - 预先计算各种颜色的 Paint 对象(足够少,这是有效且仍然有效的),预先计算矩形的坐标等。但是,我仍然在速度上失去了渲染循环 - 一个简单的循环,它遍历任何着色的矩形并将其应用于屏幕。

我不做任何操作,只是比较矩形是否着色,矩形的值直接从数组中拉出要使用哪个Paint对象。我怎样才能在这里获得速度?我无法将分辨率提高到超过 16 像素方格以填满屏幕,但速度会变得难以忍受。

这是瓶颈的代码片段:

      c.drawRect(0, 0, c.getWidth(), c.getHeight(), p);
      for(int x = 0; x < sizex; x++)
        for(int y = 0; y < sizey; y++){
          if(tiles[x][y] != 0){
            if(tiles[x][y] > 100)
              tiles[x][y] = 100;
            c.drawRect(rects[x][y], ps[tiles[x][y]]);//This seems to be the bottleneck
          }
        }

那么,从本质上讲,有没有比drawRect() 更快的替代方法?

【问题讨论】:

  • 您可能需要显示代码中有问题的部分,以便任何人确定如何优化它。

标签: android performance


【解决方案1】:

需要考虑的三件事:

  1. 多维数组访问比单维要慢一些。但我认为这可以忽略不计 (Java: Multi-dimensional array vs. One-dimensional)

  2. 您可以考虑使用drawLines 来一次绘制所有矩形的所有线条,而不是drawRect。这比多次调用drawLine 更快。这就是为什么我认为它也比多个drawRects 更快。但我没有任何证据。

  3. 在画布上绘图 很慢。如果性能很重要,您应该使用表面视图(尽管我不知道这是否适用于 LiveWallpapers)。如果性能很重要,或者对于粒子和这些高级图形的东西,我强烈建议使用 OpenGL,或者像 libGDX 这样的库。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多