<p>在上一篇<a href="http://blog.csdn.net/yangwen123/article/details/16344375" rel="noopener noreferrer" style="list-style:none; text-decoration:none; word-break:break-all; word-wrap:break-word; color:rgb(59,89,152); font-family:Verdana,'Lucida Grande',Arial,Helvetica,sans-serif" target="_blank">Android Project Butter分析</a>中介绍了Android4.1通过引入VSync机制来改善显示效果,并分析了VSync机制的原理。本文主要分析VSync信号的产生过程。VSync信号产生有两种方式,一种是硬件中断产生,另一种是使用软件模拟产生,至于使用何种方式产生VSync信号,就和硬件系统配置有关。在Android4.1以后的版本中,定义了HWComposer硬件抽象模块来负责产生VSync信号。HWComposer硬件抽象层定义:</p>
<p>hardware\libhardware\modules\hwcomposer\hwcomposer.cpp<br> </p>
<p></p>
<pre class="blockcode"><code class="language-cpp">hwc_module_t HAL_MODULE_INFO_SYM = {
common: {
tag: HARDWARE_MODULE_TAG,
version_major: 1,
version_minor: 0,
id: HWC_HARDWARE_MODULE_ID,
name: "Sample hwcomposer module",
author: "The Android Open Source Project",
methods: &hwc_module_methods,
}
};
</code></pre>注册的硬件抽象模块方法定义如下:
<p></p>
<p></p>
<pre class="blockcode"><code class="language-cpp">static struct hw_module_methods_t hwc_module_methods = {
open: hwc_device_open
};</code></pre>
<p>关于为硬件抽象模块HWComposer定义的数据结构之间的关系如下下图所示:</p>
<p style="text-align:center"><img alt="" height="445" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-1e2790af89291bba5bd4a2e7da0151ba" width="700"><br> </p>
<p>在初始化DisplayHardware对象时,会创建一个HWComposer对象:</p>
<p></p>
<p></p>
<pre class="blockcode"><code class="language-cpp">void DisplayHardware::init(uint32_t dpy)
{
...
// initialize the H/W composer
mHwc = new HWComposer(mFlinger, *this, mRefreshPeriod);
if (mHwc->initCheck() == NO_ERROR) {
mHwc->setFrameBuffer(mDisplay, mSurface);
}
}</code></pre>这里使用SurfaceFlinger,DisplayHardware对象及屏幕刷新周期来构造HWComposer对象,HWComposer的构造过程如下:
<p></p>
<p>frameworks\native\services\surfaceflinger\DisplayHardware\HWComposer.cpp<br> </p>
<pre class="blockcode"><code class="language-cpp">HWComposer::HWComposer(const sp<SurfaceFlinger>& flinger,EventHandler& handler,nsecs_t refreshPeriod)
: mFlinger(flinger),
mModule(0), mHwc(0), mList(0), mCapacity(0),
mNumOVLayers(0), mNumFBLayers(0),
mDpy(EGL_NO_DISPLAY), mSur(EGL_NO_SURFACE),
mEventHandler(handler),
mRefreshPeriod(refreshPeriod),
mVSyncCount(0), mDebugForceFakeVSync(false)
{
char value[PROPERTY_VALUE_MAX];
property_get("debug.sf.no_hw_vsync", value, "0");
mDebugForceFakeVSync = atoi(value);
//是否需要软件模拟VSync
bool needVSyncThread = false;
//加载HWComposer硬件抽象模块
int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);
ALOGW_IF(err, "%s module not found", HWC_HARDWARE_MODULE_ID);
if (err == 0) {
//打开HWComposer硬件抽象模块
err = hwc_open(mModule, &mHwc);
if (err == 0) {
//打开成功,注册回调函数
if (mHwc->registerProcs) {
mCBContext.hwc = this;
mCBContext.procs.invalidate = &hook_invalidate;
mCBContext.procs.vsync = &hook_vsync;
mHwc->registerProcs(mHwc, &mCBContext.procs);
memset(mCBContext.procs.zero, 0, sizeof(mCBContext.procs.zero));
}
if (mHwc->common.version >= HWC_DEVICE_API_VERSION_0_3) {
if (mDebugForceFakeVSync) {
// make sure to turn h/w vsync off in "fake vsync" mode
mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
}
} else {
needVSyncThread = true;
}
}
} else {
needVSyncThread = true;
}
//如果HWComposer硬件抽象模块打开失败或者HWComposer硬件抽象模块的版本小于HWC_DEVICE_API_VERSION_0_3,则采用软件模拟产生VSync信号
if (needVSyncThread) {
//创建VSync产生线程VSyncThread
mVSyncThread = new VSyncThread(*this);
}
}</code></pre>
<p>在构造HWComposer对象时,选择了VSync信号产生方式:1.硬件产生;2.软件模拟产生;假如当前系统可以成功加载HWC_HARDWARE_MODULE_ID=hwcomposer,并且通过这个库能顺利打开设备(hwc_composer_device_t),并且其版本号又大于HWC_DEVICE_API_VERSION_0_3的话,我们就采用硬件方式产生VSync,否则需要创建一个新的VSync线程来模拟产生信号。</p>
<p><br> </p>
<h2>1.硬件产生VSync信号过程</h2>
<div>
<br>
</div>
<div>
Android定义了hwcomposer硬件抽象模块来负责产生VSync信号,因此在使用硬件方式产生VSync信号时,需要首先加载并打开hwcomposer硬件抽象模块 |
|