gpt4 book ai didi

c++ - 在 C++ (Vulkan) 中处理 C 代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:35 29 4
gpt4 key购买 nike

我正在尝试使用基于 Vulkan 的 C++ 编写渲染引擎。 Vulkan 是用 C 语言编写的,因此它有一些有趣的约定。

我在 Vulkan 应用程序的教程/代码片段中看到的一个反复出现的模式是,大多数代码都在一个非常大的类中。 (现在我的 vulkan 类也已经有大约 2000 行)。但是为了制作一个合适的渲染引擎,我需要将我的代码划分到一定程度。

前面提到的一个有趣的地方是它有一个叫做逻辑设备的东西,它是对显卡的抽象引用。

它无处不在,以下列方式创建和分配事物:

  1. 使用创建信息创建结构
  2. 创建代码将输出到的变量
  3. 调用实际的vkCreateSomething或vkAllocateSomething函数,传入逻辑设备,创建信息和对要输出到的变量的引用,并检查它是否成功。

就其本身而言,我认为这种风格没有任何问题。只是它在 OOP 中一点用处都没有,因为它依赖于随处可用的逻辑设备。

我该如何处理这个问题?服务定位器和单例被许多人认为是糟糕的解决方案(我能理解),所以这似乎是我宁愿避免的事情。

是否有处理此问题的设计模式?

最佳答案

逻辑设备是一个实际的依赖。

它有状态,并且它的状态需要与硬件一起使用。

您可以将它用作您的操作的参数,一个存储在几乎每个类中的值,一个全局的,或一个单子(monad)式的“最终”参数,其中每个操作只返回仍然需要设备运行的东西。您可以将它的(指针/引用)替换为返回它的(指针/引用)它的函数。

考虑一下纯 OOP 是否是您想要做的; vulkan 和渲染更多的是关于操作而不是被操作的东西。我想混合一些函数式编程模式,这使得类似 monad 的选择更加合理。

在缓冲区/数据上组合操作。这些返回操作,也需要缓冲区和数据。组合操作指定哪些参数是新输入,哪些是下一步使用的。这样做你可以(在编译时)设置一个类型安全的工作图,所有这些都不需要运行任何东西。

由此产生的组合操作将有一个设置(你绑定(bind)逻辑设备和任何你可以在你需要准备好昂贵的缓冲区之前“尽早”做的事情)和一个执行阶段(你给它提供昂贵的缓冲区并生成输出)。

或者作为另一种方法,从 中找到支持协程的编译器并在程序上异步编写它。

关于c++ - 在 C++ (Vulkan) 中处理 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46645069/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com