<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="Android开发之SkBitmap的内存管理（画图动作）" id="card1">
<p> 游客</p><p>
标题:Android开发之SkBitmap的内存管理（画图动作）<br/>
正文:<br/>
 　　SkBitmap是skia中很重要的一个类，很多画图动作涉及到SkBitmap，它封装了与位图相关的一系列操作，了解它的内存管理策略有助于我们更好的使用它，了解它的初衷是要想实现对skia中的blitter进行硬件加速。　　1. SkBitmap的类结构：　　2. SkBitmap的内嵌类Allocator　　Allocator是SkBitmap的内嵌类，其实只有一个成员函数：allocPixelRef()，所以把它理解为一个接口更合适，SkBitmap使用Allocator的派生类&amp;ndash;HeapAllocator作为它的默认分配器。其实现如下：　　bool SkBitmap::HeapAllocator::allocPixelRef(SkBitmap* dst,　　SkColorTable* ctable) {　　Sk64 size = dst-&amp;gt;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-&amp;gt;setPixelRef(new SkMallocPixelRef(addr, size.get32(), ctable))-&amp;gt;unref();　　// since we're already allocated, we lockPixels right away　　dst-&amp;gt;lockPixels();　　return true;　　}　　当然，也可以自己定义一个Allocator，使用SkBitmap的成员函数allocPixels(Allocator* allocator, SkColorTable* ctable) ，传入自定义的Allocator即可，如果传入NULL，则使用默认的HeapAllocator。　　3. SkPixelRef类　　SkPixelRef和Allocator密切相关，Allocator分配的内存由SkPixelRef来处理引用计数，每个Allocator对应一个SkPixe<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1753&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1753&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1753&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=1753&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=1753">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=1753">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>