news 2026/6/10 15:53:17

鸿蒙高性能图形绘制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙高性能图形绘制

说明

HarmonyOs ArkGraphics 2D(方舟2D图形服务 )提供的绘制引擎,如果在 ArkUI 侧绘制,对绘制性能有高要求的话,那就直接放弃,转Native绘制配合 GPU 后端渲染。(想到这儿我浑身难受)

图形绘制流程

理解图形绘制的基本流程,再调用 api 就好理解一些。

  1. 画布的创建,画布作为图形绘制的承载,是最基本最关键的。(必须)
  2. 进行画布操作,例如旋转、裁剪、缩放操作(可选)
  3. 设置绘制效果,比如填充什么颜色,画笔的颜色,画笔的轮廓等(可选)
  4. 绘制图元,图形绘制最后一步即为图元的绘制,不论多么复杂的图形,都是基础图元的不同组合。(必须)

画布的获取

  1. 添加链接库 libnative_drawing.so
target_link_libraries(entry PUBLIC libnative_drawing.so)
  1. 导入依赖的相关头文件
#include <native_drawing/drawing_canvas.h>#include <native_drawing/drawing_surface.h>
  1. 从XComponent对应的NativeWindow中获取BufferHandle对象。NativeWindow相关的API请参考native_window。
uint64_twidth,height;OHNativeWindow*nativeWindow;// NativeWindow及其宽高需要从XComponent获取// 设置本地窗口缓冲区读写方式int32_tusage=NATIVEBUFFER_USAGE_CPU_READ|NATIVEBUFFER_USAGE_CPU_WRITE|NATIVEBUFFER_USAGE_MEM_DMA;intret=OH_NativeWindow_NativeWindowHandleOpt(nativeWindow,SET_USAGE,usage);if(ret!=0){return;}// 通过OHNativeWindow对象申请一块OHNativeWindowBuffer,用以内容生产structNativeWindowBuffer*buffer=nullptr;intfenceFd=0;ret=OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow,&buffer,&fenceFd);if(ret!=0){return;}// 通过OHNativeWindowBuffer获取该buffer的BufferHandle指针。BufferHandle*bufferHandle=OH_NativeWindow_GetBufferHandleFromNative(buffer);

4.从BufferHandle中获取对应的内存地址。

uint32_t* mappedAddr=static_cast<uint32_t *>(mmap(bufferHandle->virAddr, bufferHandle->size, PROT_READ|PROT_WRITE, MAP_SHARED, bufferHandle->fd,0));

5.创建窗口画布

// 创建 OH_Drawing_Bitmap 将其作为画布铺在 OH_Drawing_Canvas 上。这样就可以开始作画了。 cScreenBitmap_=OH_Drawing_BitmapCreate();// 定义bitmap的像素格式 OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};// 构造对应格式的bitmap uint32_t width=static_cast<uint32_t>(bufferHandle_->stride /4);// 初始化位图对象的宽度和高度,并且为该位图设置像素格式。 OH_Drawing_BitmapBuild(cScreenBitmap_, width, height_,&cFormat);// 创建一块画板,画布是 cScreenBitmap_。 OH_Drawing_Canvas* screenCanvas=OH_Drawing_CanvasCreate();// 将画布铺在画板上 OH_Drawing_CanvasBind(screenCanvas, cScreenBitmap_);
  1. 绘制内容(作画)
// 创建画笔 OH_Drawing_Pen *pen=OH_Drawing_PenCreate()// 设置抗锯齿 OH_Drawing_PenSetAntiAlias(pen,true);// 设置画布颜色为红色 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));// 设置线帽样式为圆头 OH_Drawing_PenSetCap(pen, LINE_ROUND_CAP);// 设置线段转角样式为圆头 OH_Drawing_PenSetJoin(pen, LINE_ROUND_JOIN)// 绑定画布screenCanvas OH_Drawing_CanvasAttachPen(screenCanvas, pen)// 绘制一个矩形 OH_Drawing_Rect* rect=OH_Drawing_RectCreate(50,50,200,300);OH_Drawing_CanvasDrawRect(screenCanvas, rect);// 解绑画笔 OH_Drawing_CanvasDetachPen(screenCanvas);// 销毁画布 OH_Drawing_CanvasDestroy(screenCanvas);
  1. 利用XComponent完成显示。
