NDK下获取vsync时间

在做渲染相关处理的时候,经常需要和Android系统的Vsync做同步,今天来说一下NDK下如何实现。

ndk下专门提供了AChoreographer来做这件事,第一步要加载头文件

然后实际使用也很简单,获取实例,注册回调,然后就等着收到回调时间就可以了。回调的参数是上一帧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

你可能感兴趣的:(ndk,图形渲染)