# NativeVsync ## 概述 æä¾›èŽ·å–系统vsync回调的功能,å¯ç”¨äºŽå®žçŽ°åº”ç”¨çš„ç»˜åˆ¶å¸§çŽ‡ä¸Žç³»ç»Ÿå¸§çŽ‡åŒæ¥ã€‚ \@syscap SystemCapability.Graphic.Graphic2D.NativeVsync **起始版本:** 9 ## 汇总 ### 文件 | åç§° | æè¿° | | -------- | -------- | | [native_vsync.h](native__vsync_8h.md) | 定义获å–和使用NativeVsync的相关函数。<br/>**引用文件:** <native_vsync/native_vsync.h> <br/>**库:** libnative_vsync.so | ### 类型定义 | åç§° | æè¿° | | -------- | -------- | | typedef enum [OHNativeErrorCode](#ohnativeerrorcode) [OHNativeErrorCode](#ohnativeerrorcode) | 接å£é”™è¯¯ç 说明(仅用于查询)。 | | typedef struct [OH_NativeVSync](#oh_nativevsync) [OH_NativeVSync](#oh_nativevsync) | æä¾›OH_NativeVSync结构体声明。 | | typedef void(\* [OH_NativeVSync_FrameCallback](#oh_nativevsync_framecallback)) (long long timestamp, void \*data) | VSync回调函数类型。 | ### 枚举 | åç§° | æè¿° | | -------- | -------- | | [OHNativeErrorCode](#ohnativeerrorcode-1) {<br/>NATIVE_ERROR_OK = 0, NATIVE_ERROR_INVALID_ARGUMENTS = 40001000, NATIVE_ERROR_NO_PERMISSION = 40301000, NATIVE_ERROR_NO_BUFFER = 40601000,<br/>NATIVE_ERROR_NO_CONSUMER = 41202000, NATIVE_ERROR_NOT_INIT = 41203000, NATIVE_ERROR_CONSUMER_CONNECTED = 41206000, NATIVE_ERROR_BUFFER_STATE_INVALID = 41207000,<br/>NATIVE_ERROR_BUFFER_IN_CACHE = 41208000, NATIVE_ERROR_BUFFER_QUEUE_FULL = 41209000, NATIVE_ERROR_BUFFER_NOT_IN_CACHE = 41210000,NATIVE_ERROR_CONSUMER_DISCONNECTED = 41211000,NATIVE_ERROR_CONSUMER_NO_LISTENER_REGISTERED = 41212000, NATIVE_ERROR_UNSUPPORTED = 50102000,<br/>NATIVE_ERROR_UNKNOWN = 50002000,NATIVE_ERROR_HDI_ERROR = 50007000,NATIVE_ERROR_BINDER_ERROR = 50401000,<br/>NATIVE_ERROR_EGL_STATE_UNKNOWN = 60001000, NATIVE_ERROR_EGL_API_FAILED = 60002000<br/>} | 接å£é”™è¯¯ç 说明(仅用于查询)。 | ### 函数 | åç§° | æè¿° | | -------- | -------- | | [OH_NativeVSync_Create](#oh_nativevsync_create) (const char \*name, unsigned int length) | 创建一个OH_NativeVSyncå®žä¾‹ï¼Œæ¯æ¬¡è°ƒç”¨éƒ½ä¼šäº§ç”Ÿä¸€ä¸ªæ–°çš„实例。 | | [OH_NativeVSync](#oh_nativevsync) \* [OH_NativeVSync_Create_ForAssociatedWindow](#oh_nativevsync_create_forassociatedwindow) (uint64_t windowID, const char \*name, unsigned int length) | 创建一个和窗å£ç»‘定的OH_NativeVSyncå®žä¾‹ï¼Œæ¯æ¬¡è°ƒç”¨éƒ½ä¼šäº§ç”Ÿä¸€ä¸ªæ–°çš„实例。 | | [OH_NativeVSync_Destroy](#oh_nativevsync_destroy) ([OH_NativeVSync](#oh_nativevsync) \*nativeVsync) | 销æ¯OH_NativeVSync实例。 | | int [OH_NativeVSync_RequestFrame](#oh_nativevsync_requestframe) ([OH_NativeVSync](#oh_nativevsync) \*nativeVsync, [OH_NativeVSync_FrameCallback](#oh_nativevsync_framecallback) callback, void \*data) | 请求下一次vsyncä¿¡å·ï¼Œå½“ä¿¡å·åˆ°æ¥æ—¶ï¼Œè°ƒç”¨å›žè°ƒå‡½æ•°callback。 如果在åŒä¸€å¸§å†…ä¸å¤šæ¬¡è°ƒç”¨æ¤æŽ¥å£ï¼Œåˆ™åªä¼šè§¦å‘最åŽä¸€ä¸ªå›žè°ƒã€‚ | | int [OH_NativeVSync_RequestFrameWithMultiCallback](#oh_nativevsync_requestframewithmulticallback) ([OH_NativeVSync](#oh_nativevsync) \*nativeVsync, [OH_NativeVSync_FrameCallback](#oh_nativevsync_framecallback) callback, void \*data) | 请求下一次vsyncä¿¡å·ï¼Œå½“ä¿¡å·åˆ°æ¥æ—¶ï¼Œè°ƒç”¨å›žè°ƒå‡½æ•°callback。 如果在åŒä¸€å¸§å†…ä¸å¤šæ¬¡è°ƒç”¨æ¤æŽ¥å£ï¼Œæ¯ä¸€æ¬¡ä¼ 入的callback都会被执行。 | | [OH_NativeVSync_GetPeriod](#oh_nativevsync_getperiod) ([OH_NativeVSync](#oh_nativevsync) \*nativeVsync, long long \*period) |获å–vsync周期。| | int [OH_NativeVSync_DVSyncSwitch](#oh_nativevsync_dvsyncswitch) ([OH_NativeVSync](#oh_nativevsync) \*nativeVsync, bool enable) | å¯ç”¨DVSync以æé«˜è‡ªç»˜åˆ¶åŠ¨ç”»åœºæ™¯çš„æµç•…性。 DVSync是Decoupled VSync的缩写,它是一ç§ä¸Žç¡¬ä»¶VSync解耦的帧时åºç®¡ç†ç–略。<br/>DVSync通过æå‰å‘é€å¸¦æœ‰æœªæ¥æ—¶é—´æˆ³çš„VSyncä¿¡å·é©±åЍåŽç»åŠ¨ç”»å¸§çš„æå‰ç»˜åˆ¶ï¼Œè¿™äº›å¸§ä¼šè¢«å¸§ç¼“冲队列缓å˜ï¼›DVSync通过缓å˜çš„帧å‡å°‘未æ¥å¯èƒ½å‘生的丢帧,进而æé«˜åŠ¨ç”»åœºæ™¯çš„æµç•…性。<br/>å› ä¸ºDVSync需è¦å ç”¨ç©ºé—²çš„è‡ªç»˜åˆ¶å¸§ç¼“å†²ç”¨äºŽç¼“å˜æå‰ç»˜åˆ¶çš„动画帧,用户需è¦ç¡®ä¿è‡³å°‘有一个空闲的帧缓冲区,å¦åˆ™ä¸å»ºè®®å¯ç”¨æ¤åŠŸèƒ½ã€‚<br/>å¯ç”¨DVSyncåŽï¼Œç”¨æˆ·éœ€è¦æ£ç¡®å“应æå‰å‘é€çš„VSyncä¿¡å·ï¼Œå¹¶åœ¨å‰ä¸€ä¸ªVSync对应的动画帧完æˆåŽå†è¯·æ±‚下一个VSyncï¼Œä¸”è‡ªç»˜åˆ¶å¸§éœ€è¦æºå¸¦ä¸ŽVSync一致的时间戳。<br/>在动画结æŸä¹‹åŽï¼Œç”¨æˆ·éœ€è¦å…³é—DVSync。<br/>åœ¨ä¸æ”¯æŒDVSyncçš„å¹³å°æˆ–者如果有å¦ä¸€ä¸ªåº”用程åºå·²ç»å¯ç”¨äº†DVSync,则当å‰çš„å¯ç”¨æ“作将ä¸ä¼šç”Ÿæ•ˆï¼Œåº”用程åºä»å°†æ”¶åˆ°æ£å¸¸çš„VSyncä¿¡å·ã€‚ | ## 类型定义说明 ### OH_NativeVSync ``` typedef struct OH_NativeVSync OH_NativeVSync ``` **æè¿°:** æä¾›OH_NativeVSync结构体声明。 ### OH_NativeVSync_FrameCallback ``` typedef void(* OH_NativeVSync_FrameCallback) (long long timestamp, void *data) ``` **æè¿°:** VSync回调函数类型。 \@syscap SystemCapability.Graphic.Graphic2D.NativeVsync **傿•°:** | åç§° | æè¿° | | -------- | -------- | | timestamp | VSync使用CLOCK_MONOTONIC获å–的系统时间戳, å•ä½ä¸ºçº³ç§’。 | | data | 用户自定义数æ®ã€‚ | ### OHNativeErrorCode ``` typedef enum OHNativeErrorCode OHNativeErrorCode ``` **æè¿°** 接å£é”™è¯¯ç 说明(仅用于查询)。 **起始版本:** 12 ## 枚举类型说明 ### OHNativeErrorCode ``` enum OHNativeErrorCode ``` **æè¿°** 接å£é”™è¯¯ç 说明(仅用于查询)。 **起始版本:** 12 | 枚举值 | æè¿° | | -------- | -------- | | NATIVE_ERROR_OK | æˆåŠŸ | | NATIVE_ERROR_INVALID_ARGUMENTS | 入傿— 效 | | NATIVE_ERROR_NO_PERMISSION | æ— æƒé™æ“作 | | NATIVE_ERROR_NO_BUFFER | æ— ç©ºé—²å¯ç”¨çš„buffer | | NATIVE_ERROR_NO_CONSUMER | 消费端ä¸å˜åœ¨ | | NATIVE_ERROR_NOT_INIT | 未åˆå§‹åŒ– | | NATIVE_ERROR_CONSUMER_CONNECTED | 消费端已ç»è¢«è¿žæŽ¥ | | NATIVE_ERROR_BUFFER_STATE_INVALID | buffer状æ€ä¸ç¬¦åˆé¢„期 | | NATIVE_ERROR_BUFFER_IN_CACHE | buffer已在缓å˜é˜Ÿåˆ—ä¸ | | NATIVE_ERROR_BUFFER_QUEUE_FULL | 队列已满 | | NATIVE_ERROR_BUFFER_NOT_IN_CACHE | bufferä¸åœ¨ç¼“å˜é˜Ÿåˆ—ä¸ | | NATIVE_ERROR_CONSUMER_DISCONNECTED | 消费端已ç»è¢«æ–开连接 | | NATIVE_ERROR_CONSUMER_NO_LISTENER_REGISTERED | 消费端未注册listener回调函数 | | NATIVE_ERROR_UNSUPPORTED | 当å‰è®¾å¤‡æˆ–å¹³å°ä¸æ”¯æŒ | | NATIVE_ERROR_UNKNOWN | 未知错误,请查看日志 | | NATIVE_ERROR_HDI_ERROR | HDI接å£è°ƒç”¨å¤±è´¥ | | NATIVE_ERROR_BINDER_ERROR | 跨进程通信失败 | | NATIVE_ERROR_EGL_STATE_UNKNOWN | egl环境状æ€å¼‚常 | | NATIVE_ERROR_EGL_API_FAILED | egl接å£è°ƒç”¨å¤±è´¥ | ## 函数说明 ### OH_NativeVSync_DVSyncSwitch() ``` int OH_NativeVSync_DVSyncSwitch (OH_NativeVSync* nativeVsync, bool enable ) ``` **æè¿°** å¯ç”¨DVSync以æé«˜è‡ªç»˜åˆ¶åŠ¨ç”»åœºæ™¯çš„æµç•…性。 DVSync是Decoupled VSync的缩写,它是一ç§ä¸Žç¡¬ä»¶VSync解耦的帧时åºç®¡ç†ç–略。 DVSync通过æå‰å‘é€å¸¦æœ‰æœªæ¥æ—¶é—´æˆ³çš„VSyncä¿¡å·é©±åЍåŽç»åŠ¨ç”»å¸§çš„æå‰ç»˜åˆ¶ï¼Œè¿™äº›å¸§ä¼šè¢«å¸§ç¼“冲队列缓å˜ï¼›DVSync通过缓å˜çš„帧å‡å°‘未æ¥å¯èƒ½å‘生的丢帧,进而æé«˜åŠ¨ç”»åœºæ™¯çš„æµç•…性。 å› ä¸ºDVSync需è¦å ç”¨ç©ºé—²çš„è‡ªç»˜åˆ¶å¸§ç¼“å†²ç”¨äºŽç¼“å˜æå‰ç»˜åˆ¶çš„动画帧,用户需è¦ç¡®ä¿è‡³å°‘有一个空闲的帧缓冲区,å¦åˆ™ä¸å»ºè®®å¯ç”¨æ¤åŠŸèƒ½ã€‚ å¯ç”¨DVSyncåŽï¼Œç”¨æˆ·éœ€è¦æ£ç¡®å“应æå‰å‘é€çš„VSyncä¿¡å·ï¼Œå¹¶åœ¨å‰ä¸€ä¸ªVSync对应的动画帧完æˆåŽå†è¯·æ±‚下一个VSyncï¼Œä¸”è‡ªç»˜åˆ¶å¸§éœ€è¦æºå¸¦ä¸ŽVSync一致的时间戳。 在动画结æŸä¹‹åŽï¼Œç”¨æˆ·éœ€è¦å…³é—DVSync。 åœ¨ä¸æ”¯æŒDVSyncçš„å¹³å°æˆ–者如果有å¦ä¸€ä¸ªåº”用程åºå·²ç»å¯ç”¨äº†DVSync,则当å‰çš„å¯ç”¨æ“作将ä¸ä¼šç”Ÿæ•ˆï¼Œåº”用程åºä»å°†æ”¶åˆ°æ£å¸¸çš„VSyncä¿¡å·ã€‚ **系统能力:** SystemCapability.Graphic.Graphic2D.NativeVsync **起始版本:** 14 **傿•°:** | åç§° | æè¿° | | -------- | -------- | | nativeVsync | 一个指å‘OH_NativeVSync实例的指针。 | | enable | 表示打开或者关é—DVSync,true表示打开,false表示关é—。 | **返回:** 返回值为0表示执行æˆåŠŸï¼Œå…¶ä»–è¿”å›žå€¼å¯å‚考[OHNativeErrorCode](#ohnativeerrorcode)。 ### OH_NativeVSync_GetPeriod() ``` int OH_NativeVSync_GetPeriod (OH_NativeVSync * nativeVsync, long long * period ) ``` **æè¿°:** 获å–vsync周期。 vsyncå‘¨æœŸæ˜¯åœ¨æ¯æ¬¡ä½¿ç”¨OH_NativeVSync_RequestFrame接å£è¯·æ±‚vsyncä¿¡å·åŽæ”¶åˆ°OH_NativeVSync_FrameCallback回调的时候æ‰ä¼šæ›´æ–°ã€‚ 首次使用该接å£èŽ·å–vsync周期之å‰ï¼Œéœ€è¦å…ˆä½¿ç”¨OH_NativeVSync_RequestFrame接å£è¯·æ±‚vsyncä¿¡å·ï¼Œåœ¨æ”¶åˆ°OH_NativeVSync_FrameCallback回调之åŽï¼Œæ‰å¯ä»¥é€šè¿‡è¯¥æŽ¥å£èŽ·å–到vsync周期。 \@syscap SystemCapability.Graphic.Graphic2D.NativeVsync **傿•°:** | åç§° | æè¿° | | -------- | -------- | | nativeVsync | 一个指å‘OH_NativeVSync实例的指针。| | period | 表示vsync周期,作为出å‚使用。 | **返回:** 返回值为0表示执行æˆåŠŸï¼Œå…¶ä»–è¿”å›žå€¼å¯å‚考[OHNativeErrorCode](#ohnativeerrorcode)。 **起始版本:** 10 ### OH_NativeVSync_Create() ``` OH_NativeVSync* OH_NativeVSync_Create (const char * name, unsigned int length ) ``` **æè¿°:** 创建一个OH_NativeVSyncå®žä¾‹ï¼Œæ¯æ¬¡è°ƒç”¨éƒ½ä¼šäº§ç”Ÿä¸€ä¸ªæ–°çš„实例。 \@syscap SystemCapability.Graphic.Graphic2D.NativeVsync **傿•°:** | åç§° | æè¿° | | -------- | -------- | | name | 表示一个åå—,与创建的OH_NativeVSync实例关è”。 | | length | name的长度(å—符数)。 | **返回:** 返回一个指å‘OH_NativeVSync实例的指针。 ### OH_NativeVSync_Create_ForAssociatedWindow() ``` OH_NativeVSync* OH_NativeVSync_Create_ForAssociatedWindow (uint64_t windowID, const char* name, unsigned int length ) ``` **æè¿°** 创建一个和窗å£ç»‘定的OH_NativeVSyncå®žä¾‹ï¼Œæ¯æ¬¡è°ƒç”¨éƒ½ä¼šäº§ç”Ÿä¸€ä¸ªæ–°çš„实例。 使用本接å£åˆ›å»ºå‡ºæ¥çš„OH_NativeVSync实例的实际vsync周期与系统vsync周期ä¸å®Œå…¨ä¸€è‡´ï¼Œç³»ç»Ÿä¼šæ ¹æ®çª—å£çš„状æ€å¯¹å®žé™…vsync周期进行调整。 **系统能力:** SystemCapability.Graphic.Graphic2D.NativeVsync **起始版本:** 14 **傿•°:** | åç§° | æè¿° | | -------- | -------- | | windowID | 表示窗å£ID,窗å£åè¿›ç¨‹ç´¢å¼•æ ‡è¯†ç¬¦ï¼Œå¯ä»¥é€šè¿‡[OH_NativeWindow_GetSurfaceId](_native_window.md#oh_nativewindow_getsurfaceid)接å£èŽ·å–。 | | name | 表示一个å称,与创建的OH_NativeVSync实例关è”。 | | length | name的长度(å—符数)。 | **返回:** 返回一个指å‘OH_NativeVSync实例的指针。 ### OH_NativeVSync_Destroy() ``` void OH_NativeVSync_Destroy (OH_NativeVSync * nativeVsync) ``` **æè¿°:** 销æ¯OH_NativeVSync实例。 销æ¯åŽçš„OH_NativeVSync指针ä¸èƒ½å†ç»§ç»ä½¿ç”¨ï¼Œå¦åˆ™ä¼šæœ‰é‡ŽæŒ‡é’ˆé—®é¢˜ï¼Œå°¤å…¶éœ€è¦æ³¨æ„å¤šçº¿ç¨‹å¹¶å‘æ—¶å¯¹äºŽOH_NativeVSync指针的管ç†ã€‚ \@syscap SystemCapability.Graphic.Graphic2D.NativeVsync **傿•°:** | åç§° | æè¿° | | -------- | -------- | | nativeVsync | 一个指å‘OH_NativeVSync实例的指针。 | ### OH_NativeVSync_RequestFrame() ``` int OH_NativeVSync_RequestFrame (OH_NativeVSync * nativeVsync, OH_NativeVSync_FrameCallback callback, void * data ) ``` **æè¿°:** 请求下一次vsyncä¿¡å·ï¼Œå½“ä¿¡å·åˆ°æ¥æ—¶ï¼Œè°ƒç”¨å›žè°ƒå‡½æ•°callback。 如果在åŒä¸€å¸§å†…ä¸å¤šæ¬¡è°ƒç”¨æ¤æŽ¥å£ï¼Œåˆ™åªä¼šè§¦å‘最åŽä¸€ä¸ªå›žè°ƒã€‚ \@syscap SystemCapability.Graphic.Graphic2D.NativeVsync **傿•°:** | åç§° | æè¿° | | -------- | -------- | | nativeVsync | 一个指å‘OH_NativeVSync实例的指针。 | | callback | 一个OH_NativeVSync_FrameCallback类型的函数指针,当下一次vsyncä¿¡å·åˆ°æ¥æ—¶ä¼šè¢«è°ƒç”¨ã€‚ | | data | 一个指å‘用户自定义数æ®ç»“构的指针,类型是void\*。 | **返回:** 返回值为0表示执行æˆåŠŸï¼Œå…¶ä»–è¿”å›žå€¼å¯å‚考[OHNativeErrorCode](#ohnativeerrorcode)。 ### OH_NativeVSync_RequestFrameWithMultiCallback() ``` int OH_NativeVSync_RequestFrameWithMultiCallback (OH_NativeVSync* nativeVsync, OH_NativeVSync_FrameCallback callback, void* data ) ``` **æè¿°** 请求下一次vsyncä¿¡å·ï¼Œå½“ä¿¡å·åˆ°æ¥æ—¶ï¼Œè°ƒç”¨å›žè°ƒå‡½æ•°callback。 如果在åŒä¸€å¸§å†…ä¸å¤šæ¬¡è°ƒç”¨æ¤æŽ¥å£ï¼Œæ¯ä¸€æ¬¡ä¼ 入的callback都会被执行。 **系统能力:** SystemCapability.Graphic.Graphic2D.NativeVsync **起始版本:** 12 **傿•°:** | åç§° | æè¿° | | -------- | -------- | | nativeVsync | 一个指å‘OH_NativeVSync实例的指针。 | | callback | 一个OH_NativeVSync_FrameCallback类型的函数指针,当下一次vsyncä¿¡å·åˆ°æ¥æ—¶ä¼šè¢«è°ƒç”¨ã€‚ | | data | 一个指å‘用户自定义数æ®ç»“构的指针,类型是void\*。 | **返回:** 返回值为0表示执行æˆåŠŸï¼Œå…¶ä»–è¿”å›žå€¼å¯å‚考[OHNativeErrorCode](#ohnativeerrorcode)。