android UI 优化系列之 创建RGB565的缓存

Android应用优化指南 对我们技术从业者而言,很多时候时候不是我们不知道怎么做,而是不知道做什么?今天系统的总结自己关于如何对Android应用进行优化的一些经验,共计八个维度. 阅读详情
关于如何优化activity的启动速度, view 的绘制速度, 可参考这个sdk里的文档。 android-sdk-windows-1.5_r1/docs/resources/articles/window-bg-speed.html。  
看完后你就知道 android:windowBackground 太重要了,影响到绘制效率。  
这里要说的是另外一点, 不是这个windowBackground 。  
android 为了提高滚动等各方面的绘制速度,可以为每一个view建立一个缓存,使用 View.buildDrawingCache为自己的view 建立相应的缓存,  
这个所谓的缓存,实际上就是一个Bitmap对象。只是 这个 bitmap 对象可以有多种格式而已,如  
     Bitmap.Config.ARGB_8888;  
     Bitmap.Config.ARGB_4444;  
     Bitmap.Config.ARGB_8888;  
     Bitmap.Config.ARGB_8888;  
     Bitmap.Config.RGB_565;  
   默认的格式是Bitmap.Config.ARGB_8888.,但大多数嵌入式设备使用的显示格式都是Bitmap.Config.RGB_565. 对于后者, 并没有  
alpha 值,所以绘制的时候不需要计算alpha合成,速递当让快些。其次,RGB_565可以直接使用优化了的memcopy函数,效率相对高出许多。  
 
 
  所以, 在用buildDrawingCache建立缓存时, 可以使用RGB_565格式。但是如何制定这个格式呢 ?buildDrawingCache有两个版本,      buildDrawingCache(boolean)  和  buildDrawingCache()。并没有任何参数可以设置rgb格式,看看源码先:  
 
