From 7f9e4aa0aee71fbc18e6ec34e1be1606afe61e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BE=89?= Date: Wed, 5 Mar 2025 14:55:02 +0800 Subject: [PATCH] native window add new interface clean cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 李辉 --- OAT.xml | 1 + .../Native/NdkNativeWindow/README_zh.md | 64 ++++++++++-------- .../NdkNativeWindow/build-profile.json5 | 4 +- .../entry/src/main/cpp/NativeRender.cpp | 12 ++++ .../entry/src/main/cpp/NativeRender.h | 2 + .../main/ets/interface/NativeWindowContext.ts | 1 + .../entry/src/main/ets/pages/Index.ets | 32 ++++++--- .../screenshots/device/CleanCache.jpg | Bin 0 -> 36700 bytes 8 files changed, 74 insertions(+), 42 deletions(-) create mode 100644 code/BasicFeature/Native/NdkNativeWindow/screenshots/device/CleanCache.jpg diff --git a/OAT.xml b/OAT.xml index 582e32b42f..65d905c7bf 100644 --- a/OAT.xml +++ b/OAT.xml @@ -514,6 +514,7 @@ Note:If the text contains special characters, please escape them according to th + diff --git a/code/BasicFeature/Native/NdkNativeWindow/README_zh.md b/code/BasicFeature/Native/NdkNativeWindow/README_zh.md index 294e72d284..fd41ec2521 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/README_zh.md +++ b/code/BasicFeature/Native/NdkNativeWindow/README_zh.md @@ -8,11 +8,13 @@ > 本示例XComponent接口使用方法已停止演进,推荐使用方法请参考[ArkTSXComponent示例](../ArkTSXComponent/README_zh.md)。 ### 效果预览 -| 主页 | 改变矩形框颜色 | 生产buffer | 获取可用帧回调次数 | -|----------------------------------------------|---------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------| -| ![main](screenshots/device/Main.jpg) | ![Draw Path](screenshots/device/ChangeColor.jpg) | ![change color](screenshots/device/ProduceBuffer.jpg) | ![change color](screenshots/device/GetAvailableCount.jpg) | -| attachbuffer | detachbuffer | fit模式(手机) | 拉伸模式(手机) | -| ![main](screenshots/device/AttachBuffer.jpg) | ![Draw Path](screenshots/device/DetachBuffer.jpg) | ![Draw Path](screenshots/device/scalefit.jpg) | ![Draw Path](screenshots/device/scaledown.jpg) | +| 主页 | 改变矩形框颜色 | 生产buffer | 获取可用帧回调次数 | +|---------------------------------------------------|---------------------------------------------------|---------------------------------------------------|-----------------------------------------------------------| +| ![main](screenshots/device/Main.jpg) | ![Draw Path](screenshots/device/ChangeColor.jpg) | ![change color](screenshots/device/ProduceBuffer.jpg) | ![change color](screenshots/device/GetAvailableCount.jpg) | +| attachbuffer | detachbuffer | fit模式(手机) | 拉伸模式(手机) | +| ![main](screenshots/device/AttachBuffer.jpg) | ![Draw Path](screenshots/device/DetachBuffer.jpg) | ![Draw Path](screenshots/device/scalefit.jpg) | ![Draw Path](screenshots/device/scaledown.jpg) | +| clean cache | +| ![clean cache](screenshots/device/CleanCache.jpg) | 使用说明 @@ -25,6 +27,7 @@ 6. 点击页面底部”attachbuffer“, 在cachebuffer大于0时将buffer添加到nativewindow中,attachedbuffer数值加1,cachebuffer数值减1;cachebuffer为0时不做处理。(需要点第五步按钮更新数值) 7. 点击页面底部”detachbuffer", 在attachedbuffer大于0时将buffer添加到缓存区cachebuffer中,attachedbuffer数值减1,cachebuffer数值加1; attachedbuffer为0时不做处理。(需要点第五步按钮更新数值) 8. 点击页面顶部"Change ScalingMode"按钮,在支持fit模式的设备可以切换色块居中显示或平铺显示,开发板不支持fit模式。 +9. 点击页面底部“clean cache”按钮,将清理矩形框填充区域的NativeWindow缓存; ### 工程目录 @@ -60,30 +63,31 @@ 涉及到的相关接口: -| 接口名 | 描述 | -| -------- | -------- | -| OH_NativeWindow_CreateNativeWindow (void *pSurface) | 创建OHNativeWindow实例,每次调用都会产生一个新的OHNativeWindow实例 | -| OH_NativeWindow_DestroyNativeWindow (OHNativeWindow *window) | 将OHNativeWindow对象的引用计数减1,当引用计数为0的时候,该OHNativeWindow对象会被析构掉 | -| OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer (OH_NativeBuffer *nativeBuffer) | 创建OHNativeWindowBuffer实例,每次调用都会产生一个新的OHNativeWindowBuffer实例 | -| OH_NativeWindow_DestroyNativeWindowBuffer (OHNativeWindowBuffer *buffer) | 将OHNativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该OHNativeWindowBuffer对象会被析构掉 | -| OH_NativeWindow_NativeWindowRequestBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd) | 通过OHNativeWindow对象申请一块OHNativeWindowBuffer,用以内容生产 | -| OH_NativeWindow_NativeWindowFlushBuffer (OHNativeWindow *window, OHNativeWindowBuffer *buffer, int fenceFd, Region region) | 通过OHNativeWindow将生产好内容的OHNativeWindowBuffer放回到Buffer队列中,用以内容消费 | -| OH_NativeWindow_GetLastFlushedBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer) | 从OHNativeWindow获取上次送回到buffer队列中的OHNativeWindowBuffer | -| OH_NativeWindow_NativeWindowHandleOpt (OHNativeWindow *window, int code,...) | 设置/获取OHNativeWindow的属性,包括设置/获取宽高、内容格式等 | -| OH_NativeWindow_GetBufferHandleFromNative (OHNativeWindowBuffer *buffer) | 通过OHNativeWindowBuffer获取该buffer的BufferHandle指针 | -| OH_NativeBuffer_SetColorSpace (OH_NativeBuffer *buffer, OH_NativeBuffer_ColorSpace colorSpace) | 为OH_NativeBuffer设置颜色空间属性 | -| OH_NativeImage_SetOnFrameAvailableListener (OH_NativeImage *image, OH_OnFrameAvailableListener listener) | 设置帧可用回调 | -| OH_NativeImage_UnsetOnFrameAvailableListener (OH_NativeImage *image) | 取消设置帧可用回调 | +| 接口名 | 描述 | +| -------- |--------------------------------------------------------------------------------------------------------| +| OH_NativeWindow_CreateNativeWindow (void *pSurface) | 创建OHNativeWindow实例,每次调用都会产生一个新的OHNativeWindow实例 | +| OH_NativeWindow_DestroyNativeWindow (OHNativeWindow *window) | 将OHNativeWindow对象的引用计数减1,当引用计数为0的时候,该OHNativeWindow对象会被析构掉 | +| OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer (OH_NativeBuffer *nativeBuffer) | 创建OHNativeWindowBuffer实例,每次调用都会产生一个新的OHNativeWindowBuffer实例 | +| OH_NativeWindow_DestroyNativeWindowBuffer (OHNativeWindowBuffer *buffer) | 将OHNativeWindowBuffer对象的引用计数减1,当引用计数为0的时候,该OHNativeWindowBuffer对象会被析构掉 | +| OH_NativeWindow_NativeWindowRequestBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer, int *fenceFd) | 通过OHNativeWindow对象申请一块OHNativeWindowBuffer,用以内容生产 | +| OH_NativeWindow_NativeWindowFlushBuffer (OHNativeWindow *window, OHNativeWindowBuffer *buffer, int fenceFd, Region region) | 通过OHNativeWindow将生产好内容的OHNativeWindowBuffer放回到Buffer队列中,用以内容消费 | +| OH_NativeWindow_GetLastFlushedBuffer (OHNativeWindow *window, OHNativeWindowBuffer **buffer) | 从OHNativeWindow获取上次送回到buffer队列中的OHNativeWindowBuffer | +| OH_NativeWindow_NativeWindowHandleOpt (OHNativeWindow *window, int code,...) | 设置/获取OHNativeWindow的属性,包括设置/获取宽高、内容格式等 | +| OH_NativeWindow_GetBufferHandleFromNative (OHNativeWindowBuffer *buffer) | 通过OHNativeWindowBuffer获取该buffer的BufferHandle指针 | +| OH_NativeBuffer_SetColorSpace (OH_NativeBuffer *buffer, OH_NativeBuffer_ColorSpace colorSpace) | 为OH_NativeBuffer设置颜色空间属性 | +| OH_NativeImage_SetOnFrameAvailableListener (OH_NativeImage *image, OH_OnFrameAvailableListener listener) | 设置帧可用回调 | +| OH_NativeImage_UnsetOnFrameAvailableListener (OH_NativeImage *image) | 取消设置帧可用回调 | | OH_NativeImage_AcquireNativeWindow (OH_NativeImage *image) | 获取与OH_NativeImage相关联的OHNativeWindow指针。 该OHNativeWindow后续不再需要时需要调用OH_NativeWindow_DestroyNativeWindow释放 | -| OH_NativeWindow_GetSurfaceId (OHNativeWindow *window, uint64_t *surfaceId) | 获取surfaceId | -| OH_NativeWindow_CreateNativeWindowFromSurfaceId (uint64_t surfaceId, OHNativeWindow **window) | 通过surfaceId获取对应的OHNativeWindow | -| OH_NativeBuffer_MapPlanes (OH_NativeBuffer *buffer, void **virAddr, OH_NativeBuffer_Planes *outPlanes) | 将OH_NativeBuffer对应的多通道ION内存映射到进程空间 | -| OH_NativeBuffer_FromNativeWindowBuffer (OHNativeWindowBuffer *nativeWindowBuffer, OH_NativeBuffer **buffer) | 将OHNativeWindowBuffer实例转换为OH_NativeBuffer实例 | -| OH_NativeWindow_NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将缓存区OHNativeWindowBuffer添加到OHNativeWindow中 | -| OH_NativeWindow_NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将OHNativeWindow中的buffer移除,放置到缓存区中 | -| OH_NativeWindow_WriteToParcel(OHNativeWindow* window, OHIPCParcel* parcel)| 向OHIPCParcel对象中写入一个OHNativeWindow对象| -| OH_NativeWindow_ReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)| 从OHIPCParcel对象中读取一个OHNativeWindow对象| -| OH_NativeWindow_NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)| 为OHNativeWindow设置显示模式| +| OH_NativeWindow_GetSurfaceId (OHNativeWindow *window, uint64_t *surfaceId) | 获取surfaceId | +| OH_NativeWindow_CreateNativeWindowFromSurfaceId (uint64_t surfaceId, OHNativeWindow **window) | 通过surfaceId获取对应的OHNativeWindow | +| OH_NativeBuffer_MapPlanes (OH_NativeBuffer *buffer, void **virAddr, OH_NativeBuffer_Planes *outPlanes) | 将OH_NativeBuffer对应的多通道ION内存映射到进程空间 | +| OH_NativeBuffer_FromNativeWindowBuffer (OHNativeWindowBuffer *nativeWindowBuffer, OH_NativeBuffer **buffer) | 将OHNativeWindowBuffer实例转换为OH_NativeBuffer实例 | +| OH_NativeWindow_NativeWindowAttachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将缓存区OHNativeWindowBuffer添加到OHNativeWindow中 | +| OH_NativeWindow_NativeWindowDetachBuffer(OHNativeWindow *window, OHNativeWindowBuffer *buffer) | 将OHNativeWindow中的buffer移除,放置到缓存区中 | +| OH_NativeWindow_WriteToParcel(OHNativeWindow* window, OHIPCParcel* parcel)| 向OHIPCParcel对象中写入一个OHNativeWindow对象 | +| OH_NativeWindow_ReadFromParcel(OHIPCParcel *parcel, OHNativeWindow **window)| 从OHIPCParcel对象中读取一个OHNativeWindow对象 | +| OH_NativeWindow_NativeWindowSetScalingModeV2(OHNativeWindow *window, OHScalingModeV2 scalingMode)| 为OHNativeWindow设置显示模式 | +| OH_NativeWindow_CleanCache(OHNativeWindow *window)| 为OHNativeWindow清理buffer缓存 | 详细的接口说明请参考[NativeWindow](https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkgraphics2d/_o_h___native_image.md),[NativeImage](https://docs.openharmony.cn/pages/v4.1/zh-cn/application-dev/reference/apis-arkgraphics2d/_o_h___native_image.md),[NativeBuffer](https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/native-apis/_o_h___native_buffer.md)。 @@ -98,8 +102,8 @@ XComponent NativeWindow NativeImage EGL。 ### 约束与限制 1. 本示例仅支持标准系统上运行; -2. 本示例为Stage模型,已适配API version 12版本SDK,SDK版本号5.0.0.19及以上版本,镜像版本号支持5.0.0.19及以上版本; -3. 本示例需要使用DevEco Studio 4.0 Beta2 版本号(4.1.3.400)及以上版本才可编译运行。 +2. 本示例为Stage模型,已适配API version 18版本SDK,SDK版本号5.1.0.54及以上版本,镜像版本号支持5.1.0.54及以上版本; +3. 本示例需要使用DevEco Studio 5.0.2 Release 版本号(5.0.7.210)及以上版本才可编译运行。 ### 下载 如需单独下载本工程,执行如下命令: diff --git a/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 b/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 index 4a6f21f792..b151a5bec5 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 +++ b/code/BasicFeature/Native/NdkNativeWindow/build-profile.json5 @@ -20,8 +20,8 @@ { "name": "default", "signingConfig": "default", - "compileSdkVersion": 14, - "compatibleSdkVersion": 14, + "compileSdkVersion": 18, + "compatibleSdkVersion": 18, "runtimeOS": "OpenHarmony", } ] diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp index f69d9178a5..1ae9920815 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.cpp @@ -91,6 +91,7 @@ bool NativeRender::Export(napi_env env, napi_value exports) napi_property_descriptor desc[] = { { "DrawColor", nullptr, NativeRender::NapiOnDraw, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "CleanCache", nullptr, NativeRender::NapiOnCleanCache, nullptr, nullptr, nullptr, napi_default, nullptr }, { "ChangeScalingMode", nullptr, NativeRender::NapiOnChangeScalingMode, nullptr, nullptr, nullptr, napi_default, nullptr }, }; @@ -140,6 +141,12 @@ napi_value NativeRender::NapiOnDraw(napi_env env, napi_callback_info info) return nullptr; } +napi_value NativeRender::NapiOnCleanCache(napi_env env, napi_callback_info info) +{ + NativeRender::GetInstance()->CleanCache(); + return nullptr; +} + napi_value NativeRender::NapiOnChangeScalingMode(napi_env env, napi_callback_info info) { NativeRender::GetInstance()->ChangeScalingMode(); @@ -260,6 +267,11 @@ void NativeRender::ChangeColor() DrawBaseColor(); } +void NativeRender::CleanCache() +{ + OH_NativeWindow_CleanCache(nativeWindow_); +} + void NativeRender::ChangeScalingMode() { flagFit_ = !flagFit_; diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h index 25ddd46640..7f6b454e12 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/cpp/NativeRender.h @@ -28,12 +28,14 @@ public: static napi_value GetNativeRender(napi_env env, napi_callback_info info); static napi_value NapiOnDraw(napi_env env, napi_callback_info info); static napi_value NapiOnChangeScalingMode(napi_env env, napi_callback_info info); + static napi_value NapiOnCleanCache(napi_env env, napi_callback_info info); static void Release(); bool Export(napi_env env, napi_value exports); void DrawBaseColor(); void ChangeColor(); void ChangeScalingMode(); void SetNativeWindow(OHNativeWindow* nativeWindow, uint64_t width, uint64_t height); + void CleanCache(); private: void NativeBufferApi(); diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts index 7a1dfe24b8..59b96cd5da 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/interface/NativeWindowContext.ts @@ -39,4 +39,5 @@ export default interface NativeWindowContext { GetBufferQueueSize(): number; GetAttachBufferCount(): number; GetCacheBufferCount(): number; + CleanCache(): number; }; diff --git a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets index ff69360f91..ebf3ad2e93 100644 --- a/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets +++ b/code/BasicFeature/Native/NdkNativeWindow/entry/src/main/ets/pages/Index.ets @@ -158,16 +158,28 @@ struct Index { } }) .height(60) - Button(`attach buffer`) - .fontSize('14fp') - .fontWeight(500) - .margin({ bottom: 24 }) - .onClick(() => { - if (this.nativeWindowContext) { - this.nativeWindowContext.AttachBuffer(); - } - }) - .height(40) + Row() { + Button(`attach buffer`) + .fontSize('14fp') + .fontWeight(500) + .margin({ bottom: 24 }) + .onClick(() => { + if (this.nativeWindowContext) { + this.nativeWindowContext.AttachBuffer(); + } + }) + .height(40) + Button(`clean cache`) + .fontSize('14fp') + .fontWeight(500) + .margin({ bottom: 24 }) + .onClick(() => { + if (this.nativeWindowContext) { + this.nativeWindowContext.CleanCache(); + } + }) + .height(40) + } Button(`dettach buffer`) .fontSize('14fp') .fontWeight(500) diff --git a/code/BasicFeature/Native/NdkNativeWindow/screenshots/device/CleanCache.jpg b/code/BasicFeature/Native/NdkNativeWindow/screenshots/device/CleanCache.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b7787713209b83de920ca2f469ab66567ee7209 GIT binary patch literal 36700 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