Show GPU View Update实现原理
2016-01-04 23:46
645 查看
1 属性开关
DevelopmentSettings:privatevoid writeShowHwScreenUpdatesOptions() {
SystemProperties.set(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY,
mShowHwScreenUpdates.isChecked()? "true" : null);
pokeSystemProperties();
}
private voidupdateShowHwLayersUpdatesOptions() {
updateCheckBox(mShowHwLayersUpdates,SystemProperties.getBoolean(
HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, false));
}
2 处理逻辑
2.1 读取属性值
HardwareRenderer:value =SystemProperties.getBoolean(DEBUG_DIRTY_REGIONS_PROPERTY, false);
if (value != mDebugDirtyRegions) {
changed = true;
//初始化mDebugDirtyRegions值
mDebugDirtyRegions = value;
if (mDebugDirtyRegions) {
Log.d(LOG_TAG,"Debugging dirty regions");
}
}
但这里只是处理“ShowGPU View Update”开关设置的值,如果在RENDER_DIRTY_REGIONS_PROPERTY该值默认初始化值为fales,则系统不会显示view
update效果,即使“Show GPU View Update”开关已经处于打开的状态。如下代码:
HardwareRenderer
:
static {
/// M: Default is off, only switchon for compatible chips.
String dirtyProperty =SystemProperties.get(RENDER_DIRTY_REGIONS_PROPERTY,
"true");
//noinspection PointlessBooleanExpression,ConstantConditions
sDirtyRegions =RENDER_DIRTY_REGIONS && "true".equalsIgnoreCase(dirtyProperty);
sDirtyRegionsRequested =sDirtyRegions;
}
2.2 绘制更新的帧
Android源码中该函数主要实现对屏幕一帧更新区域(DirtyRegion)进行红色矩形绘制标识。privatevoid debugDirtyRegions(Rect dirty, HardwareCanvas canvas){
if (mDebugDirtyRegions) {
if (mDebugPaint == null) {
mDebugPaint = new Paint();
mDebugPaint.setColor(0x7fff0000);
}
if (dirty != null &&(mFrameCount & 1) == 0) {
canvas.drawRect(dirty,mDebugPaint);
}
}
}
如果我们利用其实现原理,进行适当修改,让他显示一个点和当前画面帧总数,则在进行性能评测时有利于我们识别帧数。特别是出现卡顿情况下,单纯的使用人眼通过高速摄像机来数帧数,误差很大。通过修改之后,能很好的标识出帧更新情况。代码如下:
HardwareRenderer:
privatevoid debugDirtyRegions(Rect dirty, HardwareCanvas canvas) {
Log.i("DIRTY","mDebugDirtyRegions:"+mDebugDirtyRegions);
if (mDebugDirtyRegions) {
if (mDebugPaint == null) {
mDebugPaint = new Paint();
//0x7f083B0F
mDebugPaint.setColor(0xffff0000);
Log.i("DIRTY","mDebugDirtyRegions:"+mDebugDirtyRegions);
}
Log.i("DIRTY","Color:"+mDebugPaint.getColor());
Log.i("DIRTY","DIRTY DRAW1 :"+dirty);
if (dirty != null &&(mFrameCount & 1) == 0) {
canvas.drawCircle(200, 100,10, mDebugPaint);
mDebugPaint.setTextSize(35);
canvas.drawText(mFrameCount+"", 200,130, mDebugPaint);
Log.i("DIRTY","DIRTY DRAW2 :"+dirty);
}
}
}
Draw():
if (mDrawDelta> 0) {
//帧数
mFrameCount++;
debugOverdraw(attachInfo, dirty, canvas, displayList);
debugDirtyRegions(dirty,canvas);
drawProfileData(attachInfo);
}
上面的代码主要是在DirtyRegion区域画一个红色的圆形,以及帧数。滑动listview时效果如下:
3 工具实现
本来打算了解GPU view updates实现原理,使之开发成小工具,方便控制更新显示图形服务于性能评测,但是“showGPUview updates”功能依赖于帧渲染HardwareRenderer的一套机制,似乎不能工具实现类似效果。
相关文章推荐
- 数据库004
- 编写一个函数(递归实现) 实现:将参数字符串中的字符反向排列。
- Android 自定义日期和时间和星期的弹窗
- Linux 段错误调试Segment Fault
- 81. $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别
- 如何使用OpenGL中的扩展
- 转:普通继电器和自锁继电器的差别
- 直接插入排序StraightInsertSort
- nmap小技巧[1] 探测大网络空间中的存活主机
- 第一组项目需求分析以及人员分配
- 数据库005
- 简单的网络通信程序,客户端发送hello,server 服务器反馈 ok UDP
- python 串行编程简单例程
- OpenGL编程低级错误+常见问题简答
- IOS开发基础知识--碎片31
- 11.6---矩阵查找元素(CC150)
- 文章标题
- WARNING: No mapping found for HTTP request with URI
- UVALive 5983
- 蓝懿ios技术交流和心得分享16.1.4