我想要优化一个带有多个大位图的视差滚动视图。在我的 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()。
可能出现了什么问题?有没有办法更深入地了解这个问题?目前这个方法是一个黑盒子,因为我看不到本地调用堆栈。