news 2026/9/22 8:02:16

鸿蒙高性能图形绘制

作者头像

张小明

前端开发工程师

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/9/22 1:17:48

shared_ptr 快照用于安全地并发读取,无需拷贝

需求&#xff1a;A线程会修改T类型的变量x&#xff0c;B线程要读取x&#xff0c;由于x很大&#xff0c;B读取和操作的时候需要加锁&#xff0c;这样会占用很长的x的时间。解决办法&#xff1a;方法1&#xff1a;B线程先加锁拷贝x到x_copy&#xff0c;然后锁可以释放&#xff0c…

作者头像 李华
网站建设 2026/9/22 5:09:20

官方适配完的命令行ruby在鸿蒙PC上的使用方法

ohos-ruby 是为 OpenHarmony 平台编译的 Ruby 编程语言解释器。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 Ruby 工具&#xff0c;包括 HNP 包的打包、安装、gem 包管理以及 Ruby 脚本的运行方法。 &#x1f4cb; 目录 一、项目概述二、为什么需要 HNP 包三、HNP …

作者头像 李华
网站建设 2026/9/22 5:12:58

LobeChat能否接收语音指令?全双工对话体验

LobeChat能否接收语音指令&#xff1f;全双工对话体验 在车载语音助手说出半句话就被打断、智能家居听不清命令反复确认的今天&#xff0c;我们对“真正自然”的人机对话期待已久。理想中的AI助手应该像真人一样——你能随时插话&#xff0c;它也能边说边听&#xff0c;而不是等…

作者头像 李华
网站建设 2026/9/21 17:53:26

LangFlow快速入门:可视化构建AI应用

LangFlow快速入门&#xff1a;可视化构建AI应用 在生成式AI浪潮中&#xff0c;开发者常常面临一个现实困境&#xff1a;想法很清晰&#xff0c;落地却耗时漫长。即便使用了LangChain这样的强大框架&#xff0c;编写和调试多模块协同的LLM流程依然需要大量编码工作。有没有一种…

作者头像 李华
网站建设 2026/9/22 2:32:52

Langflow本地部署:隔离环境安装指南

Langflow本地部署&#xff1a;隔离环境安装指南 在快速迭代的 AI 应用开发中&#xff0c;如何高效验证一个 LLM 工作流的想法&#xff1f;写一堆胶水代码&#xff1f;反复调试导入错误&#xff1f;还是手动管理几十个依赖版本&#xff1f; 其实&#xff0c;你完全可以用拖拽的…

作者头像 李华
网站建设 2026/9/20 13:36:44

云端算力的进化:云服务器架构演进的三重范式变革

在数字化转型的浪潮中&#xff0c;云服务器作为云计算的核心基础设施&#xff0c;正经历着从被动响应到智能协同的跨越式进化。从传统虚拟化到云原生架构&#xff0c;这场静默的技术革命重构了算力释放方式&#xff0c;推动行业向更高效、更智能的方向迈进。云服务器的架构演进…

作者头像 李华