安卓開發之SkBitmap的記憶體管理分析

2021-03-25 05:45:00 字數 1561 閱讀 3376

2023年5月29日18:08

**:安卓中文網

我有話說(0人參與)

安卓使用的2d圖形引擎skia,是乙個高效的2d向量圖形庫,google已經把skia開源了。

skbitmap是skia中很重要的乙個類,很多畫圖動作涉及到skbitmap,它封裝了與點陣圖相關的一系列操作,了解它的記憶體管理策略有助於我們更好的使用它,了解它的初衷是要想實現對skia中的blitter進行硬體加速。

1. skbitmap的類結構:

2. skbitmap的內嵌類allocator

allocator是skbitmap的內嵌類,其實只有乙個成員函式:allocpixelref(),所以把它理解為乙個介面更合適,skbitmap使用allocator的派生類–heapallocator作為它的預設分配器。其實現如下:

bool skbitmap::heapallocator::allocpixelref(skbitmap* dst,

skcolortable* ctable)

void* addr = sk_malloc_flags(size.get32(), 0); // returns null on failure

if (null == addr)

dst->setpixelref(new skmallocpixelref(addr, size.get32(), ctable))->unref();

// since we're already allocated, we lockpixels right away

dst->lockpixels();

return true;

}  當然,也可以自己定義乙個allocator,使用skbitmap的成員函式allocpixels(allocator* allocator, skcolortable* ctable) ,傳入自定義的allocator即可,如果傳入null,則使用預設的heapallocator。

3. skpixelref類

skpixelref和allocator密切相關,allocator分配的記憶體由skpixelref來處理引用計數,每個allocator對應乙個skpixelref,通常在分配記憶體成功後,由allocator呼叫setpixelref來進行繫結。預設的情況下,skbitmap使用 skmallocpixelref和heapallocator進行配對。所以如果你要派生allocator類,通常也需要派生乙個 skpixelref類與之對應。

4. 使用例子

以下是一段簡短的**,示意如何動態分配乙個skbitmap:

skbitmap bitmap;

bitmap.setconfig(hasalpha ? skbitmap::kargb_8888_config :

skbitmap::krgb_565_config, width, height);

if (!bitmap.allocpixels())

對bitmap進行畫圖操作

// 畫到canvas上

canvas->drawbitmap(bitmap, skfloattoscalar(x), skfloattoscalar(y), paint);

安卓的記憶體管理機制

1.系統會對程序的重要性進行評估,並將重要性以 oom adj 這個數值表示出來,賦予各個程序 系統會根據 oom adj 來判斷需要結束哪些程序,一般來說,oom adj 的值越大,該程序被系統選中終止的可能就越高 2.前台程式的 oom adj 值為0,這意味著它不會被系統終止,一旦它不可訪問後...

哪裡的安卓培訓機構好

隨著安卓市場份額的不斷擴大,安卓技術人才的需求也越來越多,現在有很多的學生和家長都會問武漢 的安卓培訓機構好?武漢安卓培訓首選4g夢工場。目前中國擁有世界上最大的手機使用者群,再加上3g的推出對整個行業的巨大推動作用,全世界所有大中小型手機製造商幾乎都在招聘安卓工程師。隨著安卓平台的擴張,引發了安卓...

螢幕很小的安卓手機有哪些

開箱 這可能是全世界最小的安卓手機?今天帶來可能是全世界最小的安卓手機。沒錯,就是這款microxs240 下面簡稱 xs240 是poshmobile生產的。說明書上的規格是 4g儲存空間,512mb的記憶體,雙核處理器,多點觸控,200萬畫素後置攝像頭。基本上滿足了一款智慧型手機的需求了。開箱後...