1e41f4b71Sopenharmony_ci# @ohos.graphics.displaySync (Variable Frame Rate) 2e41f4b71Sopenharmony_ciThe displaySync module allows your application to draw its custom UI content at a specified frame rate. 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci> **NOTE** 5e41f4b71Sopenharmony_ci> 6e41f4b71Sopenharmony_ci> The initial APIs of this module are supported since API version 11. Newly added APIs will be marked with a superscript to indicate their earliest API version. 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci## Modules to Import 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci```ts 12e41f4b71Sopenharmony_ciimport { displaySync } from '@kit.ArkGraphics2D'; 13e41f4b71Sopenharmony_ci``` 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci## displaySync.create 16e41f4b71Sopenharmony_cicreate(): DisplaySync 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ciCreates a **DisplaySync** object, through which you can set the frame rate of the custom UI content. 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci**Return value** 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci| Type | Description | 25e41f4b71Sopenharmony_ci| ------------------ | ------------------------ | 26e41f4b71Sopenharmony_ci| [DisplaySync](#displaysync) | **DisplaySync** object created. | 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci**Example** 29e41f4b71Sopenharmony_ci 30e41f4b71Sopenharmony_ci```ts 31e41f4b71Sopenharmony_cilet backDisplaySync: displaySync.DisplaySync = displaySync.create(); 32e41f4b71Sopenharmony_ci``` 33e41f4b71Sopenharmony_ci## IntervalInfo 34e41f4b71Sopenharmony_ci 35e41f4b71Sopenharmony_ciYou can obtain the timestamp information from the event callback, including the timestamp when the current frame arrives and the timestamp when the next frame is expected to arrive. 36e41f4b71Sopenharmony_ci 37e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 38e41f4b71Sopenharmony_ci 39e41f4b71Sopenharmony_ci| Name | Type | Read-only| Optional| Description | 40e41f4b71Sopenharmony_ci| ---------------- | ----------------------------------------- | ---- | ---- | ------------------------------------------ | 41e41f4b71Sopenharmony_ci| timestamp | number | Yes | No | Time when the current frame arrives, in nanoseconds.| 42e41f4b71Sopenharmony_ci| targetTimestamp | number| Yes | No | Expected arrival time of the next frame, in nanoseconds.| 43e41f4b71Sopenharmony_ci 44e41f4b71Sopenharmony_ci## DisplaySync 45e41f4b71Sopenharmony_ci 46e41f4b71Sopenharmony_ci An object that implements the setting of the frame rate and callback. It provides APIs for you to set the frame rate, register a callback, and start/stop the callback. 47e41f4b71Sopenharmony_ci 48e41f4b71Sopenharmony_ci Before calling any of the following APIs, you must use [displaySync.create()](#displaysynccreate) to create a **DisplaySync** instance. 49e41f4b71Sopenharmony_ci 50e41f4b71Sopenharmony_ci### setExpectedFrameRateRange 51e41f4b71Sopenharmony_ci 52e41f4b71Sopenharmony_cisetExpectedFrameRateRange(rateRange: ExpectedFrameRateRange) : void 53e41f4b71Sopenharmony_ci 54e41f4b71Sopenharmony_ciSets the expected frame rate range. 55e41f4b71Sopenharmony_ci 56e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 57e41f4b71Sopenharmony_ci 58e41f4b71Sopenharmony_ci**Parameters** 59e41f4b71Sopenharmony_ci 60e41f4b71Sopenharmony_ci| Name | Type | Mandatory| Description | 61e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------| 62e41f4b71Sopenharmony_ci| rateRange | [ExpectedFrameRateRange](../apis-arkui/arkui-ts/ts-explicit-animation.md#expectedframeraterange11)| Yes | Expected frame rate range.| 63e41f4b71Sopenharmony_ci 64e41f4b71Sopenharmony_ci**Error codes** 65e41f4b71Sopenharmony_ci 66e41f4b71Sopenharmony_ciFor details about the error codes, see [Universal Error Codes](../errorcode-universal.md). 67e41f4b71Sopenharmony_ci 68e41f4b71Sopenharmony_ci| ID| Error Message| 69e41f4b71Sopenharmony_ci| ------- | -------- | 70e41f4b71Sopenharmony_ci| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2.Incorrect parameters types. 3. Parameter verification failed. or check ExpectedFrameRateRange if valid.| 71e41f4b71Sopenharmony_ci 72e41f4b71Sopenharmony_ci**Example** 73e41f4b71Sopenharmony_ci 74e41f4b71Sopenharmony_ci```ts 75e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = { 76e41f4b71Sopenharmony_ci expected: 10, 77e41f4b71Sopenharmony_ci min:0, 78e41f4b71Sopenharmony_ci max:120 79e41f4b71Sopenharmony_ci}; 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci// Set the expected frame rate range. 82e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range) 83e41f4b71Sopenharmony_ci``` 84e41f4b71Sopenharmony_ci 85e41f4b71Sopenharmony_ci### on('frame') 86e41f4b71Sopenharmony_ci 87e41f4b71Sopenharmony_cion(type: 'frame', callback: Callback\<IntervalInfo\>): void 88e41f4b71Sopenharmony_ci 89e41f4b71Sopenharmony_ciSubscribes to change events of each frame. 90e41f4b71Sopenharmony_ci 91e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci**Parameters** 94e41f4b71Sopenharmony_ci 95e41f4b71Sopenharmony_ci| Name | Type | Mandatory| Description | 96e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------| 97e41f4b71Sopenharmony_ci| type | 'frame'| Yes | Event type. The value is fixed at **'frame'**.| 98e41f4b71Sopenharmony_ci| callback | Callback<[IntervalInfo](#intervalinfo)>| Yes | Callback used for subscription.| 99e41f4b71Sopenharmony_ci 100e41f4b71Sopenharmony_ci 101e41f4b71Sopenharmony_ci**Example** 102e41f4b71Sopenharmony_ci 103e41f4b71Sopenharmony_ci```ts 104e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 105e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 106e41f4b71Sopenharmony_ci} 107e41f4b71Sopenharmony_ci 108e41f4b71Sopenharmony_ci// Subscribe to the event. 109e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 110e41f4b71Sopenharmony_ci``` 111e41f4b71Sopenharmony_ci 112e41f4b71Sopenharmony_ci### off('frame') 113e41f4b71Sopenharmony_ci 114e41f4b71Sopenharmony_cioff(type: 'frame', callback\?: Callback\<IntervalInfo\>): void 115e41f4b71Sopenharmony_ci 116e41f4b71Sopenharmony_ciUnsubscribes from change events of each frame. 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ci**Parameters** 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ci| Name | Type | Mandatory| Description | 123e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------| 124e41f4b71Sopenharmony_ci| type | 'frame'| Yes | Event type. The value is fixed at **'frame'**.| 125e41f4b71Sopenharmony_ci| callback | Callback<[IntervalInfo](#intervalinfo)>| No | Callback used for unsubscription. If no value is passed in, all subscriptions to the specified event are canceled.| 126e41f4b71Sopenharmony_ci 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ci**Example** 129e41f4b71Sopenharmony_ci 130e41f4b71Sopenharmony_ci```ts 131e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 132e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 133e41f4b71Sopenharmony_ci} 134e41f4b71Sopenharmony_ci 135e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 136e41f4b71Sopenharmony_ci 137e41f4b71Sopenharmony_ci// Unsubscribe from the event. 138e41f4b71Sopenharmony_cibackDisplaySync?.off("frame", callback) 139e41f4b71Sopenharmony_ci``` 140e41f4b71Sopenharmony_ci 141e41f4b71Sopenharmony_ci### start 142e41f4b71Sopenharmony_ci 143e41f4b71Sopenharmony_cistart(): void 144e41f4b71Sopenharmony_ci 145e41f4b71Sopenharmony_ciStarts callback for each frame. 146e41f4b71Sopenharmony_ci 147e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 148e41f4b71Sopenharmony_ci 149e41f4b71Sopenharmony_ci**Example** 150e41f4b71Sopenharmony_ci 151e41f4b71Sopenharmony_ci```ts 152e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = { 153e41f4b71Sopenharmony_ci expected: 10, 154e41f4b71Sopenharmony_ci min:0, 155e41f4b71Sopenharmony_ci max:120 156e41f4b71Sopenharmony_ci}; 157e41f4b71Sopenharmony_ci 158e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range) 159e41f4b71Sopenharmony_ci 160e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 161e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 162e41f4b71Sopenharmony_ci} 163e41f4b71Sopenharmony_ci 164e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 165e41f4b71Sopenharmony_ci 166e41f4b71Sopenharmony_ci// Start callback for each frame. 167e41f4b71Sopenharmony_cibackDisplaySync?.start() 168e41f4b71Sopenharmony_ci``` 169e41f4b71Sopenharmony_ci 170e41f4b71Sopenharmony_ci> **NOTE** 171e41f4b71Sopenharmony_ci> 172e41f4b71Sopenharmony_ci> The **start()** API associates a **DisplaySync** object with a UI instance and window. If the start operation is performed on a non-UI page or in an asynchronous callback, the context of the current UI may not be obtained, causing the API call to fail and consequently the subscription function to fail. Therefore, you can use [runScopedTask](../apis-arkui/js-apis-arkui-UIContext.md#runscopedtask) of **UIContext** to specify the UI context for executing the **start()** API. 173e41f4b71Sopenharmony_ci 174e41f4b71Sopenharmony_ci**Example** 175e41f4b71Sopenharmony_ci 176e41f4b71Sopenharmony_ci```ts 177e41f4b71Sopenharmony_ciimport { displaySync } from '@kit.ArkGraphics2D'; 178e41f4b71Sopenharmony_ciimport { UIContext } from '@kit.ArkUI'; 179e41f4b71Sopenharmony_ci 180e41f4b71Sopenharmony_ci// xxx.ets 181e41f4b71Sopenharmony_ci@Entry 182e41f4b71Sopenharmony_ci@Component 183e41f4b71Sopenharmony_cistruct Index { 184e41f4b71Sopenharmony_ci // Create a DisplaySync instance. 185e41f4b71Sopenharmony_ci backDisplaySync: displaySync.DisplaySync = displaySync.create(); 186e41f4b71Sopenharmony_ci 187e41f4b71Sopenharmony_ci aboutToAppear() { 188e41f4b71Sopenharmony_ci // Obtain a UIContext instance. 189e41f4b71Sopenharmony_ci let uiContext: UIContext = this.getUIContext(); 190e41f4b71Sopenharmony_ci // Call start() in the current UI context. 191e41f4b71Sopenharmony_ci uiContext?.runScopedTask(() => { 192e41f4b71Sopenharmony_ci this.backDisplaySync?.start(); 193e41f4b71Sopenharmony_ci }) 194e41f4b71Sopenharmony_ci } 195e41f4b71Sopenharmony_ci 196e41f4b71Sopenharmony_ci build() { 197e41f4b71Sopenharmony_ci // ... 198e41f4b71Sopenharmony_ci } 199e41f4b71Sopenharmony_ci} 200e41f4b71Sopenharmony_ci 201e41f4b71Sopenharmony_ci``` 202e41f4b71Sopenharmony_ci 203e41f4b71Sopenharmony_ci### stop 204e41f4b71Sopenharmony_ci 205e41f4b71Sopenharmony_cistop(): void 206e41f4b71Sopenharmony_ci 207e41f4b71Sopenharmony_ciStops callback for each frame. 208e41f4b71Sopenharmony_ci 209e41f4b71Sopenharmony_ci 210e41f4b71Sopenharmony_ci**System capability**: SystemCapability.ArkUI.ArkUI.Full 211e41f4b71Sopenharmony_ci 212e41f4b71Sopenharmony_ci 213e41f4b71Sopenharmony_ci**Example** 214e41f4b71Sopenharmony_ci 215e41f4b71Sopenharmony_ci```ts 216e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = { 217e41f4b71Sopenharmony_ci expected: 10, 218e41f4b71Sopenharmony_ci min:0, 219e41f4b71Sopenharmony_ci max:120 220e41f4b71Sopenharmony_ci}; 221e41f4b71Sopenharmony_ci 222e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range) 223e41f4b71Sopenharmony_ci 224e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => { 225e41f4b71Sopenharmony_ci console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp); 226e41f4b71Sopenharmony_ci} 227e41f4b71Sopenharmony_ci 228e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback) 229e41f4b71Sopenharmony_ci 230e41f4b71Sopenharmony_cibackDisplaySync?.start() 231e41f4b71Sopenharmony_ci 232e41f4b71Sopenharmony_ci// ... 233e41f4b71Sopenharmony_ci 234e41f4b71Sopenharmony_ci// Stop callback for each frame. 235e41f4b71Sopenharmony_cibackDisplaySync?.stop() 236e41f4b71Sopenharmony_ci``` 237