微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用多线程记录命令缓冲区时性能低下

如何解决使用多线程记录命令缓冲区时性能低下

基本上,过去两周我一直在试图弄清楚为什么我的多线程命令缓冲区记录如此缓慢,我完全被难住了。问题是,当我尝试将工作卸载到多个线程以记录我的命令缓冲区时,我最终得到的性能低于使用单个线程时的性能。我很确定这是我如何设置线程/作业的问题

我现在正在做的是当我开始准备下一帧时,我告诉 X 数量的线程在辅助命令缓冲区中记录 X 数量的绘制命令(每个线程一个 cmd 缓冲区)所有工作在我使用的 X 个线程之间均匀分布,但是,在跟踪每个线程完成工作所需的时间之后,我注意到当我包含更多线程时,线程并没有更快地完成它们的工作工作线程来完成一部分工作。例如,告诉 2 个线程每个记录 100 个绘制命令将在大约 5 毫秒内完成它们的工作,但是如果我告诉 4 个线程每个记录 50 个绘制命令,它们仍然会在与 2 个线程花费的时间相同的时间内完成它们的工作尽管有更多的线程在每个线程中做的工作更少。

我不确定我在这里做错了什么

我的工作职能是这样的

void doRender(CommandBuffer* writeBuffer,VkCommandBufferInheritanceInfo inheritance,Pipeline* pipelineIn,MeshBuffer* meshBufferIn,dragonsbreath4::World* worldIn,int start,int end) {

            writeBuffer->begin(VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,&inheritance);

            writeBuffer->bindPipeline(pipelineIn);

            writeBuffer->bindMeshBuffer(meshBufferIn);

            writeBuffer->draw(worldIn->getEntityList(),start,end);

            writeBuffer->finish();

        }

writebuffer 是一个指向将被记录的辅助命令缓冲区的指针。 管道是指向应用程序使用的图形管道的指针。 网格缓冲区是一个指向包含所有顶点数据和索引数据的缓冲区的对象的指针。 世界是指向将要绘制的世界的指针。 开始/结束只是实体列表上开始绘制的位置和结束位置。

我很确定问题在于大多数这些资源都被记录命令的每个线程(管道、世界、meshbuffer)访问

我希望这是足够的信息,如果不是我可以包含更多信息。任何帮助将不胜感激!!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。