Ulr*_*ler 7 android bitmap parallax
我想用多个大型位图优化视差滚动视图.在我的Nexus 5上,一切都很顺利,Traceview转储如下所示:
doFrame()方法使用~18 ms完成.
但是,在使用我的Nexus 7或Android 6 Emulator(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;
}
Run Code Online (Sandbox Code Playgroud)
但是,这段代码足够快.缓慢的部分是在Androids本机nSyncAndDrawFrame()中.
这可能是什么问题?有没有办法深入研究这个问题?现在这个方法是一个黑盒子,因为我看不到本机调用堆栈.
在遇到类似的行为后,我偶然发现了这个问题CollapsingToolbarLayout。分析器显示,调用需要android.view.ThreadedRenderer.nSyncAndDrawFrame()很长时间才能完成。
虽然降低图像分辨率(例如降低到 1280x622)可以消除该问题,但有一种方法可以完全避免该问题。
将图像移至该drawable-nodpi文件夹中,这表明该图像与分辨率无关。渲染延迟应该消失。