回复
聊一聊关于鸿蒙的Graphic子系统
微生香岚
发布于 2021-8-27 18:31
浏览
0收藏
graphic_standard
- 简介
- 目录
- 约束
- 编译构建
- 接口说明
- 使用说明
- 相关仓
简介
Graphic子系统 提供了图形接口能力和窗口管理接口能力,
其主要的结构如下图所示:
-
Surface
图形缓冲区管理接口,负责管理图形缓冲区和高效便捷的轮转缓冲区。
-
Vsync
垂直同步信号管理接口,负责管理所有垂直同步信号注册和响应。
-
WindowManager
窗口管理器接口,负责创建和管理窗口。
-
WaylandProtocols
窗口管理器和合成器的通信协议。
-
Compositor
合成器,负责合成各个图层。
-
Renderer
合成器的后端渲染模块。
-
Wayland protocols
Wayland 进程间通信协议
-
Shell
提供多窗口能力
-
Input Manger
多模输入模块,负责接收事件输入
目录
foundation/graphic/standard/
├── frameworks # 框架代码目录
│ ├── bootanimation # 开机动画目录
│ ├── surface # Surface代码
│ ├── vsync # Vsync代码
│ └── wm # WindowManager代码
├── interfaces # 对外接口存放目录
│ ├── innerkits # native接口存放目录
│ └── kits # js/napi接口存放目录
└── utils # 小部件存放目录
约束
- 语言版本
- C++11或以上
编译构建
可以依赖的接口有:
- graphic_standard:libwms_client
- graphic_standard:libsurface
- graphic_standard:libvsync_client
接口说明
WindowManager
接口名 | 职责 |
---|---|
GetInstance | 获取WindowManager的单例指针 |
GetMaxWidth | 获取当前屏幕宽度 |
GetMaxHeight | 获取当前屏幕高度 |
CreateWindow | 创建一个标准窗口 |
CreateSubWindow | 创建一个子窗口 |
StartShotScreen | 截屏操作 |
StartShotWindow | 截取窗口操作 |
SwitchTop | 将指定窗口调整至最上层显示 |
Window
接口名 | 职责 |
---|---|
Show | 显示当前窗口 |
Hide | 隐藏当前窗口 |
Move | 移动当前窗口至指定位置 |
SwitchTop | 将当前窗口调整到最上层显示 |
ChangeWindowType | 更改当前窗口类型 |
ReSize | 调整当前窗口至指定大小 |
Rotate | 旋转当前窗口 |
RegistPointerButtonCb | 注册鼠标Button事件回调 |
RegistPointerEnterCb | 注册鼠标Enter事件回调 |
RegistPointerLeaveCb | 注册鼠标Leave事件回调 |
RegistPointerMotionCb | 注册鼠标Motion事件回调 |
RegistPointerAxisDiscreteCb | 注册鼠标AxisDiscrete事件回调 |
RegistPointerAxisSourceCb | 注册鼠标AxisSource事件回调 |
RegistPointerAxisStopCb | 注册鼠标AxisStop事件回调 |
RegistPointerAxisCb | 注册鼠标Axis事件回调 |
RegistTouchUpCb | 注册TouchUp事件回调 |
RegistTouchDownCb | 注册TouchDown事件回调 |
RegistTouchEmotionCb | 注册TouchEmotion事件回调 |
RegistTouchFrameCb | 注册TouchFrame事件回调 |
RegistTouchCancelCb | 注册TouchCancel事件回调 |
RegistTouchShapeCb | 注册TouchShape事件回调 |
RegistTouchOrientationCb | 注册TouchOrientation事件回调 |
RegistKeyboardKeyCb | 注册键盘Key事件回调 |
RegistKeyboardKeyMapCb | 注册键盘KeyMap事件回调 |
RegistKeyboardLeaveCb | 注册键盘Leave事件回调 |
RegistKeyboardEnterCb | 注册键盘Enter事件回调 |
RegistKeyboardRepeatInfoCb | 注册键盘RepeatInfo事件回调 |
SubWindow
接口名 | 职责 |
---|---|
Move | 移动当前子窗口 |
SetSubWindowSize | 调整当前子窗口位置 |
Surface
接口名 | 职责 |
---|---|
CreateSurfaceAsConsumer | Buffer的消费者来使用该函数创建一个Surface |
CreateSurfaceAsProducer | Buffer的生产者使用该函数创建一个Surface,只能使用与生产相关的接口 |
GetProducer | 获得一个Surface内部的IBufferProducer对象 |
RequestBuffer | 请求一个待生产的SurfaceBuffer对象 |
CancelBuffer | 取消、归还一个待生产的SurfaceBuffer对象 |
FlushBuffer | 归还一个生产好的SurfaceBuffer对象并携带一些信息 |
AcquireBuffer | 请求一个待消费的SurfaceBuffer对象 |
ReleaseBuffer | 归还一个已消费的SurfaceBuffer对象 |
GetQueueSize | 获得当前同时能并存buffer的数量 |
SetQueueSize | 设置当前同时能并存buffer的数量 |
SetDefaultWidthAndHeight | 设置默认宽和高 |
GetDefaultWidth | 获得默认宽度 |
GetDefaultHeight | 获得默认高度 |
SetUserData | 存贮字符串数据,不随着IPC传递 |
GetUserData | 取出字符串数据 |
RegisterConsumerListener | 注册一个消费监听器,监听Buffer的Flush事件 |
UnregisterConsumerListener | 取消监听 |
SurfaceBuffer
接口名 | 职责 |
---|---|
GetBufferHandle | 获得SurfaceBuffer的BufferHandle指针 |
GetWidth | 获得SurfaceBuffer的宽度 |
GetHeight | 获得SurfaceBuffer的高度 |
GetFormat | 获得SurfaceBuffer的颜色格式 |
GetUsage | 获得SurfaceBuffer的用途 |
GetPhyAddr | 获得SurfaceBuffer的物理地址 |
GetKey | 获得SurfaceBuffer的key |
GetVirAddr | 获得SurfaceBuffer的虚拟地址 |
GetSize | 获得SurfaceBuffer的文件句柄 |
SetInt32 | 获得SurfaceBuffer的缓冲区大小 |
GetInt32 | 设置SurfaceBuffer的32位整数 |
SetInt64 | 获得SurfaceBuffer的32位整数 |
GetInt64 | 设置SurfaceBuffer的64位整数 |
VsyncHelper
接口名 | 职责 |
---|---|
Current | 获取当前runner对应的VsyncHelper |
VsyncHelper | 用EventHandler对象构造VsyncHelper |
RequestFrameCallback | 注册一个帧回调 |
使用说明
具名服务-传递一个生产型Surface
注册
// 拿到一个消费型Surface
sptr<Surface> surface = Surface::CreateSurfaceAsConsumer();
// 拿出里面的生产者对象
sptr<IBufferProducer> producer = surface->GetProducer();
// 注册服务
auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sm->AddSystemAbility(IPC_SA_ID, producer->AsObject());
客户端获得生产型Surface
// 获得远程对象
auto sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
sptr<IRemoteObject> robj = sm->GetSystemAbility(IPC_SA_ID);
// 构造Surface
sptr<IBufferProducer> bp = iface_cast<IBufferProducer>(robj);
sptr<Surface> surface = Surface::CreateSurfaceAsProducer(bp);
匿名服务-传递一个生产型Surface
场景: 在一次IPC过程中
发送
// 拿到一个消费型Surface
sptr<Surface> surface = CreateSurfaceAsConsumer();
// 拿出里面的生产者对象
sptr<IRemoteObject> producer = surface->GetProducer();
// 返回给客户端
parcel.WriteRemoteObject(producer);
接受并获得生产型Surface
// 获得远程对象
sptr<IRemoteObject> remoteObject = parcel.ReadRemoteObject();
// 构造Surface
sptr<IBufferProducer> bp = iface_cast<IBufferProducer>(robj);
sptr<Surface> surface = Surface::CreateSurfaceAsProducer(bp);
生产一个SurfaceBuffer
条件: 一个生产型Surface
BufferRequestConfig requestConfig = {
.width = 1920, // 屏幕宽度
.height = 1080, // 屏幕高度
.strideAlignment = 8, // stride对齐字节
.format = PIXEL_FMT_RGBA_8888, // 颜色格式
.usage = HBM_USE_CPU_READ | HBM_USE_CPU_WRITE | HBM_USE_MEM_DMA, // 用法
.timeout = 0, // 时延
};
sptr<SurfaceBuffer> buffer;
int32_t releaseFence;
SurfaceError ret = surface->RequestBuffer(buffer, releaseFence, requestConfig);
if (ret != SURFACE_ERROR_OK) {
// failed
}
BufferFlushConfig flushConfig = {
.damage = { // 重绘区域
.x = 0, // 起点横坐标
.y = 0, // 起点纵坐标
.w = buffer->GetWidth(), // 区域宽度
.h = buffer->GetHeight(), // 区域高度
},
.timestamp = 0 // 给消费者看的时间,0为使用当前时间
};
ret = surface->FlushBuffer(buffer, -1, flushConfig);
if (ret != SURFACE_ERROR_OK) {
// failed
}
消费一个SurfaceBuffer
条件: 一个消费型Surface
class TestConsumerListener : public IBufferConsumerListener {
public:
void OnBufferAvailable() override {
sptr<SurfaceBuffer> buffer;
int32_t flushFence;
SurfaceError ret = surface->AcquireBuffer(buffer, flushFence, timestamp, damage);
if (ret != SURFACE_ERROR_OK) {
// failed
}
// ...
ret = surface->ReleaseBuffer(buffer, -1);
if (ret != SURFACE_ERROR_OK) {
// failed
}
}
};
sptr<IBufferConsumerListener> listener = new TestConsumerListener();
SurfaceError ret = surface->RegisterConsumerListener(listener);
if (ret != SURFACE_ERROR_OK) {
// failed
}
给SurfaceBuffer带上自定义数据
sptr<SurfaceBuffer> buffer;
SurfaceError ret = buffer->SetInt32(1, 3);
if (ret != SURFACE_ERROR_OK) {
// failed
}
int32_t val;
ret = buffer->GetInt32(1, val);
if (ret != SURFACE_ERROR_OK) {
// failed
}
注册一个Vsync回调事件
用handler构造VsyncHelper
auto runner = AppExecFwk::EventRunner::Create(true);
auto handler = std::make_shared<AppExecFwk::EventHandler>(runner);
auto helper = new VsyncHelper(handler);
runner->Run();
struct FrameCallback cb = {
.timestamp_ = 0,
.userdata_ = nullptr,
.callback_ = [](int64_t timestamp, void* userdata) {
},
};
VsyncError ret = helper->RequestFrameCallback(cb);
if (ret != VSYNC_ERROR_OK) {
// failed
}
在handler里用Current
auto runner = AppExecFwk::EventRunner::Create(true);
auto handler = std::make_shared<AppExecFwk::EventHandler>(runner);
handler->PostTask([]() {
auto helper = VsyncHelper::Current();
struct FrameCallback cb = {
.timestamp_ = 0,
.userdata_ = nullptr,
.callback_ = [](int64_t timestamp, void* userdata) {
},
};
VsyncError ret = helper->RequestFrameCallback(cb);
if (ret != VSYNC_ERROR_OK) {
// failed
}
});
runner->Run();
相关仓
- graphic_standard
- ace_ace_engine
- aafwk_standard
- multimedia_media_standard
- multimedia_camera_standard
分类
graphic_standard-master.zip 2.5M 28次下载
已于2021-8-27 18:31:21修改
赞
收藏
回复
相关推荐