• 技术文章 >web前端 >js教程

    关于Layer组件的同步以及减少GPU带宽的问题

    零到壹度零到壹度2018-03-28 13:24:14原创1715
    本文主要为大家分享一篇P关于Layer组件的同步以及减少GPU带宽的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。

    问题:

    1) Layer 之间能否进行单独更新,比如其中video 层上面弹出的状态栏场景如何优化;

    初步构想每次仅更新video layer或则将video layer 绕过BQ 进行处理。

    2)FW 以及GPU对video layer 的常见处理;

    3)几个变量的理解;

    (1)mCurrentTexture ,nextTextureImage;

    (2)BufferItem,BufferQueue,mslots;slot,mqueuedframe,mqueuedItem;

    (3)syncForReleaseLocked,updateAndReleaseLocked,releaseBufferLocked,releaseBuffer

    (4)

    / acquireBuffer attempts to acquire ownership of the next pending buffer in the BufferQueue.
          // If no buffer is pending then it returns NO_BUFFER_AVAILABLE. If a buffer is successfully
          // acquired, the information about the buffer is returned in BufferItem.
          //
          // If the buffer returned had previously been acquired then the BufferItem::mGraphicBuffer field
          // of buffer is set to NULL and it is assumed that the consumer still holds a reference to the
          // buffer.
          //
          // If presentWhen is non-zero, it indicates the time when the buffer will be displayed on
          // screen. If the buffer's timestamp is farther in the future, the buffer won't be acquired, and
          // PRESENT_LATER will be returned. The presentation time is in nanoseconds, and the time base
          // is CLOCK_MONOTONIC.
          //
          // If maxFrameNumber is non-zero, it indicates that acquireBuffer should only return a buffer
          // with a frame number less than or equal to maxFrameNumber. If no such frame is available
          // (such as when a buffer has been replaced but the consumer has not received the
          // onFrameReplaced callback), then PRESENT_LATER will be returned.
          //
          // Return of NO_ERROR means the operation completed as normal.
          //
          // Return of a positive value means the operation could not be completed at this time, but the
          // user should try again later:
          // * NO_BUFFER_AVAILABLE - no buffer is pending (nothing queued by producer)
          // * PRESENT_LATER - the buffer's timestamp is farther in the future
          //
          // Return of a negative value means an error has occurred:
          // * INVALID_OPERATION - too many buffers have been acquired
      // Returned by releaseBuffer, after which the consumer must free any references to the
                // just-released buffer that it might have.
                STALE_BUFFER_SLOT = 1,
              // Returned by dequeueBuffer if there are no pending buffers available.
              NO_BUFFER_AVAILABLE,
              // Returned by dequeueBuffer if it's too early for the buffer to be acquired.
              PRESENT_LATER,

    (5)mslots 与mframe 以及mframenumber 的区别

    (6)onframavailable 和latchbuffer ,reject,updateteximage,的逻辑。

    其中updateteximage;

    (7)bufferitem 与mslots的区别

    (8)bufferqueueconsumer 与bufferitemconsumer区别;

    (9)acquirebuffer的fence 逻辑,fencefd是哪来的;

    fence 相关接口定义参见ui/Fence.h

     status_t Fence::waitForever(const char* logname) {64      ATRACE_CALL();
          if (mFenceFd == -1) {
              return NO_ERROR;
          }
          int warningTimeout = 3000;
          int err = sync_wait(mFenceFd, warningTimeout);
          if (err < 0 && errno == ETIME) {
              ALOGE("%s: fence %d didn't signal in %u ms", logname, mFenceFd,
                      warningTimeout);
              err = sync_wait(mFenceFd, TIMEOUT_NEVER);
          }
          return err < 0 ? -errno : status_t(NO_ERROR);
      }
      struct EglSlot {
               EglSlot() : mEglFence(EGL_NO_SYNC_KHR) {}
                // mEglImage is the EGLImage created from mGraphicBuffer.
                sp<EglImage> mEglImage;
               // mFence is the EGL sync object that must signal before the buffer
                // associated with this buffer slot may be dequeued. It is initialized
                // to EGL_NO_SYNC_KHR when the buffer is created and (optionally, based
               // on a compile-time option) set to a new sync object in updateTexImage.
                EGLSyncKHR mEglFence;
          };

    (10)

    updateAndReleaseLocked(item, &mPendingRelease),
    updateAndReleaseLocked(item),
    bindTextureImageLocked()

    以上就是关于Layer组件的同步以及减少GPU带宽的问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:Layer GPU带宽,同步
    上一篇:JS的深浅拷贝使用详解 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 手把手带你了解Angular中的依赖注入• 聊聊用pkg将Node.js项目打包为可执行文件的方法• Node实战:运用Cookie&Session进行登录验证• jQuery插件分享:Turn.js实现一个移动端电子书翻页效果• Angular学习之聊聊notification(自定义服务)
    1/1

    PHP中文网