news 2026/5/9 23:00:14

鸿蒙高性能图形绘制

作者头像

张小明

前端开发工程师

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/5/9 23:00:12

深度剖析:如何通过数据即服务释放大数据商业价值?

深度剖析:如何通过数据即服务释放大数据商业价值? 关键词:数据即服务(DaaS)、大数据、商业价值、数据资产、API、数据治理、价值转化 摘要:在“数据成为新石油”的数字经济时代,企业如何将海量数据从“成本中心”转化为“价值引擎”?本文以“数据即服务(DaaS)”为核心…

作者头像 李华
网站建设 2026/4/16 12:44:25

LobeChat动画与交互动效赏析:细节决定用户体验

LobeChat动画与交互动效赏析&#xff1a;细节决定用户体验 在当今AI应用层出不穷的背景下&#xff0c;用户早已不再满足于“能用”——他们期待的是流畅、自然、有温度的交互体验。大语言模型的能力固然重要&#xff0c;但真正让用户愿意留下来、反复使用的&#xff0c;往往是那…

作者头像 李华
网站建设 2026/5/6 1:01:34

阿里云服务器虚拟化技术的特点,为什么要使用虚拟化技术?

阿里云服务器虚拟化技术是其云计算服务的核心基础&#xff0c;其设计旨在最大化硬件资源的利用率、提升灵活性并保障安全。以下是其主要特点及采用虚拟化技术的原因分析&#xff1a; 阿里云服务器虚拟化技术的主要特点 高性能与低损耗 采用自主研发的「神龙架构」&#xff08;X…

作者头像 李华
网站建设 2026/5/8 6:12:09

HDFS 在大数据领域的数据共享方案

HDFS 在大数据领域的数据共享方案关键词&#xff1a;HDFS、大数据、数据共享、分布式存储、数据一致性、访问控制、性能优化摘要&#xff1a;本文深入探讨了HDFS&#xff08;Hadoop Distributed File System&#xff09;在大数据领域中的数据共享方案。我们将从HDFS的基本架构出…

作者头像 李华
网站建设 2026/4/23 12:31:54

Qwen3-VL-30B 支持 CUDA 12.x 部署吗?

Qwen3-VL-30B 支持 CUDA 12.x 部署吗&#xff1f;一文说透&#xff01; 你是不是也经历过这种抓狂时刻&#xff1a;刚拿到一个号称“视觉语言天花板”的模型——Qwen3-VL-30B&#xff0c;参数高达300亿&#xff0c;跨模态理解能力炸裂&#xff0c;结果连 pip install 都还没跑…

作者头像 李华
网站建设 2026/5/5 22:42:59

HMI动画使用戒律:何时动?如何动?

动画在HMI中是一把双刃剑。用得好&#xff0c;能清晰传达状态&#xff1b;用不好&#xff0c;会分散注意力&#xff0c;令人眩晕。本文提供一套严格的动画使用戒律。戒律一&#xff1a;只为反映真实物理状态而动允许&#xff1a; 传送带动画方向与物料流动方向一致&#xff1b;…

作者头像 李华