我应该为 Vulkan 核心使用面向对象的工作流吗?
Should I use an Object Oriented workflow for Vulkan core?
尽管是用 C++ 编写的,但 famous vulkan tutorial 将所有内容都集中在一个 class 中,函数使用 class 成员,如全局对象。我理解为什么这样的教程不强制执行面向对象的工作流程以专注于 API 机制并让引擎程序员设置他们自己的工作流程。但即使是 CLion 也抱怨 600 行的文件太复杂而无法分析。
所以我的问题是,面向对象的布局是否适合 Vulkan 样板文件?也许一旦您设置了所有组件,最好将它们隐藏在文件中并仅使用更高级别的东西,例如网格和材质。
如果是这样,是否有 classic 布局或多或少地在实现中使用?
到目前为止,我能够将有关设备的功能(选择、逻辑设备和交换链创建、表面格式和交换(当前模式和范围)选择、队列族和内存查找以及其他设备相关功能)放在一个单独的文件,但不在 class 中,验证层也有自己的文件。最后,我创建了一个 Buffer class,它继承了 Index、Vertex、Staging 和 Uniform 缓冲区。
我发现 this repo 据我了解,在我所在的级别(统一缓冲区),工作流分为缓冲区、调试、设备、帧缓冲区、初始化程序和交换链。 这是 classic 工作流程还是有其他方法?
Vulkan 相对于 OpenGL 有利有弊,它不是替代品。 Khronos 正在积极开发这两个库,并将继续这样做。
缺点很明显:Vulkan 甚至做一些基本的事情都比较冗长。从调整 window 的大小需要重建所有(大多数)对象,到极其有限的活动句柄数量(因此需要缓冲区打包),每个设备的多个队列的手动同步(使用单队列设备的特殊代码),一切非常艰苦地完成,没有安全网。同步太少很容易破坏缓冲区,同步太多则完全破坏性能。
现在是专业人士。为什么使用 Vulkan 而不是 OpenGL?好吧,您使用 Vulkan 是因为您可以构建和使用您需要的东西。不需要深度缓冲?不要创建一个。不需要模板缓冲区?不要创建一个。不需要处理大小调整 windows?不要支付处理它们的费用。不想要运行时可更新缓冲区?创建静态缓冲区,无需支付费用即可更新它们。
Vulkan 强烈推动您创建您需要的那种引擎,而不是可以处理所有事情的通用引擎。将它推到那个程度,您只需在 Vulkan 之上构建 OpenGL,并获得 none 它的性能优势,同时继承使用它的所有困难。
这就是你的答案。 OOP 不应该在这里真正进入等式,您构建一个整体渲染引擎,它完全可以完成您需要它做的事情,仅此而已。
尽管是用 C++ 编写的,但 famous vulkan tutorial 将所有内容都集中在一个 class 中,函数使用 class 成员,如全局对象。我理解为什么这样的教程不强制执行面向对象的工作流程以专注于 API 机制并让引擎程序员设置他们自己的工作流程。但即使是 CLion 也抱怨 600 行的文件太复杂而无法分析。
所以我的问题是,面向对象的布局是否适合 Vulkan 样板文件?也许一旦您设置了所有组件,最好将它们隐藏在文件中并仅使用更高级别的东西,例如网格和材质。
如果是这样,是否有 classic 布局或多或少地在实现中使用?
到目前为止,我能够将有关设备的功能(选择、逻辑设备和交换链创建、表面格式和交换(当前模式和范围)选择、队列族和内存查找以及其他设备相关功能)放在一个单独的文件,但不在 class 中,验证层也有自己的文件。最后,我创建了一个 Buffer class,它继承了 Index、Vertex、Staging 和 Uniform 缓冲区。
我发现 this repo 据我了解,在我所在的级别(统一缓冲区),工作流分为缓冲区、调试、设备、帧缓冲区、初始化程序和交换链。 这是 classic 工作流程还是有其他方法?
Vulkan 相对于 OpenGL 有利有弊,它不是替代品。 Khronos 正在积极开发这两个库,并将继续这样做。
缺点很明显:Vulkan 甚至做一些基本的事情都比较冗长。从调整 window 的大小需要重建所有(大多数)对象,到极其有限的活动句柄数量(因此需要缓冲区打包),每个设备的多个队列的手动同步(使用单队列设备的特殊代码),一切非常艰苦地完成,没有安全网。同步太少很容易破坏缓冲区,同步太多则完全破坏性能。
现在是专业人士。为什么使用 Vulkan 而不是 OpenGL?好吧,您使用 Vulkan 是因为您可以构建和使用您需要的东西。不需要深度缓冲?不要创建一个。不需要模板缓冲区?不要创建一个。不需要处理大小调整 windows?不要支付处理它们的费用。不想要运行时可更新缓冲区?创建静态缓冲区,无需支付费用即可更新它们。
Vulkan 强烈推动您创建您需要的那种引擎,而不是可以处理所有事情的通用引擎。将它推到那个程度,您只需在 Vulkan 之上构建 OpenGL,并获得 none 它的性能优势,同时继承使用它的所有困难。
这就是你的答案。 OOP 不应该在这里真正进入等式,您构建一个整体渲染引擎,它完全可以完成您需要它做的事情,仅此而已。