首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan用例-懒惰init VkObjects用例

Vulkan用例-懒惰init VkObjects用例
EN

Stack Overflow用户
提问于 2020-12-16 12:39:16
回答 1查看 86关注 0票数 1

当您正在编写一些基本Vulkan对象(如VkDeviceVkSemaphoreVkImage等)的包装器时,是否有一些典型的用例(比如在使用OpenGL时),您真的希望使用延迟初始化,而不是直接在构造函数中调用vkCreateDeviceVkCreateSemaphoreVkCreateXyz,但是在以后的一些创建/init方法中?

EN

回答 1

Stack Overflow用户

发布于 2020-12-16 13:28:40

延迟初始化通常用于“阻止”执行某些活动,直到实际需要为止(这可能永远不会)。对于创建方法,似乎几乎没有什么好处--如果您创建的东西通常是您想要的,那么如果有什么问题(而不是稍后的执行过程),就会立即失败。

但是,这种方法对于调用Vulkan API方法的访问器非常有用,这些方法可能被应用程序使用,也可能不被应用程序使用,例如,物理设备的属性:

代码语言:javascript
复制
private VkPhysicalDeviceFeatures features;

public VkPhysicalDeviceFeatures features() {
    if(features == null) {
        features = new VkPhysicalDeviceFeatures();
        vkGetPhysicalDeviceFeatures(handle, features);
    }
    return features;
}

这比强制从Vulkan检索特性作为构造函数的一部分要好,如果需要的话,结果可以缓存(如上面所示),而代价是额外的复杂性。

编辑:一个更好的例子可能是设备内存属性或类似的特性,通常在创建逻辑设备时会立即使用这些特性。

对于通过VkCreateXXX方法创建的对象,我建议使用构造函数和静态工厂方法。单元测试将使用构造函数(通常以某种方式受到保护),而应用程序则调用工厂。

例如(伪码):

代码语言:javascript
复制
class LogicalDevice {
    public static LogicalDevice create(PhysicalDevice parent) {
        // populate VkDeviceCreateInfo with required extensions, layers, queues, etc
        vkCreateDevice(...);
        return new LogicalDevice(...);
    }

    LogicalDevice(Handle handle, PhysicalDevice parent, ...) {
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65323454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档