深入Android渲染机制

发布时间:2017-11-16 移动开发 UI 嵌入式

1.知识储备
  • CPU: 中央处理器,它集成了运算,缓冲,控制等单元,包括绘图功能.CPU将对象处理为多维图形,纹理(Bitmaps、Drawables等都是一起打包到统一的纹理).

  • GPU:一个类似于CPU的专门用来处理Graphics的处理器, 作用用来帮助加快格栅化操作,当然,也有相应的缓存数据(例如缓存已经光栅化过的bitmap等)机制。

  • OpenGL ES是手持嵌入式设备的3DAPI,跨平台的、功能完善的2D和3D图形应用程序接口API,有一套固定渲染管线流程. 附相关OpenGL渲染流程资料

  • DisplayList 在Android把XML布局文件转换成GPU能够识别并绘制的对象。这个操作是在DisplayList的帮助下完成的。DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。

  • 格栅化 是 将图片等矢量资源,转化为一格格像素点的像素图,显示到屏幕上,过程图如下.

格栅化操作

  • 垂直同步VSYNC:让显卡的运算和显示器刷新率一致以稳定输出的画面质量。它告知GPU在载入新帧之前,要等待屏幕绘制完成前一帧。下面的三张图分别是GPU和硬件同步所发生的情况,Refresh Rate:屏幕一秒内刷新屏幕的次数,由硬件决定,例如60Hz.而Frame Rate:GPU一秒绘制操作的帧数,单位是30fps,正常情况过程图如下.

正常情况

2.渲染机制分析

渲染流程线

UI对象—->CPU处理为多维图形,纹理 —–通过OpeGL ES接口调用GPU—-> GPU对图进行光栅化(Frame Rate ) —->硬件时钟(Refresh Rate)—-垂直同步—->投射到屏幕

图片名称

渲染时间线

Android系统每隔16ms发出VSYNC信号(1000ms/60=16.66ms),触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,为了能够实现60fps,这意味着计算渲染的大多数操作都必须在16ms内完成。

正常情况

这里写图片描述

渲染超时,计算渲染时间超过16ms

当这一帧画面渲染时间超过16ms的时候,垂直同步机制会让显示器硬件 等待GPU完成栅格化渲染操作, 
这样会让这一帧画面,多停留了16ms,甚至更多.这样就这造成了 用户看起来 画面停顿. 

当GPU渲染速度过慢,就会导致如下情况,某些帧显示的画面内容就会与上一帧的画面相同

GPU超时情况

3.渲染时会出现的问题

GPU过度绘制

GPU的绘制过程,就跟刷墙一样,一层层的进行,16ms刷一次.这样就会造成,图层覆盖的现象,即无用的图层还被绘制在底层,造成不必要的浪费.

这里写图片描述

过度绘制查看工具

在手机端的开发者选项里,有OverDraw监测工具,调试GPU过度绘制工具, 
其中颜色代表渲染的图层情况,分别代表1层,2层,3层,4层覆盖.

这里写图片描述

我的魅族手机的Monitor GPU Rendering

这里写图片描述

计算渲染的耗时

任何时候View中的绘制内容发生变化时,都会重新执行创建DisplayList,渲染DisplayList,更新到屏幕上等一 系列操作。这个流程的表现性能取决于你的View的复杂程度,View的状态变化以及渲染管道的执行性能。

举个例子,当View的大小发生改变,DisplayList就会重新创建,然后再渲染,而当View发生位移,则DisplayList不会重新创建,而是执行重新渲染的操作.

当你的View过于复杂,操作又过于复杂,就会计算渲染时间超过16ms,产生卡顿问题. 

渲染耗时呈现工具

工具中,不同手机呈现方式可能会有差别.分别关于StatusBar,NavBar,激活的程序Activity区域的GPU Rending信息。激活的程序Activity区域的GPU Rending信息。

界面上会滚动显示垂直的柱状图来表示每帧画面所需要渲染的时间,柱状图越高表示花费的渲染时间越长。

中间有一根绿色的横线,代表16ms,我们需要确保每一帧花费的总时间都低于这条横线,这样才能够避免出现卡顿的问题。

