Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android中的2D引擎skia之 -- SkBitmap的內存管理分析

Android中的2D引擎skia之 -- SkBitmap的內存管理分析

編輯:Android開發實例

Android使用的2D圖形引擎skia,是一個高效的2D矢量圖形庫,google已經把skia開源:http://code.google.com/p/skia/。

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

1.  SkBitmap的類結構:

 

2.  SkBitmap的內嵌類Allocator

     Allocator是SkBitmap的內嵌類,其實只有一個成員函數:allocPixelRef(),所以把它理解為一個接口更合適,SkBitmap使用Allocator的派生類--HeapAllocator作為它的默認分配器。其實現如下:

 

  1. bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst,  
  2.                                             SkColorTable* ctable) {  
  3.     Sk64 size = dst->getSize64();  
  4.     if (size.isNeg() || !size.is32()) {  
  5.         return false;  
  6.     }  
  7.     void* addr = sk_malloc_flags(size.get32(), 0);  // returns NULL on failure  
  8.     if (NULL == addr) {  
  9.         return false;  
  10.     }  
  11.     dst->setPixelRef(new SkMallocPixelRef(addr, size.get32(), ctable))->unref();  
  12.     // since we're already allocated, we lockPixels right away  
  13.     dst->lockPixels();  
  14.     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:

 

 
  1. SkBitmap    bitmap;     
  2.     
  3. bitmap.setConfig(hasAlpha ? SkBitmap::kARGB_8888_Config :     
  4.                  SkBitmap::kRGB_565_Config, width, height);     
  5. if (!bitmap.allocPixels()) {     
  6.     return;     
  7. }     
  8.     
  9. //......     
  10. // 對bitmap進行畫圖操作     
  11. //......             
  12. // 畫到Canvas上     
  13. canvas->drawBitmap(bitmap, SkFloatToScalar(x), SkFloatToScalar(y),     
  14.                    paint);    
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved