Time of Update: 2017-02-27
上節openfire伺服器已經搭建完成,這節看看,怎麼使用smack基於xmpp協議登入openfire伺服器,在伺服器中建立好測試的帳號下面看android用戶端的代碼,關於介面布局就不多說了,可以參考QQandroid用戶端的介面:Android高仿QQ登入介面
Time of Update: 2017-02-27
在部落格中有登陸介面的文章http://blog.csdn.net/vestigge/article/details/8124674就不在重複了,直接看登陸的代碼,用Mina傳遞字串上節已經看過了,要實現傳遞對象,也非常簡單,只需要修改一下過濾器:chain.addLast("codec", new ProtocolCodecFilter(new
Time of Update: 2017-02-27
Apache MINA是一個網路應用程式架構,用來協助使用者簡單地開發高效能和高可靠性的網路應用程式。它提供了一個通過Java NIO在不同的傳輸例如TCP/IP和UDP/IP上抽象的事件驅動的非同步API。Apache MINA 也稱為:● NIO 架構庫● 用戶端伺服器架構庫● 一個網路通訊端庫MINA雖然簡單但是仍然提供了全功能的網路應用程式架構:● 為不同的傳輸類型提供了統一的API:○ 通過Java NIO提供TCP/IP 和 UDP/IP支援○ 通過RXTX提供串口通訊(RS232)
Time of Update: 2017-02-27
1.1.1 postFramebuffer在多緩衝區機制中,只有把顯示資料寫入framebuffer才能真正在物理螢幕上顯示。前面幾個小節的輸出都是backbuffers,我們還需要最後一步——postFramebuffer。void SurfaceFlinger::postFramebuffer(){… const
Time of Update: 2017-02-27
1.1.1 handleRepaint經過handleTransaction和handlePageFlip等步驟的準備工作後,現在可以合成各圖層資料了。void SurfaceFlinger::handleRepaint(){…mSwapRegion.orSelf(mDirtyRegion); const DisplayHardware&hw(graphicPlane(0).displayHardware());
Time of Update: 2017-02-27
1.1.1 handleRefresh從名稱上看,這個函數處理“重新整理”。經過比對新老版本的差異,我們覺得這個地方應該是老版本遺留下來的“廢料”。換句話說,它對MessageQueue::REFRESH事件的處理沒有起到作用。void SurfaceFlinger::handleRefresh(){bool needInvalidate =false;const
Time of Update: 2017-02-27
1.1.1
Time of Update: 2017-02-27
1.1.1 VSync訊號的處理經過上一小節的分析,現在我們已經明白了系統是如何通過硬體裝置或者軟體類比來產生VSync訊號的,也明白了它的流轉過程。VSync最終會被EventThread::threadLoop()分發給各監聽者,在目前的版本中是MessageQueue。MessageQueue通過與EventThread建立一個Connection來監聽事件,簡圖如下:圖 11?35 Connection代表了EventThread和對事件感興趣的對象的串連對VSYNC等事件感興趣的對象,
Time of Update: 2017-02-27
1.1 VSync的產生和處理前面小節ProjectButter中我們學習了Android 4.1顯示系統中的新特性,其中一個就是加入了VSync同步。我們從理論的角度分析了採用這一機制的必要性和運作機理,那麼SurfaceFlinger具體是如何實施的呢?先來想一下有哪些東西要考慮:· VSync訊號的產生和分發如果有硬體主動發出這一訊號,那是最好的了;否則就得通過軟體定時類比來產生·
Time of Update: 2017-02-27
1.1.1 SurfaceComposerClient圖 11?28
Time of Update: 2017-02-27
SurfaceFlinger的啟動與工作原理1.1.1 SurfaceFlinger的啟動SurfaceFlinger的啟動和ServiceManager有點類似,它們都屬於系統的底層支撐服務,必需在裝置開機的早期就運行起來。/*frameworks/base/cmds/system_server/library/System_init.cpp*/extern "C" status_t system_init(){…
Time of Update: 2017-02-27
1.1 SurfaceFlinger從這一小節開始,我們正式切入SurfaceFlinger的分析。為了保持講解的連貫性,部分內容可能在前面的章節中已經有所涉及了,接下來將會對其中的細節做更多的擴充講解。內容組織如下:l 首先介紹Android 4.1引入的新特性(Project Butter),理解這個項目是必要的,可以說SurfaceFlinger有很大一部分的內容就是圍繞它來的l SurfaceFlinger的啟動過程及工作方式l
Time of Update: 2017-02-27
1.1.1
Time of Update: 2017-02-27
1.1.1 應用程式的典型繪圖流程我們知道,BufferQueue有最多達32個BufferSlot,這樣設計的目的是什嗎?一個可能的原因就是提高圖形渲染速度。因為假如只有兩個buffer,可以想象一下,當應用程式這個生產者的產出效率大於消費者的處理速度時,很快它就會dequeue完所有緩衝區而處於等待狀態,從而導致不必要的麻煩。當然,實際上32隻是最大的容量,具體值是可以設定的,大家可以結合後面的ProjectButter小節來理解一下。前面小節我們已經學習了BufferQueue的內部原理,
Time of Update: 2017-02-27
1.1.1 BufferQueue中的緩衝區分配我們知道,BufferQueue中有一個mSlots數組用於管理其內的各緩衝區,最大容量為32。從它的聲明方式來看,這個mSlots在程式一開始就靜態分配了32個BufferSlot大小的空間。不過這並不代表緩衝區也是一次性靜態分配的,恰恰相反,從BufferSlot的內部變數指標mGraphicBuffer可以看出,緩衝區的空間分配應當是動態(從下面的注釋也能看出一些端倪):// mGraphicBuffer points to the
Time of Update: 2017-02-27
1.1
Time of Update: 2017-02-27
opengl es本地視窗SurfaceTextureClient1.1.1 SurfaceTextureClient針對應用程式端的本地視窗是SurfaceTextureClient,和FramebufferNativeWindow一樣,它必須繼承ANativeWindow:class SurfaceTextureClient : publicANativeObjectBase<ANativeWindow,
Time of Update: 2017-02-27
Android中的本地視窗FramebufferNativewindow 1.1 Android中的本地視窗在OpenGL的學習過程中,我們不斷提及“本地視窗”(NativeWindow)這一概念。那麼對於Android系統來說,它是如何將OpenGL
Time of Update: 2017-02-27
1.1 Gralloc與Framebuffer相信做過Linux開發的人對framebuffer不會太陌生,它是核心系統提供的一個與硬體無關的顯示抽象層。之所以稱之為buffer,是由於它也是系統儲存空間的一部分,是一塊包含螢幕顯示資訊的緩衝區。由此可見,在“一切都是檔案”的Linux系統中,Framebuffer被看成了終端monitor的“化身”。它藉助於檔案系統向上層提供統一而方便的操作介面,從而讓使用者空間程式可以不用修改就能適應多種螢幕&
Time of Update: 2017-02-27
第1章 GUI系統之SurfaceFlinger在進入GUI系統的學習前,建議大家可以先閱讀本書應用篇中的“OpenGLES”章節,並參閱OpenGL ES官方指南。因為Android的GUI系統是基於OpenGL/EGL來實現的,如果沒有一定基礎的話,分析源碼時有可能會“事倍功半”。1.1 OpenGLES與EGLSurfaceFlinger雖然是GUI的核心,但相對於OpenGL