这里写图片描述

每一条柱状线都包含三部分, 
蓝色代表测量绘制Display List的时间, 
红色代表OpenGL渲染Display List所需要的时间, 
黄色代表CPU等待GPU处理的时间。

这里写图片描述

4. 如何优化

有人会说这些小地方,不值得优化.但是当你用的是低配机器,内存到饱和,CPU运算到达饱和,就像一个界面要做很多交互,绘制,加载图片,请求网络.后,一个小问题就会导致页面卡顿(就像我手机的淘宝客户端…),OOM,项目崩溃.

是的,这就是力量~

Android系统已经对它优化

在Android里面那些由主题所提供的资源,例如Bitmaps,Drawables都是一起打包到统一的Texture纹理当中,然后再传递到 GPU里面,这意味着每次你需要使用这些资源的时候,都是直接从纹理里面进行获取渲染的。

我们要做的优化

扁平化处理,防止过度绘制OverDraw

1.每一个layout的最外层父容器 是否需要?

这里写图片描述

2.布局层级优化

进行检测时,可能会让多种检测工具冲突,用Android Device Monitor的时候,最好关闭相关手机上的开发者检测工具开关. 
查看自己的布局,深的层级,是否可以做优化. 
渲染比较耗时(颜色就能看出来),想办法能否减少层级以及优化每一个View的渲染时间.

Hierarchy Viewer工具

他是查看耗时情况,和布局树的深度的工具.

这里写图片描述

3.图片选择

Android的界面能用png最好是用png了,因为32位的png颜色过渡平滑且支持透明。jpg是像素化压缩过的图片,质量已经下降了,再拿来做9path的按钮和平铺拉伸的控件必然惨不忍睹,要尽量避免。

对于颜色繁杂的,照片墙纸之类的图片(应用的启动画面喜欢搞这种),那用jpg是最好不过了,这种图片压缩前压缩后肉眼分辨几乎不计,如果保存成png体积将是jpg的几倍甚至几十倍,严重浪费体积。

4.清理不必要的背景

这里写图片描述

5.当背景无法避免,尽量用Color.TRANSPARENT

因为透明色Color.TRANSPARENT是不会被渲染的,他是透明的.



//优化前
//优化前: 当图片不为空,ImageView加载图片,然后统一设置背景
Bean bean=list.get(i);
 if (bean.img == 0) {
            Picasso.with(getContext()).load(bean.img).into(holder.imageView);
        }
        chat_author_avatar.setBackgroundColor(bean.backPic);

 

//优化后
//优化后:当图片不为空,ImageView加载图片,并设置背景为TRANSPARENT;
//当图片为空,ImageView加载TRANSPARENT,然后设置背景为无照片背景
Bean bean=list.get(i);
 if (bean.img == 0) { Picasso.with(getContext()).load(android.R.color.transparent).into(holder.imageView); holder.imageView.setBackgroundColor(bean.backPic); } else { Picasso.with(getContext()).load(bean.img).into(holder.imageView); holder.imageView.setBackgroundColor(Color.TRANSPARENT); } 

 

————-对比结果——————– 
这里写图片描述

6.优化自定义View的计算

View中的方法OnMeasure,OnLayout,OnDraw.在我们自定义View起到了决定作用,我们要学会研究其中的优化方法.

学会裁剪掉View的覆盖部分,增加cpu的计算量,来优化GPU的渲染


  /**
     * Intersect the current clip with the specified rectangle, which is
     * expressed in local coordinates.
     *
     * @param left   The left side of the rectangle to intersect with the
     *               current clip
     * @param top    The top of the rectangle to intersect with the current clip
     * @param right  The right side of the rectangle to intersect with the
     *               current clip
     * @param bottom The bottom of the rectangle to intersect with the current * clip * @return true if the resulting clip is non-empty */ public boolean clipRect(float left, float top, float right, float bottom) { return native_clipRect(mNativeCanvasWrapper, left, top, right, bottom, Region.Op.INTERSECT.nativeInt); } 

 

5.总结

性能优化其实不仅仅是一种技术,而是一种思想,你只听过它的高大上,却不知道它其实就是各个细节处的深入研究和处理.

当然,有的时候也需要自己进行权衡效果和性能,根据需求进行选择.

还有,Android Device Monitor 是个好东西~简直就是性能优化大本营,性能优化的工具基本都在其中.

所以在平时的开发过程中,养成良好的思考习惯,是第一步~

写代码的时候要想: 
1.你的代码是不是多余? 
2.你的对象有没有必要在循环中创建? 
3.你的计算方法是不是最优?

画界面的时候要想: 
1.布局是否有背景? 
2.是否可以删掉多余的布局? 
3.自定义View是否进行了裁剪处理? 
4.布局是否扁平化,移除非必需的UI组?

最后,Android Device Monitor 是个好东西~ 性能优化的工具基本都在其中.




    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6668148.html,如需转载请自行联系原作者


更多相关推荐


Android EditText小结

发布时间:2015-07-27 移动开发
防止EditText获取焦点弹出输入法android:focusable="true"  android:focusableInTouchMode="true"EditText不可编辑,获取点击事件android:editable="false"et.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch...

Android EditText 应用小小结

发布时间:2011-11-19 移动开发 JAVA
最近开始学习Android,看书的时候觉得还可以,没事没事的,好像都懂,但是真正动起手来却是另外一回事。现在只拿EditText来说,看了半天的文档才知道它的一些用法。我想获取当前控件的字符串,一开始发现它有一个toString()方法,就用了,结果发现返回的是一个乱七八糟大字符串,什么ID之类大,这时才知道理解错了,就去看文档,没有发现直接获取字符串的方法(不知道有没有),但是发现了一个getT...

Linux 文件系统剖析: 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口...

发布时间:2012-12-18 网络 操作系统 嵌入式
M.TimJones(mtj@mtjones.com),资深首席软件工程师,Emulex简介: /proc文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在Linux®内核空间和用户空间之间进行通信。在/proc文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。本文对/proc虚拟文件系统进行了介绍,并展示了它...

android4.4(kitkat),如何让APP可以直接写入SMS短信

发布时间:2016-09-14 移动开发 JAVA PYTHON
2019独角兽企业重金招聘Python工程师标准>>>以下代码的修改是针对android平台研发的,另外如果没有系统源码的情况下,通过逆向修改ROM中的对应文件,也是可以做到的。之所以有这样需求,是因为假如是你自己的ROM,需要对自己的某个APP授予SMS写入权限,可以通过修改如下代码中的OTHERSMS_PACKAGE_NAME,换成你自己APP的packagename就可以了...

Qt Dialog 界面设计之 FindDialog

发布时间:2022-11-20 QT C++ UI 开发语言 C++ GUI QT 5 DEMO仓库
目录一、FindDialog效果图二、实现代码H文件:CPP文件:三、信号和槽四、补充说明一、FindDialog效果图二、实现代码代码的逻辑顺序:      1、创建并初始化窗口部件。         2、添加布局,把创建好的控件放入布局当中。         3、设置控件的属性。         4、建立信号-槽之间的连接。         5、实现自定义槽。H文件:#ifndefDIALOG...

Fiddler捕获抓取 App端数据包

