您的位置:首页 > 其它

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实现原理,使之开发成小工具,方便控制更新显示图形服务于性能评测,但是“showGPU
view updates”功能依赖于帧渲染HardwareRenderer的一套机制,似乎不能工具实现类似效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: