本帖最后由 AskAQuestion 于 2014-10-28 15:03:05 编辑

解决方案 »

  1.   

    请参考:
    http://www.2cto.com/kf/201401/270833.html
      

  2.   

    app(Choreographer) 和surfaceflinger在需要vsync信号的时候,会发出要求去enableVsync(),没有人需要的时候会再关闭掉。
    所以vsync信号不是一直在发送的,而是按照需求来发出的。
      

  3.   


    那什么时候会需要发呢?我这好像之后一直没有收到enableVsync,这是为什么?
      

  4.   


    那什么时候会需要发呢?我这好像之后一直没有收到enableVsync,这是为什么?app需要刷新的时候会enable。但是如果你是android kitkat版本,又有些差异,4.4引入了dispsync,绝大多数时候是使用的software的vsycn,不会需要hwc发出vsync信号了,这种情况下vsync正常就不需要被enable了,只有在software vsync需要校正的时候才会enable。
      

  5.   


    我用的确实是4.4. 您说的software的vsycn是
    HWComposer::HWComposer()中的  mVSyncThread = new VSyncThread(*this); 吗?
    但这个因为mHwc存在没有执行啊?
      

  6.   


    我用的确实是4.4. 您说的software的vsycn是
    HWComposer::HWComposer()中的  mVSyncThread = new VSyncThread(*this); 吗?
    但这个因为mHwc存在没有执行啊?不是的,是DispSync这个class,你看看他的使用。
      

  7.   


    我把HWC_DISPLAY_VSYNC_PERIOD 设为了40*1000000,

    SurfaceFlinger::onMessageReceived()
        case MessageQueue::REFRESH:
    加上了 
    ALOGD("#%d", (unsigned int)(systemTime()/1000000));    发现SurfaceFlinger 的refresh好像每隔200ms左右才被调用一下,即便是在显示视屏。这是不是不正常啊?
      

  8.   

    这个不好说,你要确保你的ui是每个vsync都会刷新的,这个时间才有意义。
    你可以用systrace去抓取下信息看看。
      

  9.   


    我用systrace抓下来的html只显示了cpu,这是什么原因?