在做渲染相关处理的时候,经常需要和Android系统的Vsync做同步,今天来说一下NDK下如何实现。
ndk下专门提供了AChoreographer来做这件事,第一步要加载头文件<android/choreographer.h>。
然后实际使用也很简单,获取实例,注册回调,然后就等着收到回调时间就可以了。回调的参数是上一帧vsync开始的时间戳,单位是纳秒ns,可以根据前两帧时间或者刷新率,来计算两帧中间的时间差,从而预测下一帧到来的时间。
AChoreographer *grapher = AChoreographer_getInstance();
AChoreographer_postFrameCallback(grapher, frameCallback, nullptr);
有几个需要注意的地方:
1. callback只会回调一次,即注册的函数只是针对下一帧生效,如果需要一直监听vsync的话,可以在通过嵌套注册。
void frameCallback(long frameTimeNanos, void* data) {
//do something
AChoreographer_postFrameCallback(grapher, frameCallback, nullptr);
}
2. 所在的线程要有一个looper,否则获取不到AChoreographer实例。而且在创建后,要在线程里处理looper消息,否则也收不到回调。
void run() {
ALooper* looper = ALooper_forThread();
if (looper == NULL) {
LOGI("Looper was null, preparing new one");
looper = ALooper_prepare(0);
}
// then get AChoreographer here
while(true) {
int id;
int events;
void* data;
while ((id = ALooper_pollAll(0, NULL, &events, &data)) >= 0) {
//handle loop event for frame callback.
}
// frame loop
}
}
3. Android版本24及以上,使用函数接口 AChoreographer_postFrameCallback
Android版本29及以上,使用函数接口 AChoreographer_postFrameCallback64
1097

被折叠的 条评论
为什么被折叠?