public void buildDrawingCache(boolean autoScale) {  
        if ((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || (autoScale ?  
                (mDrawingCache == null || mDrawingCache.get() == null) :  
                (mUnscaledDrawingCache == null || mUnscaledDrawingCache.get() == null))) {  
            if (ViewDebug.TRACE_HIERARCHY) {  
                ViewDebug.trace(this, ViewDebug.HierarchyTraceType.BUILD_CACHE);  
            }  
            if (Config.DEBUG && ViewDebug.profileDrawing) {  
                EventLog.writeEvent(60002, hashCode());  
            }  
            int width = mRight - mLeft;  
            int height = mBottom - mTop;  
            final AttachInfo attachInfo = mAttachInfo;  
            final boolean scalingRequired = attachInfo != null && attachInfo.mScalingRequired;  
            if (autoScale && scalingRequired) {  
                width = (int) ((width * attachInfo.mApplicationScale) + 0.5f);  
                height = (int) ((height * attachInfo.mApplicationScale) + 0.5f);  
            }  
            final int drawingCacheBackgroundColor = mDrawingCacheBackgroundColor;  
              final boolean opaque = drawingCacheBackgroundColor != 0 ||  
                (mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE);  
            if (width <= 0 || height <= 0 ||  
                    (width * height * (opaque ? 2 : 4) > // Projected bitmap size in bytes  
                            ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {  
                destroyDrawingCache();  
                return;  
            }  
            boolean clear = true;  
            Bitmap bitmap = autoScale ? (mDrawingCache == null ? null : mDrawingCache.get()) :  
                    (mUnscaledDrawingCache == null ? null : mUnscaledDrawingCache.get());  
            if (bitmap == null || bitmap.getWidth() != width || bitmap.getHeight() != height) {  
                Bitmap.Config quality;  
                 if (!opaque) {  
                    switch (mViewFlags & DRAWING_CACHE_QUALITY_MASK) {  
                        case DRAWING_CACHE_QUALITY_AUTO:  
                            quality = Bitmap.Config.ARGB_8888;  
                            break;  
                        case DRAWING_CACHE_QUALITY_LOW:  
                            quality = Bitmap.Config.ARGB_4444;  
                            break;  
                        case DRAWING_CACHE_QUALITY_HIGH:  
                            quality = Bitmap.Config.ARGB_8888;  
                            break;  
                        default:  
                            quality = Bitmap.Config.ARGB_8888;  
                            break;  
                    }  
                } else {  
                    quality = Bitmap.Config.RGB_565;  
                }  
                // Try to cleanup memory  
                if (bitmap != null) bitmap.recycle();  
                try {  
                    bitmap = Bitmap.createBitmap(width, height, quality);  
                    bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);  
                    if (autoScale) {  
                        mDrawingCache = new SoftReference<Bitmap>(bitmap);  
                    } else {  
                        mUnscaledDrawingCache = new SoftReference<Bitmap>(bitmap);  
                    }  
                } catch (OutOfMemoryError e) {  
                    // If there is not enough memory to create the bitmap cache, just  
                    // ignore the issue as bitmap caches are not required to draw the  
                    // view hierarchy  
                    if (autoScale) {  
                        mDrawingCache = null;  
                    } else {  
                        mUnscaledDrawingCache = null;  
                    }  
                    return;  
                }  
                clear = drawingCacheBackgroundColor != 0;  
            }  
            Canvas canvas;  
            if (attachInfo != null) {  
                canvas = attachInfo.mCanvas;  
                if (canvas == null) {  
                    canvas = new Canvas();  
                }  
                canvas.setBitmap(bitmap);  
                // Temporarily clobber the cached Canvas in case one of our children  
                // is also using a drawing cache. Without this, the children would  
                // steal the canvas by attaching their own bitmap to it and bad, bad  
                // thing would happen (invisible views, corrupted drawings, etc.)  
                attachInfo.mCanvas = null;  
            } else {  
                // This case should hopefully never or seldom happen  
                canvas = new Canvas(bitmap);  
            }  
            if (clear) {  
                bitmap.eraseColor(drawingCacheBackgroundColor);  
            }  
            computeScroll();  
            final int restoreCount = canvas.save();  
            if (autoScale && scalingRequired) {  
                final float scale = attachInfo.mApplicationScale;  
                canvas.scale(scale, scale);  
            }  
            canvas.translate(-mScrollX, -mScrollY);  
            mPrivateFlags |= DRAWN;  
            // Fast path for layouts with no backgrounds  
            if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {  
                if (ViewDebug.TRACE_HIERARCHY) {  
                    ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);  
                }  
                mPrivateFlags &= ~DIRTY_MASK;  
                dispatchDraw(canvas);  
            } else {  
                draw(canvas);  
            }  
            canvas.restoreToCount(restoreCount);  
            if (attachInfo != null) {  
                // Restore the cached Canvas for our siblings  
                attachInfo.mCanvas = canvas;  
            }  
            mPrivateFlags |= DRAWING_CACHE_VALID;  
        }  
    }  
 
看完后明白了,至少跟两个因素有关  drawingCacheBackgroundColor 和 mBGDrawable.  
用setDrawingCacheBackgroundColor(0xffff0000)设置为 非默认颜色后,建立的缓存就是rgb565了,可以用下列方法验证一下:  
 
final Bitmap cache = mContent.getDrawingCache();  
            if (cache != null) {  
             Config cfg = cache.getConfig();  
             Log.d(TAG, "----------------------- cache.getConfig() = " + cfg);  
 

        } 


高通C2D硬件加速模块在Android相机YUV转RGB中的性能优化实践 本文深入探讨了高通C2D硬件加速模块在Android相机YUV转RGB转换中的性能优化实践。通过解析C2D架构、诊断性能瓶颈及实施关键优化策略,显著提升了处理效率。结合Adreno GPU的协同优化,实现了更高效的图像处理流程,为开发者提供了实用的性能调优指南。 阅读详情

相关推荐

Android性能优化面试指南:从UI卡顿、内存泄漏到启动速度的实战解析

在移动应用开发中,性能优化是衡量工程师技术深度的关键标尺,它直接决定了应用的用户体验和市场竞争力。其核心原理在于深入理解系统底层机制,如UI渲染流程、内存管理(垃圾回收GC)和线程调度,通过科学的方法论定位并解决性能瓶颈。这项技术的价值在于,它能将应用从“能用”提升到“好用”的层次,减少卡顿、崩溃和耗电,从而提升用户留存和产品口碑。典型的应用场景包括解决列表滑动卡顿、防治内存泄漏导致的OOM、以及优化应用冷启动速度等。本文聚焦Android性能优化面试,系统梳理了UI渲染、内存管理及启动速度等核心维度的考察

weixin_30787531的博客 552

关于android ui的优化 view 的绘制速度

关于如何优化activity的启动速度, view 的绘制速度, 可参考这个sdk里的文档。 android-sdk-windows-1.5_r1/docs/resources/articles/window-bg-speed.html。看完后你就知道 android:windowBackground 太重要了,影响到绘制效率。这里要说的是另外一点, 不是这个windowBackground 。android 为了提高滚动等各方面的绘制速度,可以为每一个view建立一个缓存,使用 View.buildDra

xuxiake2012的专栏 6818

bmp轻松转为rgb565工具

android的开机log是bmp的格式,但是得转为rgb565的格式,现在这个工具可以帮到你了。无论bmp,png,jpg都可以转了。

android canvas.drawBitmap

第一个srcrect是表示裁剪原图片的大小,第二个descrect是表示在布局里的位置。

weixin_47134320的博客 603

输入RGB强度值,转出嵌入式TFT、LCD屏幕 16进制 BGR565

输入RGB强度值,转出嵌入式TFT、LCD屏幕 16进制 BGR565 RGB16进制转颜色BGR565 例如:215 204 13 请输入RGB数值:13 215 213 二进制:0000 1101 1101 0111 1101 0101 ┌─B─┬──G──┬─R─┐ 11010 110101 00001 BGR:0xD6A1 请输入RGB数值:

自定义css属性实现渐变边框动画

自定义cs属性实现渐变边框动画

lemon的博客 1875

android位图颜色模式的问题

【译】Android位图颜色模式的问题   原文http://android.nakatome.net/      最近开始了android上的编程之旅,在了解2D图形编程时,令人蛋疼的发觉android上仅支持ARGB8888、ARGB4444、RGB565以及Alpha 8这么几种颜色模式,而不支持RGB888这种格式。原本以为即使不支持RGB888我用ARGB88

挨踢大杂烩 2111

Windows上python的spark环境搭建

1.安装好JDK 下载并安装好jdk-12.0.1_windows-x64_bin.exe,配置环境变量: 新建系统变量JAVA_HOME,值为Java安装路径 新建系统变量CLASSPATH,值为 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(注意最前面的圆点) 配置系统变量PATH,添加 %JAVA_HOME%bin;%JAVA_HOME%jrebin 在CMD中输入:java或者java -version,不显示不是内部命令等,说明安装成功。

weixin_43915303的博客 652

android bitmap rgb565,android显示RGB565数据图像

I have file "Image_RGB565.raw" which contains image buffer in RGB565 format. I want this image to be displayed in ImageView. is it possible without extra code of converting to RGB888?I have tried toBi...

weixin_35319666的博客 754

mysql数据目录迁移后表不存在_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...

补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题。背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机,唉,悲剧了,于是重新安装了系统 windows server 2008 enterprise 32bit。详情:系统安装完成后,重新配置之前那个网站,appache服务配好之后,再配置数据的时候是这样...

weixin_39628271的博客 2673

MaxDEA如何计算超效率DEA

MaxDEA如何计算超效率DEA第一步,导入数据,设置输出和输出,点击OK;第二步,运行模型; 本文计算的是超效率DEA-BCC。 第一步,导入数据,设置输出和输出,点击OK; 第二步,运行模型; 在distance选项框中选择Radial:CCR(1978);BCC(1984)。 在Orientation中选择Non-oriented。其中,Input-oriented是投入最小;Outp...

王樰沫 1万+

android app视图效果,Android显示框架:Activity应用视图的渲染流程

Android显示框架:Activity应用视图的渲染流程关于作者郭孝星,程序员,吉他手,主要从事Android平台基础架构方面的工作,欢迎交流技术方面的问题,可以去我的Github提issue或者发邮件至guoxiaoxingse@163.com与我交流。第一次阅览本系列文章,请参见导读,更多文章请参见文章目录。文章目录一 测量流程二 布局流程三 绘制流程在上篇文章04Android显示框架:A...

weixin_39608748的博客 407

RK3568平台开发系列讲解(UBOOT篇)u-boot启动流程

U-Boot(Universal Bootloader)是一种开源的引导加载程序,广泛用于嵌入式系统中。它的主要功能是初始化硬件设备,加载操作系统内核,并将控制权交给操作系统。U-Boot的启动流程可以分为多个阶段,以下是典型的U-Boot启动流程:

内核笔记 1234

关于android ui的优化 view 的绘制速度

<br />关于如何优化activity的启动速度, view 的绘制速度, 可参考这个sdk里的文档。 android-sdk-windows-1.5_r1/docs/resources/articles/window-bg-speed.html。 <br /><br />看完后你就知道 android:windowBackground 太重要了,影响到绘制效率。 <br /><br />这里要说的是另外一点, 不是这个windowBackground 。 <br /><br /><br />androi

Xiaowq的专栏 2037

RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块

本文记录的是利用模块优化的目标检测网络模型。的作用在于克服了常见模块无法同时吸收CNN 效率建模局部特征和利用Transformer 动态建模能力学习长距离交互的问题。相比一些复杂结构或多个混合模块的方法,能更好地权衡模型成本和精度。本文将其用于的模型改进和二次创新,更好地突出重要特征,提升模型性能。Rethinking Mobile Block for Efficient Attention-based Models从微观角度看,由和组成。及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块

Limiiiing的博客 816

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

Android Bitmap内存优化全解析:从原理到实战避坑指南

在Android应用开发中,内存管理是性能优化的核心议题,而Bitmap作为图像数据的主要承载者,其内存占用直接影响应用流畅度与稳定性。理解Bitmap的内存模型,关键在于掌握其像素数据在Java堆与Native堆的存储机制,以及由Bitmap.Config决定的像素格式(如ARGB_8888、RGB_565)对内存占用的巨大影响。高效的内存管理技术,如图片采样加载(inSampleSize)、Bitmap复用(inBitmap)以及多级缓存策略(LruCache),能有效防止OOM并提升渲染性能。这些技术

weixin_30924087的博客 666

基于机器学习的网络入侵检测系统设计与实现

本文设计并实现了一个基于机器学习的网络入侵检测系统,采用随机森林模型结合KMM算法优化,使用CICIDS2017数据集进行训练。系统包含完整的数据预处理流程、特征工程、模型调优和远程部署方案。实验结果表明,该系统能有效识别多种网络攻击类型,在检测准确率和误报率方面表现优异。研究为网络安全防护提供了新的技术思路和实用工具,具有重要的应用价值。

huanghm88的专栏 318

Android内存优化-图片资源

大多数情况下,安卓应用的运行内存,res目录下图片资源占了一大部分,虽然系统对Resource增加了缓存机制,但是仍然还是有优化空间的。 1.Resources#loadDrawable存在优化空间。 2.在Activity或者Fragment销毁的时候,部分Bitmap是可以及时回收的。 先贴出代码,后续慢慢完善 BitmapHelper.java import android.

lorss的专栏 3526

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android canvas 异步_Android--Canvas绘制优化

onDraw( ) 是同步方法 ,如果同时绘制的数据量太大就会卡顿 (例如100万个坐标点);优化方法如下:数据量太大的时候,可以考虑在UI效果和流畅度上面平衡一下;例如:A. setAntiAlias( ) 抗锯齿功能,会消耗较大资源,绘制图形速度会变慢;B. setDither(boolean dither); setFilterBitmap(boolean filter) 等…显示的效果越好...

weixin_42502165的博客 1248

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android性能优化之图片优化

Android性能优化之图片优化先总结下为什么要做图片优化,以及图片优化的好处吧!先总结下图片存储优化一、什么是OOM?二、图片OOM产生的情况图片存储优化主要是以下三点:尺寸压缩、质量压缩、内存重用一、尺寸压缩二、质量压缩三、内存重用四、Bitmap的内存管理图片加载优化 最近不是很忙,就在看一些学习视频,做出了一些简单的总结(可能和视频有些类似,不过就当我借鉴的吧,毕竟我是用来总结的,emmm...

wang_dsheng的博客 1620

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android UI渲染机制与性能优化实践

UI渲染是移动应用开发的核心技术之一,涉及视图树的构建、布局计算和图形绘制等关键流程。Android系统通过VSYNC信号同步渲染管线,确保60FPS的流畅体验,其中SurfaceFlinger负责管理图形缓冲区,实现高效的界面合成。性能优化需重点关注过度绘制问题,通过减少视图层级、优化自定义绘制和使用GPU渲染分析工具等手段,可显著提升界面流畅度。本文深入解析Android渲染机制,结合View Hierarchy优化和GPU性能调优等热词,为开发者提供从原理到实践的完整解决方案。

weixin_33806300的博客 324

Android性能优化实战:从UI渲染到内存管理

性能优化是移动应用开发的核心课题,涉及UI渲染、内存管理、网络请求等多个技术维度。通过帧率(FPS)、内存占用等关键指标监控,开发者可以系统性地诊断性能瓶颈。Android Studio提供的Profiler工具套件与LeakCanary等第三方库,构成了完整的性能分析工具链。在工程实践中,主线程优化、内存泄漏预防、网络请求合并等技术方案,能显著提升应用流畅度与用户体验。本指南重点解析了UI过度绘制检测、协程任务调度等热门前沿技术,为Android开发者提供从原理到落地的完整优化方案。

weixin_34221036的博客 312

安卓性能优化手册

步骤一:在java中定义一个c方法的接口 ,相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的。步骤二:实现C代码方法名 严格按照jni的规范步骤三:创建android.mk 告诉编译器 如何把c代码打包成函数库步骤四:把c代码 打包成函数库 用到了安装的环境 到相应目录下使用ndk-build打包步骤五:在java代码中 引入库函数步骤六:使用方法。

m0_72429728的博客 363
上一篇: UI优化之windowBackground
下一篇: kernel cmdline的几种传递方式
RyanLeiWang
博客等级 码龄20年 184粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值