【问题标题】:Performance analysis of HorizontalScrollView on PowerVR G6230PowerVR G6230上Horizo​​ntalScrollView的性能分析
【发布时间】:2015-04-18 07:33:19
【问题描述】:

我在一些设备上测试了 Horizo​​ntalScrollView 的性能,发现了一些我没有预料到的东西。在性能应该相当不错的 GPU 上,比如 64 核 PowerVR G6230,滚动不像我在 1080p 中所期望的那样流畅。我在滚动时用 dumpsys 检查看到的是这样的:

        0.64    2.54    0.82
        0.65    2.35    0.81
        0.71    2.12    10.37
        0.79    2.18    27.93
        0.42    1.12    0.71
        0.62    1.36    0.42
        0.54    1.32    0.41
        0.47    1.28    0.40
        0.42    1.13    0.68
        0.44    1.06    0.59
        0.40    1.11    0.70
        1.52    2.18    0.93
        0.70    2.12    0.81
        0.67    2.31    0.81
        0.66    2.35    0.81
        0.65    2.44    0.81
        1.00    2.00    0.99
        0.67    2.33    0.81
        0.81    2.02    0.89
        1.33    1.98    0.82
        0.65    2.34    0.81
        1.42    2.01    0.81
        1.79    2.15    0.83
        0.67    2.35    0.82
        0.66    2.37    0.82
        0.65    2.31    0.80
        0.64    2.34    0.81
        0.65    2.43    0.80
        0.98    2.00    6.06
        1.61    1.99    0.83
        0.66    2.37    0.82
        0.76    2.33    0.81
        0.64    2.35    0.82
        0.65    2.50    0.81
        0.63    2.33    0.81
        0.65    2.32    0.80
        1.31    1.98    0.81
        0.73    2.34    0.81
        1.26    2.04    0.81
        0.66    2.42    0.81
        0.63    2.33    0.80
        0.64    2.30    0.81
        0.62    2.37    0.80
        0.62    2.30    0.80
        0.64    2.30    0.80
        7.77    16.80   1.47
        0.52    6.15    0.47
        0.41    1.33    0.35

这正是我所看到的:带有“中断”的流畅滚动,例如掉帧。谁对这些高价值有解释?

我已经能够通过禁用清单中的硬件加速并在我放置在滚动视图中的 ImageView 上启用绘图缓存来提高帧速率,但结果仍然不是我所期望的。知道为什么禁用 GPU 会带来更好的性能吗?

这是我在我的活动中放置的:

public static View getTestView(Context c) {
      LinearLayout ll = new LinearLayout(c);
      ll.setOrientation(LinearLayout.HORIZONTAL);
      ll.setGravity(Gravity.CENTER_VERTICAL);

      Bitmap b = BitmapFactory.decodeResource(c.getResources(), R.drawable.colors_1);

      for (int i = 0; i < 200; i++) {
         ImageView iv = new ImageView(c);
         iv.setImageBitmap(b);
         //iv.setDrawingCacheEnabled(true);
         ll.addView(iv);
      }

      HorizontalScrollView sv = new HorizontalScrollView(c);
      sv.addView(ll);

      RelativeLayout rl = new RelativeLayout(c);
      rl.addView(sv, new RelativeLayout.LayoutParams(
              RelativeLayout.LayoutParams.MATCH_PARENT,
              RelativeLayout.LayoutParams.MATCH_PARENT));

      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
              RelativeLayout.LayoutParams.WRAP_CONTENT,
              RelativeLayout.LayoutParams.WRAP_CONTENT);
      params.leftMargin = 0;
      params.topMargin  = 0;
      rl.addView(new FpsImageView(c), params);

      return rl;
   }

我可以应用任何可能的优化来使滚动更好吗?也许这只是 GPU 能做的最好的事情? 谢谢!

【问题讨论】:

    标签: android performance scrollview gpu


    【解决方案1】:

    我很惊讶你没有得到随机的 OutOfMemory 异常,因为基本上你正在做的是同时为 200 个图像视图膨胀和分配内存,这是一个巨大的禁忌。

    如果你想看到你的应用程序飞起来,你真正需要的是一个RecyclerView 和一个水平的LinearLayoutManager。这不是代码中的 3 行更改,但我保证最终结果会非常快。 Here你有一个很好的教程,但你可以在网上找到更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多