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