بافر کردن فریم های دوربین

اضافه شده در ARCore 1.17.0

اکثر برنامه‌ها فقط باید یک فریم دوربین را برای رندر بافر کنند. با این حال، ARCore همچنین از بافر کردن چندین فریم دوربین در یک صف بافت دور روبین با اندازه ثابت پشتیبانی می کند.

برنامه‌های دارای خط لوله رندر چند رشته‌ای می‌توانند از بافر برای کمک به بهبود عملکرد رندر استفاده کنند. بافر کردن همچنین می‌تواند به برنامه‌ها کمک کند فریم‌ها را با نرخ فریم ثابت‌تری ارائه دهند، که می‌تواند لکنت بصری ناشی از رندر آهسته رابط کاربری را کاهش دهد.

پیش شرط ها

بافر تصویر دوربین تحت هر یک از شرایط زیر فعال می شود:

  1. هنگامی که برنامه با تماس با Session.setCameraTextureNames(ids) با چندین شناسه بافت فعال می شود.

  2. هنگامی که یک یا چند ویژگی ARCore که نیاز به بافر داخلی دارند فعال هستند . در حال حاضر این شامل این ویژگی ها است:

    • تصاویر افزوده شده
    • چهره های تقویت شده
  3. در برخی از دستگاه های پشتیبانی شده از ARCore که برای عملکرد صحیح به بافر داخلی نیاز دارند.

تعیین کنید که آیا تاخیر فریم فعال است یا خیر

برای تعیین اینکه آیا یک دستگاه معین و جلسه AR دارای بافر فریم (که به عنوان تاخیر فریم نیز شناخته می شود) فعال است یا خیر، از خروجی adb logcat استفاده کنید:

# Camera frame buffering is turned off when frame delay is zero.
adb logcat | grep 'Update Frame Delay'
 I native  : session.cc:3141 Update Frame Delay to 0 frames.
# Camera frame buffering is turned on when frame count is non-zero.
# Note: The size of the buffer can vary over time.
adb logcat | grep 'Update Frame Delay'
 I native  : session.cc:3141 Update Frame Delay to 6 frames.

 I native  : session.cc:3141 Update Frame Delay to 4 frames.

 I native  : session.cc:3141 Update Frame Delay to 2 frames.

حافظه

هر فریم دوربین اضافی بافر استفاده از حافظه را افزایش می دهد. به عنوان مثال، یک بافت 1080p تقریباً 6 مگابایت حافظه مصرف می کند (که با ضرب رزولوشن 1920 در 1080 در سه بایت داده RGB در هر پیکسل به دست می آید).

ملاحظات عملکرد

استفاده از چندین فریم دوربین تضمینی برای کاهش تنوع نرخ فریم نیست، و استفاده از خط لوله رندر چند رشته ای تضمینی برای ارائه عملکرد بهتر در هر شرایطی نیست. عوامل زیر بر عملکرد دنیای واقعی تأثیر می گذارد:

  • خط لوله رندر برنامه

  • مدل رشته‌بندی برنامه

  • معماری CPU دستگاه

  • سیستم برنامه ریزی سیستم عامل

اگر برنامه شما قادر به استفاده از فریم‌های دوربین اضافی نیست، استفاده از بیش از یک بافت هیچ مزیت عملکردی ندارد.

بافر را فعال کنید

برای آموزش به ARCore که از کدام بافت‌ها برای بافر فریم‌های دوربین ورودی استفاده کند، از Session.setCameraTextureNames(ids) استفاده کنید تا آرایه‌ای از یک یا چند ID بافت ارائه کنید. این تابع فقط پس از ایجاد جلسه فراخوانی می شود و معمولاً فقط یک بار فراخوانی می شود.

در طول هر تماس با Session.update() ، ARCore بافت بعدی در صف را در یک دنباله روبینه بازنویسی می کند. اگر برنامه شما فقط یک شناسه بافت را تنظیم کند، هر بار همان بافت بازنویسی می شود.

از Frame.getCameraTextureName() برای تعیین شناسه بافت مرتبط با فریم فعلی استفاده کنید.