// 画完后获取像素地址,地址指向的内存包含画布画的像素数据 void *bitmapAddr=OH_Drawing_BitmapGetPixels(cScreenBitmap_);uint32_t *value=static_cast<uint32_t *>(bitmapAddr);// 使用mmap获取到的地址来访问内存 uint32_t *pixel=static_cast<uint32_t *>(mappedAddr);if(pixel==nullptr){SAMPLE_LOGE("pixel is null");return;}if(value==nullptr){SAMPLE_LOGE("value is null");return;}// 将 cScreenBitmap_ 绘制的像素复制给 mappedAddrfor(uint32_t x=0;x<width_;x++){for(uint32_t y=0;y<height_;y++){*pixel++=*value++;}}// 设置刷新区域,如果Region中的Rect为nullptr,或者rectNumber为0,则认为OHNativeWindowBuffer全部有内容更改。 Region region{nullptr,0};// 通过OH_NativeWindow_NativeWindowFlushBuffer 提交给消费者使用,例如:显示在屏幕上。 OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow_, buffer_, fenceFd_, region);// 内存使用完记得去掉内存映射 int result=munmap(mappedAddr_, bufferHandle_->size);if(result==-1){SAMPLE_LOGE("munmap failed!");}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 0:34:11

清华源同步延迟评测:TensorRT镜像是否值得信赖?

清华源同步延迟评测&#xff1a;TensorRT镜像是否值得信赖&#xff1f; 在自动驾驶系统实时感知、工业质检毫秒级响应、智能摄像头多路并发推理的今天&#xff0c;一个看似不起眼的技术选择——使用哪个镜像源拉取TensorRT容器——可能直接决定项目是按时上线&#xff0c;还是卡…

作者头像 李华
网站建设 2026/6/10 9:49:51

LobeChat能否生成CSV文件?数据导出便捷方式

LobeChat能否生成CSV文件&#xff1f;数据导出便捷方式 在企业级AI应用日益普及的今天&#xff0c;一个看似简单却常被忽视的问题浮出水面&#xff1a;我们能轻松地把聊天记录变成可分析的结构化数据吗&#xff1f;比如&#xff0c;一键导出为CSV文件&#xff0c;用于后续的数据…

作者头像 李华
网站建设 2026/6/10 9:48:08

GLM-4.6V开源:重新定义多模态AI的行动范式

GLM-4.6V开源&#xff1a;重新定义多模态AI的行动范式 12月8日&#xff0c;智谱AI正式开源GLM-4.6V系列多模态大模型&#xff0c;作为GLM系列在多模态方向上的重要迭代&#xff0c;GLM-4.6V在技术架构和应用场景上都实现了突破性进展。 技术架构全面升级 GLM-4.6V系列包含两…

作者头像 李华
网站建设 2026/6/10 9:47:28

无人船ADCP在应急水文监测中的应用

一、应急水文监测的特殊性与挑战 应急水文监测通常发生在自然灾害&#xff08;如洪水、地震、滑坡、溃坝&#xff09;或人为事故&#xff08;如危险品泄漏、水污染&#xff09;后的复杂环境中&#xff0c;具有突发性、紧迫性、高风险性和环境复杂性等特点。传统监测手段如人工涉…

作者头像 李华
网站建设 2026/6/10 9:52:18

无人船ADCP助力河流流量精准高效监测

无人船ADCP&#xff08;声学多普勒流速剖面仪&#xff09;技术的应用&#xff0c;为河流流量监测领域带来了革命性的突破&#xff0c;显著提升了监测工作的精准度与效率。传统的河流流量监测方法&#xff0c;如桥测、涉水测量或缆道测量等&#xff0c;往往受到复杂地形、恶劣水…

作者头像 李华
网站建设 2026/6/10 9:50:20

FaceFusion人脸选择器模式与参考面管理解析

FaceFusion人脸选择器模式与参考面管理解析 在AI视觉创作日益普及的今天&#xff0c;换脸技术早已从“玩梗”走向专业化应用。无论是影视特效中的替身合成、直播行业的虚拟主播植入&#xff0c;还是短视频内容的创意加工&#xff0c;高精度的人脸替换工具已成为创作者手中的核心…

作者头像 李华