android - Extremadamente lento nSyncAndDrawFrame al dibujar grandes mapas de bits
bitmap parallax (0)
Quiero optimizar una vista de desplazamiento de paralaje con múltiples mapas de bits grandes. En mi Nexus 5, todo es sencillo y el volcado de Traceview se ve así:
El método doFrame () usa ~ 18 ms para finalizar.
Sin embargo, cuando uso mi Nexus 7 o un emulador de Android 6 (Genymotion), el volcado de Traceview se ve así:
El método nSyncAndDrawFrame ahora tarda ~ 300 ms cuando se ejecuta exactamente la misma aplicación.
La parte del código interesante está en onDraw () de la vista de paralaje:
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;
}
Sin embargo, este código es lo suficientemente rápido. La parte lenta está en Androids nativo nSyncAndDrawFrame ().
Cual podría ser el problema aquí? ¿Hay alguna manera de profundizar en este problema? En este momento, este método es una caja negra, porque no puedo ver la pila de llamadas nativa.