Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上非常慢的VkendCommand缓冲区_Android_Performance_Vulkan - Fatal编程技术网

Android上非常慢的VkendCommand缓冲区

Android上非常慢的VkendCommand缓冲区,android,performance,vulkan,Android,Performance,Vulkan,我做了一些分析,发现vkEndCommandBuffer在Android上做了很多工作(我的应用程序中25%的渲染线程时间)。对我来说,最奇怪的是它会产生巨大的memcpy(渲染线程时间的20%) 我在命令缓冲区和命令缓冲池中尝试了不同的标志,也尝试了隐式和显式地重置命令缓冲区,但没有任何帮助。我发现如果禁用MSAA,vkEndCommandBuffer的工作速度会更快。但这对我来说毫无意义 堆栈: qglinternal::vkEndCommandBuffer QglCommandBuffe

我做了一些分析,发现vkEndCommandBuffer在Android上做了很多工作(我的应用程序中25%的渲染线程时间)。对我来说,最奇怪的是它会产生巨大的memcpy(渲染线程时间的20%)

我在命令缓冲区和命令缓冲池中尝试了不同的标志,也尝试了隐式和显式地重置命令缓冲区,但没有任何帮助。我发现如果禁用MSAA,vkEndCommandBuffer的工作速度会更快。但这对我来说毫无意义

堆栈:

  • qglinternal::vkEndCommandBuffer
  • QglCommandBuffer::End
  • A5xCommandBuffer::HwProcessWorkload
  • memcpy
为什么这么慢?它在做什么?有什么想法吗


UPD:我在5台设备上测试了我的应用程序。应用程序每帧绘制200-400个调用:

  • 小米。安卓7.1。肾上腺素506。驱动程序版本:55.277.3829(根据Vulkan Caps Viewer)。每秒30帧。vkEndCommandBuffer中没有memcpy,但仍需要5%的渲染线程时间
  • 小米MiA2 Lite。安卓9.0。肾上腺素506。驱动程序版本:512.331.0。每秒20-25帧。巨大的memcpy、vkEndCommandBuffer占用了25.6%的渲染线程时间
  • Yandex YNDX-000SB。安卓8.1。肾上腺素508。驱动程序版本:14.307.2170。每秒30帧。巨大的memcpy、vkEndCommandBuffer占用了22.7%的渲染线程时间
  • 谷歌像素2 XL。安卓10.0。阿雷诺540。驱动程序版本:512.385.0。每秒60帧(但这是一款昂贵的设备)。巨大的memcpy,但vkEndCommandBuffer只占用渲染线程时间的5.8%
  • 三星Galaxy J7。安卓8.1。马里-T830。每分钟45-50帧。vkEndCommandBuffer只占用渲染线程时间的0.2%
  • 我还注意到了接下来的事情:

    • 所有使用Adreno的设备都在DrawIndexed中执行大量工作。他们称之为巨型memset(wtf?)
    • 所有带有Adreno的设备都不会重用命令缓冲区。它们总是释放命令缓冲区的所有资源(即使我使用隐式重置)。它需要大约2-5%的渲染线程时间,具体取决于设备

    这是什么设备?“qgl”和“A5x”表示高通公司的处理器带有Adreno 5xx GPU。了解驱动程序版本可能会有所帮助,但实际上您可能需要向高通开发人员支持部门或其性能工具寻求帮助。@JesseHall谢谢@刘易斯·戈登:我更新了我的问题。我又遇到了一个问题——你在使用辅助命令缓冲区吗?