发布时间:2017-01-08 移动开发
最近项目设计到App抓包,所以采用Fiddler工具来采集获取APP数据包,但是fiddler对有些app是无法捕获到数据包的,以下是我的处理方法:1.我默认代理端口使用的是自定义的端口而不是默认的8888端口;2.手机端安装Fiddler证书,电脑端关闭防火墙对我采集的app来说亲测有效能获取到数据包,记录一下操作过程:  以下是我对安卓App进行抓取的步骤:1. Fiddler下载地址(htt...

js与objective-c的交互-备

发布时间:2016-04-18 移动开发 JAVASCRIPT VIEWUI 操作系统
在写JavaScript的时候,可以使用一个叫做window的对象,像是我们想要从现在的网页跳到另外一个网页的时候,就会去修改window.location.href的位置;在我们的Objective-C程序码中,如果我们可以取得指定的WebView的指标,也就可以拿到这个出现在JavaScript中的window对象,也就是[webViewwindowScriptObject]。 这个对象就是W...

2021苹果官方iCloud迁移照片到Google Photo教程

目前苹果官方推出了iCloud迁移到GooglePhoto的功能,此功能可让用户将iCloud云端照片转移备份到Google相册。目前只有美国、加拿大、澳大利亚、冰岛、列支敦士登、新西兰、挪威和瑞士8个国家和地区的AppleID才支持此功能。一、确保你的AppleID是以上几个区中的;二、打开下方链接并登录。https://privacy.apple.com/三、如果你的AppleID符合条件,点...

android 弹出一个在桌面上出现的window

发布时间:2015-06-06 移动开发
最近发现,如果我在ActivityA的Handler里面写了消息处理事件,然后从ActivityA跳转到界面B之后,A的handler还在继续处理消息,我的项目中,用户进入到房间界面了,开始接收消息,然后他也可以跳转到设置界面去进行一些房间设置,假如这个时候用户被强制T出去了,不管他在哪个界面,都需要弹出对话框显示用户被踢出,之前用的普通的Dialog,然后只有房间界面显示出来的时候才会看到被踢出...

Unity UGUI 原理篇(二):Canvas Scaler 縮放核心

发布时间:2018-11-16 游戏 C# UI
https://blog.csdn.net/gz_huangzl/article/details/52484611 CanvasScalerCanvasScaler是UnityUI系統中,控制UI元素的總體大小和像素密度的Compoent,CanvasScaler的縮放比例影響著Canvas下的元素,包含字體大小和圖像邊界。 SizeReferenceResolution:預設螢幕大小Screen...

Linux简明系统维护手册

发布时间:2012-12-15 操作系统 嵌入式
一、关于Linux的误区  1、Linux干什么用?  首先,很少有人用Linux做桌面系统,因为Windows桌面系统已经足够好了。我们主要把Linux用作网络服务器的操作系统。如果你和你的应用符合下面的几条,那么你合适使用Linux:  *不愿意花钱在操作系统和网络应用上。  *用D版系统受良心谴责或害怕承担责任。  *想得到和花钱的系统差不多的性能。  *在用户面前显得水平较高。  *认识几...

重新创建一个Activity(翻译)

发布时间:2015-09-20 移动开发
重新创建一个Activity这里有些场景,你的Activity因为普通的app行为被销毁了,比如当用点击返回按钮时或者你的Activity通过调用finish()方法通知自己被销毁了。系统也会销毁你的Activity,如果它当前被停止并且有较长时间没有被使用了,或者前台运行的Activity需要更多的系统资源导致系统必须关闭后台进程来恢复内存。当你的Activity是因为用户点击了返回按钮或者是A...

[Android Training视频系列]2.4 Recreating an Activity

发布时间:2012-12-18 移动开发 RUNTIME
[AndroidTraining视频系列]2.4RecreatinganActivity1.主要内容本讲讲解onSaveInstanceState与onRestoreInstanceState的使用。2.视频讲解http://www.eyeandroid.com/thread-11391-1-1.html3.翻译参考存在一些情况,由于普通的程序行为,你的activity会被销毁,比如,当用户点击B...

常用网页代码

发布时间:2018-06-06 JAVASCRIPT VIEWUI 嵌入式
1、控制横向和纵向滚动条的显隐?<bodystyle=”overflow-y:hidden”>去掉x轴<bodystyle=”overflow-x:hidden”>去掉y轴<bodyscroll=”no”>不显2、表格变色<TDοnmοuseοver=”this.style.backgroundColor=’#FFFFFF’”οnmοuseοut=”thi...

Android Material Design:基于CoordinatorLayout实现向上滚动导航条ToolBar滚出、向下滚动导航条滚出...

发布时间:2015-10-03 移动开发 JAVA
AndroidMaterialDesign:基于CoordinatorLayout实现向上滚动导航条ToolBar滚出、向下滚动导航条滚出要实现的效果:一个导航条和一个ToolBar,初始状态:手指在屏幕向上滑动时候的效果,ToolBar滚出:当手指在屏幕向下滑动时候,ToolBar又滚出:实现上述效果要使用AndroidMaterialDesign引入的CoordinatorLayout。关...

Android animation学习笔记之propery animation

发布时间:2013-05-07 移动开发 ANDRIOD
   以前写博客都是用百度空间,总感觉不专业,访问量少,好友少,里边可运用的资源也少,所以昨天网上查了一下,觉得iteye社区还不错,就申请了一个iteye帐号,今天开始写博,希望大家多关注多交流,共同进步.    最近一直在做中国最强音app的开发,好不容易闲了下来,觉得在做中国最强音app的时候动画方面的知识还不够扎实,所以这周腾出手来主要学习了animation和graphics方面的知识,...

四、Android性能优化之性能优化工具

发布时间:2018-01-18 移动开发 C/C++ JAVA
性能优化的帮助工具:MAT,MemoryMonitor(属于AndroidMonitor中一个模块),HeapTool(查看堆信息),AllactionTracking,LeakCanaryLint工具1.AllactionTracking(1)追踪在内存图中点击途中箭头的部分,启动追踪,再次点击就是停止追踪,随后自动生成一个alloc结尾的文件,这个文件就记录了这次追踪到的所有数据,然后会在右上...

Android基础-EditText键盘的显示与隐藏

发布时间:2015-12-01 移动开发
场景一、点击EditText之外的空白区域隐藏键盘:howtohidesoftkeyboardonandroidafterclickingoutsideEditText?首先定义一个关闭键盘的方法:/***关闭软键盘*/publicstaticvoidcloseSoftKeyboard(Contextcontext){InputMethodManagerinputMethodManager=(In...

Android零基础入门第9节:Android应用实战,不懂代码也可以开发

发布时间:2017-08-12 移动开发 JAVA 开发工具
原文:Android零基础入门第9节:Android应用实战,不懂代码也可以开发通过上一期的学习,我们成功开发了Android学习的第一个应用程序,不仅可以在Android模拟器上运行,同时还能在我们的Android手机上运行,是不是很有成就感。接下来我们来开发更加复杂的Android应用程序,并逐步踏入Android开发真正的学习成长之路。 一、继续Android应用程序开发大家还记得我们上一期...

Google透露Android Market恶意程序扫描服务

发布时间:2012-02-04 移动开发
Google工程师透露了一个基于云的AndroidMarket恶意应用扫描服务。该服务代号Bouncer,可自动扫描AndroidMarket中的所有应用,核对与已知恶意程序、木马和间谍软件相匹配的数字签名,模拟程序运行,检查该应用是否存在滥用行为。扫描将会在开发商首次上传Market应用后立即开始,并在之后定期执行。在频频发现恶意应用之后,指责Google未能加强AndroidMarket安全的...

团队转型之痛之悟

发布时间:2017-12-12 移动开发 JAVA UI
1、为什么转型?之前一篇文章详细介绍了转型《回到交友8个月来的测试团队转型实践》其中有几个关键点:从手工型团队向技术全栈型团队转型促成团队成员具备android、iOS、Java代码基础知识,要求基本的编程能力;转型前我跟管理层沟通:要么转型,提高生产力,会有成功的脱颖而出,该奖励就奖励,也会有淘汰的;要么继续平庸,过过日子,也别搞啥全程测试了;如果你是leader,会怎么选择呢?2、为什么团队痛...

Android BroadcastReceiver 注册和反注册

发布时间:2017-11-09 移动开发
说起来这个问题很简单,只要注册和反注册成对出现就行,好像很多教材都是如此介绍。但实际开发中,对广播注册和反注册的时机把握还是很重要的。关于广BroadcastReceiver注册和反注册时机,主要有以下几点:onCreate-onDestroy(即便页面未显示,仍然能接受广播)onResume-onPause(即只有页面显示时,才能接受广播)onStart-onStophttp://stackov...

利用 DB2 Everyplace 构建移动 CRM 解决方案

发布时间:2010-03-10 嵌入式 后端 数据库
转自:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1003wangfp/index.html引言DB2Everyplace提供包括嵌入式数据库在内的数据同步整体解决方案,从而为构建移动CRM系统提供强大的技术支持。本文首先介绍了DB2Everyplace产品的结构和功能,随后阐述了移动CRM系统的体系结构,最后...

《OpenGL ES应用开发实践指南:Android卷》—— 3.6 小结

发布时间:2017-07-03 移动开发
本节书摘来自华章出版社《OpenGLES应用开发实践指南:Android卷》一书中的第3章,第3.6节,作者:(美)KevinBrothaler,更多章节内容可以访问云栖社区“华章计算机”公众号查看。3.6 小结在最后把第一个版本的空气曲棍球桌子显示之前,我们不得不撰写了很多样例代码,好消息是,我们可以在后面的项目中重用这些代码。让我们花点儿时间回顾一下本章学过的内容:如何创建和编译着色器。顶点着...

《Android 应用测试指南》——第2章,第2.4节包浏览器

发布时间:2017-05-02 移动开发 测试
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.4节包浏览器,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.4 包浏览器创建完前面提到的两个项目之后,我们打开包浏览器(Packageexplorer),就会看到像图2.3一样的界面。我们注意到这里存在两个相关的项目,每个项目都有自己独立的组件和项目属性。图...

《Android智能穿戴设备开发指南》——第6章,第6.1节Socket编程基础

发布时间:2017-05-02 移动开发 网络 JAVA
本节书摘来自异步社区《Android智能穿戴设备开发指南》一书中的第6章,第6.1节Socket编程基础,作者王长青,更多章节内容可以访问云栖社区“异步社区”公众号查看6.1Socket编程基础Android智能穿戴设备开发指南网络编程中有两个主要问题,一个是如何准确地定位网络中的一台或多台主机,另一个就是找到主机后如何可靠、高效地进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位,数...

《Android 应用测试指南》——第2章,第2.8节其他命令行选择

发布时间:2017-05-02 移动开发
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.8节其他命令行选择,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.8 其他命令行选择之前已经提到了,aminstrument命令中接收输入<名称,值>的键值对,含义如表2.11中所示。表2.11 aminstrument命令的其他选项...

《Android 应用测试指南》——第2章,第2.2节创建一个Android主项目

发布时间:2017-05-02 移动开发 开发工具
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.2节创建一个Android主项目,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.2 创建一个Android主项目我们先创建一个新的Android项目。在Eclipse里面单击菜单栏File-new-Project-Andriod-AndriodProject...

《Android 应用测试指南》——第2章,第2.3节创建一个Android测试项目

发布时间:2017-05-02 移动开发
本节书摘来自异步社区《Android应用测试指南》一书中的第2章,第2.3节创建一个Android测试项目,作者【阿根廷】DiegoTorresMilano(迭戈D.),更多章节内容可以访问云栖社区“异步社区”公众号查看2.3 创建一个Android测试项目单击图2.1中Next按钮,会进入创建Android测试项目的对话框界面。注意这里将会有一些值是继承主项目的,设置值或者是跟主项目对应。另外一...

《Java和Android开发学习指南(第2版)》——第2章,第2.2节分隔符

发布时间:2017-05-02 移动开发 JAVA
本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.2节分隔符,作者【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看2.2 分隔符Java使用某些字符作为分隔符。这些特殊的字符见表2.1。熟悉这些符号和名称很重要,但是,如果你现在还不理解“说明”栏中的术语,也不要担心。...

《Java和Android开发学习指南(第2版)》——第2章,第2.9节注释

发布时间:2017-05-02 移动开发 JAVA 数据库
本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.9节注释,作者【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看2.9 注释在整个代码中编写注释,充分地说明一个类提供了什么函数,一个方法做些什么,一个字段包含什么等,这是一种好的做法。在Java中,有两种类型的注释,它们都和C和C++中的注释有类似的语法。传统注释。传统的...

《Java和Android开发学习指南(第2版)》——第2章,第2.4节变量

发布时间:2017-05-02 移动开发 JAVA
本节书摘来自异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.4节变量,作者【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看2.4 变量变量是数据占位符。Java是一种强类型的语言,因此,每个变量必须有一个声明的类型。Java中有两种数据类型:引用类型一个引用类型的变量,提供对一个对象的引用。基本类型一个基本类型的变量,保存一个基本...

《Java和Android开发学习指南(第2版)》—— 1.4 集成开发环境

发布时间:2017-05-02 移动开发 JAVA 开发工具
本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第1章,第1.4节,作者:【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.4 集成开发环境你可以使用一个文本编辑器来编写Java程序。然而,使用集成开发环境(IntegratedDevelopmentEnvironment,IDE)将会更有帮助。IDE不仅会检查代码的语法错误,还可...

《Java和Android开发学习指南(第2版)》—— 2.3 基本类型

发布时间:2017-05-02 移动开发 JAVA
本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第2章,第2.3节,作者:【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。2.3 基本类型当我们编写一个面向对象应用程序的时候,就会创建和现实世界相似的对象模型。例如,一个工资支付应用程序有Employee对象、Tax对象、Company对象等。然而,在Java中,对象并非唯一的数据类...

《Java和Android开发学习指南(第2版)》—— 1.2 第一个Java程序

发布时间:2017-05-02 移动开发 JAVA
本节书摘来异步社区《Java和Android开发学习指南(第2版)》一书中的第1章,第1.2节,作者:【加】BudiKurniawan,更多章节内容可以访问云栖社区“异步社区”公众号查看。1.2 第一个Java程序本小节将强调Java开发中的步骤,即编写程序,将其编译为字节码以及运行字节码。1.2.1 编写Java程序可以使用任何文本编辑器来编写Java程序。打开一个文本编辑器,并且输入代码清单1...

【翻译】Ext JS 4之HelloWorld

发布时间:2012-06-23 移动开发 测试 JAVASCRIPT VIEWUI
原文:http://www.sencha.com/blog/helloworld-with-ext-js-4/本教程将帮助你学习使用SenchaExtJS4。在文章最后附有完整的源代码和3个高清视频。开始之前使用本教程,需要为Sencha配置开发环境,包括一个浏览器、Web服务器和文本编辑工具(或代码IDE)。我使用的是Chrome浏览器、Mac的Web服务器和komodo编辑器。在Sencha的...

项目优化经验——垃圾回收导致的性能问题[z]

发布时间:2010-03-16 MEMCACHED UI
谈谈最近优化一个网站项目的经验,首先说一下背景情况:1)在页面后台代码中我们把页面上大部分的HTML都使用字符串来拼接生成然后直接赋值给LiteralControl。2)网站CPU很高,基本都在80%左右,即使使用了StringBuilder来拼接字符串性能也不理想。3)为了改善性能,把整个字符串保存在memcached中,性能还是不理想。在比较了这个网站和其它网站服务器上相关性能监视器指标后发现...

