setGameDrawFrameListener
设置游戏帧渲染监听器
setGameDrawFrameListener 用于注册一个回调接口,每当游戏引擎完成一帧画面的渲染时,SDK 都会触发该监听器。这通常用于实现原生 UI 与游戏画面的同步、性能监控,或者在特定帧执行截图、滤镜等高频操作。
方法声明
objectivec
/**
* 设置游戏帧渲染回调监听。
* @param listener 遵循 SUDRTGameDrawFrameListener 协议的对象。
*/
- (void)setGameDrawFrameListener:(nullable id<SUDRTGameDrawFrameListener>)listener;参数说明
| 参数名 | 类型 | 必传 | 描述 |
|---|---|---|---|
| listener | id<SUDRTGameDrawFrameListener> | 否 | 监听器实例。传入 nil 则取消监听。 |
运行行为
- 高频触发:回调频率取决于游戏的帧率(通常为 30fps 或 60fps)。
- 同步性:回调通常发生在渲染线程或主线程(取决于具体实现),它保证了回调触发时当前帧的渲染指令已提交。
- 非阻塞性:该监听器仅用于通知,不会阻塞游戏内部的渲染循环。
代码示例
通过监听帧回调,可以实现原生视图与游戏角色位置的完美同步:
objectivec
// 1. 实现协议
@interface GameViewController () <SUDRTGameDrawFrameListener>
@end
@implementation GameViewController
- (void)setupListener {
// 2. 注册监听
[self.gameHandle setGameDrawFrameListener:self];
}
#pragma mark - SUDRTGameDrawFrameListener
- (void)onGameDrawFrame {
// 3. 每一帧渲染时都会执行此处逻辑
// 例如:在此处同步更新覆盖在游戏上的原生进度条或特效
/*
dispatch_async(dispatch_get_main_queue(), ^{
[self updateNativeOverlay];
});
*/
}
@end注意事项
- 性能损耗:由于该回调触发极其频繁(每秒 60 次),严禁在
onGameDrawFrame中执行耗时的 CPU 操作、同步网络请求或复杂的计算。 - 线程安全:如果需要在回调中操作原生 UI 控件,必须通过
dispatch_async(dispatch_get_main_queue(), ...)切换到主线程。 - 按需开启:如果不需要每帧同步,请在任务完成后及时通过
setGameDrawFrameListener:nil移除监听,以降低资源开销。 - 状态依赖:只有在游戏处于
PLAYING状态且画面发生变化时,该监听器才会持续触发。