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

來源:互聯網
上載者:User

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

  1. SkBitmap的類結構:

  2. SkBitmap的內嵌類Allocator

  Allocator是SkBitmap的內嵌類,其實只有一個成員函數:allocPixelRef(),所以把它理解為一個介面更合適,SkBitmap使用Allocator的衍生類別–HeapAllocator作為它的預設分配器。其實現如下:

  bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst,

  SkColorTable* ctable) {

  Sk64 size = dst->getSize64();

  if (size.isNeg() || !size.is32()) {

  return false;

  }

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

  if (NULL == addr) {

  return false;

  }

  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()) {

  return;

  }

  //...... // 對bitmap進行畫圖操作

  //......

  // 畫到Canvas上

  canvas->drawBitmap(bitmap, SkFloatToScalar(x), SkFloatToScalar(y), paint);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.