Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 绘制大型位图时非常慢的nSyncAndDrawFrame大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想用多个大型位图优化视差滚动视图.在我的Nexus 5上,一切都很顺利,Traceview转储如下所示:

doFrame()方法使用~18 ms完成.

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

@L_674_2@

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

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

for (int i = 0; i < parallaxCon@L_818_5@manager.getnumberOfLayers(); i++) {
            Bitmap layer = parallaxCon@L_818_5@manager.getLayer(i);
            float dx = (offset * parallaxCon@L_818_5@manager.getScrollSpeedFactorForLayer(i) * imageScaleFactor);
            int offset = Math.round(-parallaxCon@L_818_5@manager.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;
        }

但是,这段代码足够快.缓慢的部分是在Androids本机nSyncAndDrawFrame()中.

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

解决方法

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

然降低图像分辨率(例如,到1280×622)将消除问题,但有一方法可以完全避免这个问题.

将图像移动到drawable-nodpi文件夹,这表示图像与分辨率无关.渲染延迟应该消失.

大佬总结

以上是大佬教程为你收集整理的android – 绘制大型位图时非常慢的nSyncAndDrawFrame全部内容,希望文章能够帮你解决android – 绘制大型位图时非常慢的nSyncAndDrawFrame所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。