Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android GUI系統之SurfaceFlinger(12) VSync信號的產生和處理

Android GUI系統之SurfaceFlinger(12) VSync信號的產生和處理

編輯: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信號的線程

   }

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved