安卓开发之SkBitmap的内存管理

   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_565_Config, width, height);

  if (!bitmap.allocPixels()) {

  return;

  }

  //...... // 对bitmap进行画图操作

  //......

  // 画到Canvas上

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

时间: 2024-12-22 15:01:24

安卓开发之SkBitmap的内存管理的相关文章

安卓开发之Scroller.startScroll()方法简介

上篇说到,可以使用scrollBy和scrollTo移动View,这里产生一个问题,加入一个View在屏幕的左上角即(0,0)位置,他调用 scrollTo(-300,-300)时,会立即跳过去,显得很突兀,如何让他平缓地划过去呢?就可以用本篇的方法了. 使用方法: int startX;//滑动动作的起始点x坐标 int startY;//滑动动作的起始点y坐标 int dx;    //x轴偏移量向左为负,向右为正(即负值向右移,正值向左移) int dy;    //y轴偏移量向左为负,向

安卓开发之Android帧动画的结束事件

最近在一个Android应用中,用到了帧动画.这东西的具体介绍就不讲了,网上到处是(虽然基本都是抄来抄去--).用起来很简单效果也很好,不过这一次我有一个特殊的要求,希望帧动画在播放完毕的时候做一些其他的事情. 在渐变动画中,我们可以很简单的使用监听器: XXX.setAnimationListener(new AnimationListener() {     @Override     public void onAnimationStart(Animation animation) {  

安卓开发之Picasso框架的使用例子

之前一直使用imageloader这个框架加载图片,觉得配置很麻烦,觉得使用Picasso这个框架. 什么是Picasso我就不多说了,大家可以去官网看,http://square.github.io/picasso/. Picasso使用的方法汇总:  代码如下 复制代码 Picasso.with(context).load("yun_qi_img/DvpvklR.jpg").into(imageView); Picasso.with(context).load(url).into(

安卓开发之ListView(HorizontalListView)横向动态加载数据例子

这个自定义的控件可以实现横向的动态数据加载,话不多说,下面上代码.(使用方法和普通listview一致) 1.在布局里用HorizontalScrollView包含一个ListView: 2.利用GridView,把它的行数设为1行: HorizontalListView.java: package cn.zmit.xianneng.widget; import java.util.LinkedList; import java.util.Queue; import android.conten

安卓开发之Intent传递Object与List教程

  Intent 不仅可以传单个的值,也可以传对象与数据集合. 传递List<String> 数据集合. ArrayList<String> info = new ArrayList<String>();      info.add(name);      info.add(website);      info.add(weibo); Intent intent = new Intent(MainActivity.this, ResultActivity.class)

安卓开发之android 拍照和相册选择图片例子

android从选择图片有两种方法,但是返回值确不同,本文将指导大家如何统一这两种方式的返回值. //关键代码  @Event(R.id.btnPhoto)     private void onBtnPhotoClicked(View view) {         Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);         startActivity

安卓开发之Collections.sort方法对list按时间排序

compare(a,b)方法:根据第一个参数小于.等于或大于第二个参数分别返回负整数.零或正整数. equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true. Collections.sort(list, new PriceComparator());的第二个参数返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序. 一直都没有接触排序,突然要实现对List的排序,找了一下资料

Android开发之activity的生命周期详解_Android

本文实例讲述了Android activity的生命周期.分享给大家供大家参考,具体如下: activity类处于android.app包中,继承体系如下: 1.Java.lang.Object 2.android.content.Context 3.android.app.ApplicationContext 4.android.app.Activity activity是单独的,用于处理用户操作.几乎所有的activity都要和用户打交道,所以activity类创建了一个窗口,开发人员可以通

Eclipse插件开发之FindBugs插件

问题提出: 当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了. 解决方法: 现在有很多Java代码分析工具,FindBugs中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性. 安装 JDK:1.5.0 从http://java.sun.com上去下载安装 Eclipse:3.1.1 从http://www.