如何主动关闭CPU访问窗口缓冲区数据降低功耗
======================

当前操作系统的窗口缓冲区默认使用CPU访问，这具有良好的兼容性，但GPU访问窗口缓冲区的能效更高，而使用CPU访问的能效开销较大。如果开发者确定应用不需要CPU访问，可以手动关闭该功能，以提高应用的能效。

#### 问题现象

自绘制应用在生产缓冲区内容时，默认使用CPU访问能力。由于CPU访问缓冲区效率较低，性能开销较大。

#### 解决措施

如果确认应用不需要使用CPU访问窗口缓冲区数据，可以在首次获取窗口句柄（OnSurfaceCreatedCB）时关闭CPU访问能力，由硬件平台选择最佳的图像格式，以提高能效并降低功耗。

在首次获取窗口句柄（OnSurfaceCreatedCB）时，调用OH\_NativeWindow\_NativeWindowHandleOpt(…, SET\_USAGE, …)方法设置缓冲区USAGE的值，关闭CPU访问能力。系统将选择更高效的方法（如GPU）访问缓冲区。参考代码如下：

void OnSurfaceCreatedCB(OH\_NativeXComponent \*component, void \*window) {    
    uint64\_t usage = 0;
    int32\_t ret = OH\_NativeWindow\_NativeWindowHandleOpt((OHNativeWindow\*)window, GET\_USAGE, &usage);
    usage &= ~NATIVEBUFFER\_USAGE\_CPU\_READ;
    int32\_t ret2 = OH\_NativeWindow\_NativeWindowHandleOpt((OHNativeWindow\*)window, SET\_USAGE, usage);
}

对于大型游戏等高负载场景，关闭CPU访问可提高能效约30%。