編輯:Android開發教程
1.1 VSync的產生和處理
前面小節ProjectButter中我們學習了Android 4.1顯示系統中的新特性,其中一個就是加入了VSync同步。我們從理論的角度分析了采用這一機制的必要性和運作機理,那麼SurfaceFlinger具體是如何實施的呢?
先來想一下有哪些東西要考慮:
· VSync信號的產生和分發
如果有硬件主動發出這一信號,那是最好的了;否則就得通過軟件定時模擬來產生
· VSync信號的處理
當信號產生後,SurfaceFlinger如何在最短的時間內響應,具體處理流程是怎麼樣子的
1.1.1 VSync信號的產生和分發
在Android源碼surfaceflinger目錄下有一個displayhardware文件夾,其中HWComposer的主要職責之一,就是用於產生VSync信號。
/*frameworks/native/services/surfaceflinger/displayhardware/HWComposer.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)
{
charvalue[PROPERTY_VALUE_MAX];
property_get("debug.sf.no_hw_vsync", value, "0"); //系統屬性
mDebugForceFakeVSync =atoi(value);
bool needVSyncThread =false;//是否需要軟件模擬VSync
int err = hw_get_module(HWC_HARDWARE_MODULE_ID, &mModule);//加載HAL模塊
if (err == 0) {
err = hwc_open(mModule, &mHwc);//打開module
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) {//用於調試
mHwc->methods->eventControl(mHwc, HWC_EVENT_VSYNC, 0);
}
} else {//有可能支持VSync的硬件模塊是這個版本以後才加入的,老版本仍然需要軟件模擬
needVSyncThread = true;
}
}
} else {
needVSyncThread =true; //硬件模塊打開失敗,只能用軟件模擬
}
if (needVSyncThread) {
mVSyncThread = new VSyncThread(*this);//創建一個產生VSync信號的線程
}
}
記得我之前參與開發過一個華為的項目,要求程序可以支持好幾種終端設備,其中就包括Android手機和 Android Pad。然後為了節省人力,公司無節操地讓Android
如果不使用系統自帶的TitleBar(即Activity被設置@android:style/Theme.NoTitleBar),那就需要自己來寫進度條了,這裡封裝了一個自
Preview data Preview callbackAndroid Camera小系統:嗯……直接看Camera HAL層,它實現是主
前面的一節,介紹了如何組合使用Gallery和ImageView。但是,有的時候當你在gallery中點擊一個圖片 ,你可能不希望一個圖片“突然地&rdquo