canvas教程

安卓开发之SkBitmap的内存管理

字号+ 作者:H5之家 来源:H5之家 2016-09-28 16:00 我要评论( )

安卓开发之SkBitmap的内存管理 SkBitmap是skia中很重要的一个类,很多画图动作涉及到SkBitmap,它封装了与位图相关的一系列操作,了解它的内存管理策略有助于我们更好的使用它,了解它的初衷是要想实现对skia中的blitter进行硬件加速。 1. SkBitmap的类结构

安卓开发之SkBitmap的内存管理

   SkBitmap是skia中很重要的一个类,很多画图动作涉及到SkBitmap,它封装了与位图相关的一系列操作,了解它的内存管理策略有助于我们更好的使用它,了解它的初衷是要想实现对skia中的blitter进行硬件加速。

  1. SkBitmap的类结构:

安卓开发之SkBitmap的内存管理 msdn我告诉你

  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);

下一篇:Access怎样制作复杂报表

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • WEB开发 之 HTML 5 Canvas

    WEB开发 之 HTML 5 Canvas

    2016-04-09 13:00

  • 使用双缓冲技术实现Android画板应用

    使用双缓冲技术实现Android画板应用

    2016-03-30 15:32

  • Android 游戏开发之Canvas画布

    Android 游戏开发之Canvas画布

    2016-03-06 15:29

  • MaterialDesign学习之ProgreesBar

    MaterialDesign学习之ProgreesBar

    2016-02-11 16:00

网友点评