【问题标题】:Extremely slow nSyncAndDrawFrame when drawing large Bitmaps绘制大型位图时 nSyncAndDrawFrame 速度极慢
【发布时间】:2016-01-18 10:07:52
【问题描述】:

我想优化具有多个大位图的视差滚动视图。在我的 Nexus 5 上,一切都很顺利,Traceview 转储看起来像这样:

doFrame() 方法使用约 18 毫秒来完成。

但是,当使用我的 Nexus 7 或 Android 6 模拟器 (Genymotion) 时,Traceview 转储如下所示:

运行完全相同的应用程序时,nSyncAndDrawFrame 方法现在需要大约 300 毫秒。

有趣的代码部分在视差视图的 onDraw() 中:

for (int i = 0; i < parallaxConfigManager.getNumberOfLayers(); i++) {
            Bitmap layer = parallaxConfigManager.getLayer(i);
            float dx = (offset * parallaxConfigManager.getScrollSpeedFactorForLayer(i) * imageScaleFactor);
            int offset = Math.round(-parallaxConfigManager.getBoardOffset(i) + dx);
            srcRect.offsetTo(offset, 0);

            int realWidth = getRealWidth(srcRect, layer.getWidth());
            float scaleFactor = destRect.width() / (float) srcRect.width();
            if (realWidth < srcRect.width()) {
                destRect.left       = (int) (scaleFactor * Math.max(0, -srcRect.left));
                destRect.right      = destRect.left + (int) (scaleFactor * realWidth);
            }
            destRect.bottom = Math.min(screenHeight, (int) (scaleFactor * layer.getHeight()));

            canvas.drawBitmap(layer, srcRect, destRect, paint);

            destRect.left = 0;
            destRect.right = screenWidth;
        }

但是,这段代码已经足够快了。慢的部分是在 Android 原生的 nSyncAndDrawFrame() 中。

这可能是什么问题?有没有办法更深入地研究这个问题?现在这个方法是一个黑盒子,因为我看不到原生调用栈。

【问题讨论】:

  • 在玩过这个程序之后,我相信我的应用程序达到了图形内存大小的限制。当我禁用一些位图时,它开始变得更快。 Nexus 5 上的可用内存似乎比 Nexus 7 上的多。

标签: android bitmap parallax


【解决方案1】:

CollapsingToolbarLayout 中遇到与大图像 (1920x933) 类似的行为后,我偶然发现了这个问题。分析器显示,对 android.view.ThreadedRenderer.nSyncAndDrawFrame() 的调用需要很长时间才能完成。

虽然降低图像分辨率(例如降低到 1280x622)会消除该问题,但有一种方法可以完全避免该问题。

将您的图像移动到drawable-nodpi 文件夹中,这表明该图像与分辨率无关。渲染延迟应该会消失。

【讨论】:

    【解决方案2】:

    就我而言,问题在于大图像。例如,对于背景,我有一个尺寸为 800x800 的图像,当我将此尺寸减小到 400x400 时,问题就消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2021-07-28
      • 2011-08-22
      • 2015-02-07
      相关资源
      最近更新 更多