国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

安卓開發之SkBitma-p的內存管理

2019-11-02 15:07:17
字體:
來源:轉載
供稿:網友

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

  1. SkBitmap的類結構:

安卓開發之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_

好看的內涵圖吧[www.62-6.com/1/nahantu/]
565_Config, width, height);

  if (!bitmap.allocPixels()) {

  return;

  }

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

  //......

  // 畫到Canvas上

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 股票| 洛阳市| 道孚县| 增城市| 陵川县| 象州县| 华池县| 龙岩市| 沙坪坝区| 昌平区| 江津市| 永顺县| 武安市| 方城县| 焦作市| 怀安县| 开原市| 达州市| 西青区| 滁州市| 泸西县| 庄河市| 台北县| 大石桥市| 湖北省| 昆山市| 大宁县| 马公市| 安岳县| 唐海县| 武胜县| 祁连县| 阿拉善左旗| 泊头市| 丰顺县| 友谊县| 宜昌市| 镇平县| 阿拉善左旗| 三门县| 漳浦县|