在做渲染相关处理的时候,经常需要和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) {