android非硬件加速绘制简单流程
这里的硬件加速是指openGL + GPU
如果不适用硬件加速:
1 ViewRootImpl.java draw:
if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) {
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
...
mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this); //使用硬件绘制
...
} else {
//使用软件绘制
if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) {
return;
}
}
2. drawSoftware:
...
canvas = mSurface.lockCanvas(dirty); //dequeueBuffer, 向sf申请buffer 构造一个canvas
...
mView.draw(canvas); //调用view类中的draw,使用canvas画图
...
surface.unlockCanvasAndPost(canvas); // queueBuffer 提交到sf
...
3. canvas 画图的实现如 Canvas.java 中drawArc:
=》 native_drawArc
4. android_graphics_canvas.cpp:
static JNINativeMethod gMethods[] = {
...
{"native_drawArc","(JFFFFFFZJ)V", (void*) CanvasJNI::drawArc},
...
}
=> static void drawArc(JNIEnv* env, jobject, jlong canvasHandle, jfloat left, jfloat top,
jfloat right, jfloat bottom, jfloat startAngle, jfloat sweepAngle,
jboolean useCenter, jlong paintHandle) {
const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
get_canvas(canvasHandle)->drawArc(left, top, right, bottom, startAngle, sweepAngle,
useCenter, *paint);
}
// canvasHandle从何而来?
static jlong initRaster(JNIEnv* env, jobject, jobject jbitmap) {
SkBitmap bitmap;
if (jbitmap != NULL) {
GraphicsJNI::getSkBitmap(env, jbitmap, &bitmap);
}
return reinterpret_cast<jlong>(Canvas::create_canvas(bitmap));
}
5. SkiaCanvas.cpp:
Canvas* Canvas::create_canvas(const SkBitmap& bitmap) {
return new SkiaCanvas(bitmap);
}
=>
SkiaCanvas::SkiaCanvas(const SkBitmap& bitmap) : mHighContrastText(false) {
mCanvas.reset(new SkCanvas(bitmap));
}
//最终调到了SkCanvas ? 它是google的2d图像库,这里用bitmap构造,在bitmap上画图
源码位于android/external/skia/
所以封装层次是 Canvas.java (Java) -》 android_graphics_canvas.cpp(JNI) -》SkiaCanvas.cpp(native) -》 SkCanvas (so lib)
最新文章
- Struts相关
- Atitit 理解Monad attilax总结
- node 日志管理log4js
- bzoj2012: [Ceoi2010]Pin
- Erlang库 -- 有意思的库汇总
- POJ 2823【单调队列】
- Python 中使用optparse进行参数解析
- php/ java/asp.net
- Smarty中一些标签的使用
- Ubuntu桌面版与服务器版有什么不同?
- tomcat,tomcat7配置https
- C# DropDownList绑定添加新数据的几种方法
- QSqlDatabase::addDatabase第一次运行的时候,生成SQLite文件的同时会产生一个默认连接
- C++中const用法详解
- HNTX_PC 代码总结
- 打开";我的电脑";等特殊文件夹ShellExecute
- JQ滚动特效
- docker挂载NVIDIA显卡运行pytorch
- Spring声明式事务配置
- cents上运行wget报错:unable to resolve host address
热门文章
- [转]C#线程同步(1)- 临界区&Lock
- WPF 导出Excel 导出图片
- LUOGU P2962 [USACO09NOV]灯Lights
- BZOJ 1933 [Shoi2007]Bookcase 书柜的尺寸
- go modules
- spring入门案例分析及原理
- JAVA面试常见问题之常见集合篇
- Django项目:CRM(客户关系管理系统)--26--18PerfectCRM实现King_admin搜索关键字
- poj 1654 Area(求多边形面积 &;&; 处理误差)
- Eclipse安装Spket插件