android - 绘制大型位图时 nSyncAndDrawFrame 速度极慢

标签 android bitmap parallax

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

Smooth scrolling on Nexus 5

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

但是,当使用我的 Nexus 7 或 Android 6 模拟器 (Genymotion) 时,Traceview 转储看起来像这样:

Very laggy rendering on Nexus 7

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

有趣的代码部分在视差 View 的 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() 中。

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

最佳答案

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

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

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

关于android - 绘制大型位图时 nSyncAndDrawFrame 速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34852025/

相关文章:

android - 如何在执行 doInBackground() 时在 android 中显示进度微调器

java - Android NDK,保持实时 C++ 对象

android - 触摸屏幕时尝试开始新 Activity

flash - 如何将位图文件加载到 BitmapData 对象中?

jquery - 平滑背景图像的视差滚动

jquery - 改变 Jquery 视差效果的方向

android - 无法在带有大文本 : "Font size too large to fit in cache" 的 Android TextView 中显示 Unicode 字符(表情符号)

android - 如何创建响应式 GridView 以覆盖整个屏幕?

Android - 使用静态布局在位图底部绘制文本

javascript - 根据当前宽度使用 jQuery 定义背景元素