،

اضافه شده در ARCore 1.17.0

اکثر برنامه‌ها فقط باید یک فریم دوربین را برای رندر بافر کنند. با این حال، ARCore همچنین از بافر کردن چندین فریم دوربین در یک صف بافت دور روبین با اندازه ثابت پشتیبانی می کند.

برنامه‌های دارای خط لوله رندر چند رشته‌ای می‌توانند از بافر برای کمک به بهبود عملکرد رندر استفاده کنند. بافر کردن همچنین می‌تواند به برنامه‌ها کمک کند فریم‌ها را با نرخ فریم ثابت‌تری ارائه دهند، که می‌تواند لکنت بصری ناشی از رندر آهسته رابط کاربری را کاهش دهد.

پیش شرط ها

بافر تصویر دوربین تحت هر یک از شرایط زیر فعال می شود:

  1. هنگامی که برنامه با تماس با Session.setCameraTextureNames(ids) با چندین شناسه بافت فعال می شود.

  2. هنگامی که یک یا چند ویژگی ARCore که نیاز به بافر داخلی دارند فعال هستند . در حال حاضر این شامل این ویژگی ها است:

    • تصاویر افزوده شده
    • چهره های تقویت شده
  3. در برخی از دستگاه های پشتیبانی شده از ARCore که برای عملکرد صحیح به بافر داخلی نیاز دارند.

تعیین کنید که آیا تاخیر فریم فعال است یا خیر

برای تعیین اینکه آیا یک دستگاه معین و جلسه AR دارای بافر فریم (که به عنوان تاخیر فریم نیز شناخته می شود) فعال است یا خیر، از خروجی adb logcat استفاده کنید:

# Camera frame buffering is turned off when frame delay is zero.
adb logcat | grep 'Update Frame Delay'
 I native  : session.cc:3141 Update Frame Delay to 0 frames.
# Camera frame buffering is turned on when frame count is non-zero.
# Note: The size of the buffer can vary over time.
adb logcat | grep 'Update Frame Delay'
 I native  : session.cc:3141 Update Frame Delay to 6 frames.

 I native  : session.cc:3141 Update Frame Delay to 4 frames.

 I native  : session.cc:3141 Update Frame Delay to 2 frames.

حافظه

هر فریم دوربین اضافی بافر استفاده از حافظه را افزایش می دهد. به عنوان مثال، یک بافت 1080p تقریباً 6 مگابایت حافظه مصرف می کند (که با ضرب رزولوشن 1920 در 1080 در سه بایت داده RGB در هر پیکسل به دست می آید).

ملاحظات عملکرد

استفاده از چندین فریم دوربین تضمینی برای کاهش تنوع نرخ فریم نیست، و استفاده از خط لوله رندر چند رشته ای تضمینی برای ارائه عملکرد بهتر در هر شرایطی نیست. عوامل زیر بر عملکرد دنیای واقعی تأثیر می گذارد:

  • خط لوله رندر برنامه

  • مدل رشته‌بندی برنامه

  • معماری CPU دستگاه

  • سیستم برنامه ریزی سیستم عامل

اگر برنامه شما قادر به استفاده از فریم‌های دوربین اضافی نیست، استفاده از بیش از یک بافت هیچ مزیت عملکردی ندارد.

بافر را فعال کنید

برای آموزش به ARCore که از کدام بافت‌ها برای بافر فریم‌های دوربین ورودی استفاده کند، از Session.setCameraTextureNames(ids) استفاده کنید تا آرایه‌ای از یک یا چند ID بافت ارائه کنید. این تابع فقط پس از ایجاد جلسه فراخوانی می شود و معمولاً فقط یک بار فراخوانی می شود.

در طول هر تماس با Session.update() ، ARCore بافت بعدی در صف را در یک دنباله روبینه بازنویسی می کند. اگر برنامه شما فقط یک شناسه بافت را تنظیم کند، هر بار همان بافت بازنویسی می شود.

از Frame.getCameraTextureName() برای تعیین شناسه بافت مرتبط با فریم فعلی استفاده کنید.