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