news 2026/4/3 2:13:39

鸿蒙高性能图形绘制

作者头像

张小明

前端开发工程师

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/3/21 11:28:45

0014.STM32CubeIDE的工作空间的配置信息导出和导入

由于STM32CubeIDE是对eclipse的二次开发&#xff0c;所以导入导出配置的方式跟eclipse是一样的。 将Workspace\.metadata\.plugins\org.eclipse.core.runtime中的.settings文件夹复制出来&#xff0c;这个.settings文件中保存的就是当前工作环境情况&#xff0c;有设置的字体大…

作者头像 李华
网站建设 2026/4/1 18:35:49

LobeChat是否支持Markdown渲染?技术文档写作体验评测

LobeChat是否支持Markdown渲染&#xff1f;技术文档写作体验评测 在今天&#xff0c;如果你正在用 AI 写一份技术文档、整理会议纪要&#xff0c;或是调试一段 Python 脚本&#xff0c;你大概率希望看到的不是一堆乱糟糟的原始文本&#xff0c;而是一份结构清晰、代码高亮、公式…

作者头像 李华
网站建设 2026/3/31 3:38:54

GNU make在鸿蒙PC上的使用方法

ohos-make 是为 OpenHarmony 平台编译的 GNU make 构建工具。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 make 工具&#xff0c;包括 HNP 包的打包、安装和使用方法。 &#x1f4cb; 目录 一、项目概述二、为什么需要 HNP 包三、HNP 包打包方法四、安装与使用五、…

作者头像 李华
网站建设 2026/3/27 21:32:35

m4宏处理器在鸿蒙PC上的应用指南

ohos-m4 是为 OpenHarmony 平台编译的 m4 宏处理器。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 m4 工具&#xff0c;包括 HNP 包的打包、安装和使用方法。 &#x1f4cb; 目录 一、项目概述二、为什么需要 HNP 包三、HNP 包打包方法四、安装与使用五、使用示例六…

作者头像 李华
网站建设 2026/3/31 1:07:09

TensorRT-LLM模型导出全解析(v0.20.0rc3)

TensorRT-LLM模型导出全解析&#xff08;v0.20.0rc3&#xff09; 在大模型推理落地的实战中&#xff0c;性能与成本的博弈从未停止。一个70B级别的模型如果直接用PyTorch原生部署&#xff0c;每秒可能只能处理几个请求&#xff0c;而通过TensorRT-LLM优化后&#xff0c;吞吐量…

作者头像 李华
网站建设 2026/3/27 0:49:11

LobeChat国际化支持现状:中文用户体验优秀

LobeChat 的中文体验为何如此出色&#xff1f; 在如今遍地开花的 AI 聊天应用中&#xff0c;大多数项目虽然底层模型支持多语言&#xff0c;但前端界面却往往“重英文、轻本地化”。尤其对于中文用户来说&#xff0c;常见的痛点比比皆是&#xff1a;输入法卡顿、光标错位、字体…

作者头像 李华