1e41f4b71Sopenharmony_ci#  @ohos.graphics.displaySync (可变帧率)
2e41f4b71Sopenharmony_ci可变帧率支持让开发者以指定帧率来运行UI业务,一般用于开发者自绘制UI,并且对于帧率有特定诉求的场景。
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ci> **说明:**
5e41f4b71Sopenharmony_ci>
6e41f4b71Sopenharmony_ci> 本模块首批接口和数据定义从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
7e41f4b71Sopenharmony_ci
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci## 导入模块
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_ci创建DisplaySync对象,通过此对象设置UI自绘制内容帧率。
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci**返回值:**
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci| 类型                | 说明                     |
25e41f4b71Sopenharmony_ci| ------------------ | ------------------------ |
26e41f4b71Sopenharmony_ci| [DisplaySync](#displaysync)  | 返回当前创建的DisplaySync对象实例。               |
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci**示例:**
29e41f4b71Sopenharmony_ci
30e41f4b71Sopenharmony_ci```ts
31e41f4b71Sopenharmony_cilet backDisplaySync: displaySync.DisplaySync = displaySync.create();
32e41f4b71Sopenharmony_ci```
33e41f4b71Sopenharmony_ci## IntervalInfo
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci开发者可以从订阅函数中获取帧绘制的时间戳信息,包含当前帧到达的时间timestamp和下一帧预期到达的时间targetTimestamp。
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci| 名称             | 类型                                      | 只读 | 可选 | 说明                                       |
40e41f4b71Sopenharmony_ci| ---------------- | ----------------------------------------- | ---- | ---- | ------------------------------------------ |
41e41f4b71Sopenharmony_ci| timestamp      | number | 是   | 否   | 当前帧到达的时间(单位:纳秒)。 |
42e41f4b71Sopenharmony_ci| targetTimestamp | number| 是   | 否   | 下一帧预期到达的时间(单位:纳秒)。 |
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci## DisplaySync
45e41f4b71Sopenharmony_ci
46e41f4b71Sopenharmony_ci 帧率和回调函数设置实例。用于帧率设置和回调函数的注册,以及启动和停止回调函数的调用。
47e41f4b71Sopenharmony_ci
48e41f4b71Sopenharmony_ci 下列API示例中都需先使用[displaySync.create()](#displaysynccreate)方法获取到DisplaySync实例,再通过此实例调用对应方法。
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci### setExpectedFrameRateRange
51e41f4b71Sopenharmony_ci
52e41f4b71Sopenharmony_cisetExpectedFrameRateRange(rateRange: ExpectedFrameRateRange) : void
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci设置期望的帧率范围。
55e41f4b71Sopenharmony_ci
56e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
57e41f4b71Sopenharmony_ci
58e41f4b71Sopenharmony_ci**参数:**
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_ci| 参数名           | 类型                                       | 必填 | 说明                          |
61e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------|
62e41f4b71Sopenharmony_ci| rateRange       | [ExpectedFrameRateRange](../apis-arkui/arkui-ts/ts-explicit-animation.md#expectedframeraterange11)| 是   | 设置DisplaySync期望的帧率。|
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci**错误码**:
65e41f4b71Sopenharmony_ci
66e41f4b71Sopenharmony_ci以下错误码详细介绍请参考[通用错误码](../errorcode-universal.md)。
67e41f4b71Sopenharmony_ci
68e41f4b71Sopenharmony_ci| 错误码ID | 错误信息 |
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**示例:**
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// 设置DisplaySync期望的帧率
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_ci订阅每一帧的变化。
90e41f4b71Sopenharmony_ci
91e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
92e41f4b71Sopenharmony_ci
93e41f4b71Sopenharmony_ci**参数:**
94e41f4b71Sopenharmony_ci
95e41f4b71Sopenharmony_ci| 参数名           | 类型                                       | 必填 | 说明                          |
96e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------|
97e41f4b71Sopenharmony_ci| type | 'frame'| 是   | 设置注册回调的类型(只能是'frame'类型)。|
98e41f4b71Sopenharmony_ci| callback    | Callback<[IntervalInfo](#intervalinfo)>| 是   | 订阅函数。|
99e41f4b71Sopenharmony_ci
100e41f4b71Sopenharmony_ci
101e41f4b71Sopenharmony_ci**示例:**
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// 注册订阅函数
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_ci取消订阅每一帧的变化。
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci**参数:**
121e41f4b71Sopenharmony_ci
122e41f4b71Sopenharmony_ci| 参数名           | 类型                                       | 必填 | 说明                          |
123e41f4b71Sopenharmony_ci| --------------- | ------------------------------------------ | ---- | -----------------------------|
124e41f4b71Sopenharmony_ci| type | 'frame'| 是   | 设置注册回调的类型(只能是'frame'类型)。|
125e41f4b71Sopenharmony_ci| callback    | Callback<[IntervalInfo](#intervalinfo)>| 否   | 订阅函数, 参数不填时,默认取消全部订阅函数。|
126e41f4b71Sopenharmony_ci
127e41f4b71Sopenharmony_ci
128e41f4b71Sopenharmony_ci**示例:**
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// 取消订阅函数
138e41f4b71Sopenharmony_cibackDisplaySync?.off("frame", callback)
139e41f4b71Sopenharmony_ci```
140e41f4b71Sopenharmony_ci
141e41f4b71Sopenharmony_ci### start
142e41f4b71Sopenharmony_ci
143e41f4b71Sopenharmony_cistart(): void
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_ci开始每帧回调。
146e41f4b71Sopenharmony_ci
147e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
148e41f4b71Sopenharmony_ci
149e41f4b71Sopenharmony_ci**示例:**
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// 开始每帧回调
167e41f4b71Sopenharmony_cibackDisplaySync?.start()
168e41f4b71Sopenharmony_ci```
169e41f4b71Sopenharmony_ci
170e41f4b71Sopenharmony_ci> **说明:**
171e41f4b71Sopenharmony_ci>
172e41f4b71Sopenharmony_ci> start接口是将DisplaySync关联到UI实例和窗口,若在非UI页面中或者一些异步回调中进行start操作,可能无法跟踪到当前UI的上下文,导致start接口失败,会进一步导致订阅函数无法执行。
173e41f4b71Sopenharmony_ci> 因此可以使用UIContext的[runScopedTask](../apis-arkui/js-apis-arkui-UIContext.md#runscopedtask)接口来指定start函数执行的UI上下文。
174e41f4b71Sopenharmony_ci
175e41f4b71Sopenharmony_ci**示例:**
176e41f4b71Sopenharmony_ci
177e41f4b71Sopenharmony_ci```ts
178e41f4b71Sopenharmony_ciimport { displaySync } from '@kit.ArkGraphics2D';
179e41f4b71Sopenharmony_ciimport { UIContext } from '@kit.ArkUI';
180e41f4b71Sopenharmony_ci
181e41f4b71Sopenharmony_ci// xxx.ets
182e41f4b71Sopenharmony_ci@Entry
183e41f4b71Sopenharmony_ci@Component
184e41f4b71Sopenharmony_cistruct Index {
185e41f4b71Sopenharmony_ci  // 创建DisplaySync实例
186e41f4b71Sopenharmony_ci  backDisplaySync: displaySync.DisplaySync = displaySync.create();
187e41f4b71Sopenharmony_ci
188e41f4b71Sopenharmony_ci  aboutToAppear() {
189e41f4b71Sopenharmony_ci    // 获取UIContext实例
190e41f4b71Sopenharmony_ci    let uiContext: UIContext = this.getUIContext();
191e41f4b71Sopenharmony_ci    // 在当前UI上下文中执行DisplaySync的start接口
192e41f4b71Sopenharmony_ci    uiContext?.runScopedTask(() => {
193e41f4b71Sopenharmony_ci      this.backDisplaySync?.start();
194e41f4b71Sopenharmony_ci    })
195e41f4b71Sopenharmony_ci  }
196e41f4b71Sopenharmony_ci
197e41f4b71Sopenharmony_ci  build() {
198e41f4b71Sopenharmony_ci    // ...
199e41f4b71Sopenharmony_ci  }
200e41f4b71Sopenharmony_ci}
201e41f4b71Sopenharmony_ci
202e41f4b71Sopenharmony_ci```
203e41f4b71Sopenharmony_ci
204e41f4b71Sopenharmony_ci### stop
205e41f4b71Sopenharmony_ci
206e41f4b71Sopenharmony_cistop(): void
207e41f4b71Sopenharmony_ci
208e41f4b71Sopenharmony_ci停止每帧回调。
209e41f4b71Sopenharmony_ci
210e41f4b71Sopenharmony_ci
211e41f4b71Sopenharmony_ci**系统能力:** SystemCapability.ArkUI.ArkUI.Full
212e41f4b71Sopenharmony_ci
213e41f4b71Sopenharmony_ci
214e41f4b71Sopenharmony_ci**示例:**
215e41f4b71Sopenharmony_ci
216e41f4b71Sopenharmony_ci```ts
217e41f4b71Sopenharmony_cilet range : ExpectedFrameRateRange = {
218e41f4b71Sopenharmony_ci  expected: 10,
219e41f4b71Sopenharmony_ci  min:0,
220e41f4b71Sopenharmony_ci  max:120
221e41f4b71Sopenharmony_ci};
222e41f4b71Sopenharmony_ci
223e41f4b71Sopenharmony_cibackDisplaySync?.setExpectedFrameRateRange(range)
224e41f4b71Sopenharmony_ci
225e41f4b71Sopenharmony_cilet callback = (frameInfo: displaySync.IntervalInfo) => {
226e41f4b71Sopenharmony_ci    console.info("DisplaySync", 'TimeStamp:' + frameInfo.timestamp + ' TargetTimeStamp: ' + frameInfo.targetTimestamp);
227e41f4b71Sopenharmony_ci}
228e41f4b71Sopenharmony_ci
229e41f4b71Sopenharmony_cibackDisplaySync?.on("frame", callback)
230e41f4b71Sopenharmony_ci
231e41f4b71Sopenharmony_cibackDisplaySync?.start()
232e41f4b71Sopenharmony_ci
233e41f4b71Sopenharmony_ci// ...
234e41f4b71Sopenharmony_ci
235e41f4b71Sopenharmony_ci// 停止每帧回调
236e41f4b71Sopenharmony_cibackDisplaySync?.stop()
237e41f4b71Sopenharmony_ci```