Unity3D性能优化总结

发布时间:2017-02-06 移动开发 游戏
一、程序方面  01、务必删除脚本中为空或不需要的默认方法;  02、只在一个脚本中使用OnGUI方法;  03、避免在OnGUI中对变量、方法进行更新、赋值,输出变量建议在Update内;  04、同一脚本中频繁使用的变量建议声明其为全局变量,脚本之间频繁调用的变量或方法建议声明为全局静态变量或方法;  05、不要去频繁获取组件,将其声明为全局变量;  06、数组、集合类元素优先使用Array,...

iOS UI基础-4.0应用程序管理

发布时间:2015-08-23 UI
功能与界面功能分析:以九宫格的形式展示应用信息点击下载按钮后,做出相应的操作步骤分析:加载应用信息根据应用的个数创建对应的view监听下载按钮点击整个应用界面:程序实现思路UI布局:N宫格事件监听动态添加(byplist)整体封装,组合每个应用信息,使用View的层级包装帮助布局项目工程纯代码////UYViewController.m//4.0应用程序管理////Createdbyjiangys...

使用 XML Schema 定义元素的基本知识

发布时间:2005-09-25 嵌入式 IBM 设计模式 编程 XML
学习使用XMLSchema代替DTD定义XML文档结构级别:中级<name>AshvinRadiya</name>,总裁兼首席技术官,AvantSoft,Inc.<name>VibhaDixit</name>,首席执行官,AvantSoft,Inc.2003年12月新的XMLSchema系统即将成为W3C推荐标准,目的是为了克服DTD的局限性(请参阅...

【新发现】不用苹果开发账号就能申请ios证书真机调试

发布时间:2019-04-12 移动开发 游戏 XCODE
虽然xcode现在可以免证书进行测试了,但众多跨平台开发者,如果还没注册苹果开发者账号。想安装到自己非越狱手机测试是无能为力了。 不过新技术来了,只需要普通免费的苹果账号无需付费成为开发者就可以申请iOS证书打包ipa安装到自己手机测试,强大吧! 当然如果要上架AppStore还是需要注册一个付费的苹果开发者账号。 如果只是安装ios应用到自己手机测试,现在只需要注册一个普通的苹果账号就行了。下面...

android4.2音频管理技术

发布时间:2013-04-20 移动开发 ANDROID软件开发 技术人生
如果你的应用程序中有播放音频的功能,一定要让你的用户能够对它进行有效的控制。为了是用户有更好的体验,你的应用程序应该确保多个应用不能同时播放音频(这个可以根据不同的应用进行单独考虑)。通过本篇文章,你将实现播放按钮播放音频的功能,响应系统或应用程序的调用。实现下面的功能:1.实现音频的音量控制和重播。2.控制当前播放的音频和其他应用音频播放的顺序关系。3.控制音频播放输出的硬件。包括音频播放方式和...

总结界面框架_UI_Adapter

发布时间:2017-06-14 ADAPTER UI
本人定期更新经典案例及解决方案如有疑问请联系我QQ1822282728--277627117  下面是常用到的ui Demo安卓三级筛选菜单listview(非常经典)http://download.csdn.net/detail/zillvip/9138975android地图应用(路径规划,地理编码,公交查询,活动轨迹)http://download.csdn.net/detail/zillv...

DWZ国产开源UI框架介绍

发布时间:2012-02-28 VIEWUI WEB UI & JQUERY UI JSON JAVASCRIPT
在Web应用程序的开发过程中,当后台的架构比较成熟后,我们会发现UI成了开发最大的瓶颈。对于大公司而言,他们都有自己的UI框架,因为他们有足够的资源去维护和发展自己的UI框架。通常小公司没有这样的技术力量和资源去维护自己的一套UI框架,选择一个开源UI框架是比较实际的一条路子。 我为WebUI框架做过一次选型,对比了ExtJs/JqueryUI/dhtmlx/DWZ等几个UI框架后,最终选定了DW...

项目经理手记

发布时间:2006-10-07 UI
 上个项目算是告一段落,进展的非常不顺利,但也算是一种经历,从中领略到了很多东西。做项目,就是要从失败中学习,对于导致项目进展不利的因素进行分析,进而使自己在下一次的项目管理过程中不会再一次的犯相同的错误。俗话说的好,人不应该被同一块石头绊倒两次。所以,失败并不都是坏事,虽然对于项目没有按时完成,项目经理承担主要责任,也被领导叫去训话,但是我觉得自己从中分析自己失败的原因,并在下一次项目的改正,这...

【个人重点】开发中应该重视的几点

发布时间:2016-11-01 移动开发 运维 人工智能
个人总结URL统一管理,调用统一方法,并且URL必须返回全路径,可以封装成service,并且url是全路径(包含域名),以后更改都非常方便了静态资源加版本好,调用统一方法用户密码必须加salt,最好记录在数据库中,每个用户都有不同的salt静态资源版本号,每次上线需要版本号不一样了对于数据量很大的查询,时刻记得要释放内存详见phpexcel内存溢出优化手机API必须指定版本号,例如/v1/use...

玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

发布时间:2017-06-15 移动开发 JAVA UI
GLSurfaceView是OpenGL中的一个类,也是能够预览Camera的,并且在预览Camera上有其独到之处。独到之处在哪?当使用Surfaceview无能为力、痛不欲生时就仅仅有使用GLSurfaceView了。它能够真正做到让Camera的数据和显示分离,所以搞明确了这个,像Camera仅仅开预览不显示这都是小菜,妥妥的。Android4.0的自带Camera源代码是用SurfaceV...