热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vulkan异步模型加载

如何解决《Vulkan异步模型加载》经验,为你挑选了1个好方法。

我不太确定它是否真的正确我想要做的事情但是没有那么多关于Vulkan的文档,所以这就是我提出的.如果我的设计方式完全错误,请纠正我!

在我的Vulkan应用程序中,我有三个不同的队列

graphicsQueue:用于提交图形命令缓冲区

presentQueue:用于显示完成的图像

transferQueue:用于复制缓冲区,纹理等.

我正在尝试实现异步模型加载,这意味着所有顶点,纹理等都在一个单独的线程中加载.模型加载完成后,主线程会更新绘图命令缓冲区,以便渲染新加载的对象.

一切正常,因为它应该期望我从Vulkan Validation层获得警告:

线程错误:VkQueue类型的对象同时用于线程...

如果我单步执行调试器,我可以看到以下行受到影响:

//main Loop
vkQueueSubmit(graphicsQueue, ...) //draw command buffer

//Background loading thread
vkQueueSubmit(transferQueue, ...)//copy vertex command buffer

我打印了地址,graphicsQueuetransferQueue发现它们是相同的(相同的地址),所以看起来我的显卡只支持单个队列.所以现在我正在尝试同步vkQueueSubmit使用信号量的调用:

submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &queueSemaphore;

不幸的是,错误仍然是一样的.

所以我的问题是:如何正确地同步呼叫vkQueueSubmit



1> Nicol Bolas..:

你是在思考这个问题.

你有一个操纵对象的功能.并且您希望能够从同一对象上的多个线程调用该函数.但是通过该函数操作该对象不是线程安全的.因此,由您决定使其线程安全.

无论是Vulkan对象还是常规C/C++类型,解决方案都是相同的:您使用互斥锁.如果您的两个队列是相同的队列,则必须在每个线程调用的站点周围锁定互斥锁vkQueueSubmit.

不要让Vulkan的复杂性分散你对简单解决方案的注意力;)

但是,如果您的图形和传输队列相同,那么找到重构代码的方法可能会更好,这样您就不会尝试在不同的线程上提交不同的批处理.也就是说,使您的代码更适应硬件.

如果GPU提供了不同的传输队列,那么您的传输线程会生成传输CB并提交它们(同时将相应的信号量传递给图形提交线程,以便它可以在正确的时间等待).如果GPU没有明确的传输队列,那么您仍然可以在不同的线程上生成传输CB.但是,不是将信号量传递给图形线程,而是传递命令缓冲区.那些与下一个图形批次一起提交; 图形提交线程还可以在传输和图形操作之间插入适当的同步.


指示不清楚。GPU和CPU现在都着火了。
推荐阅读
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
手机用户2602905667
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有