当您正在编写一些基本Vulkan对象(如VkDevice、VkSemaphore、VkImage等)的包装器时,是否有一些典型的用例(比如在使用OpenGL时),您真的希望使用延迟初始化,而不是直接在构造函数中调用vkCreateDevice、VkCreateSemaphore、VkCreateXyz,但是在以后的一些创建/init方法中?
发布于 2020-12-16 13:28:40
延迟初始化通常用于“阻止”执行某些活动,直到实际需要为止(这可能永远不会)。对于创建方法,似乎几乎没有什么好处--如果您创建的东西通常是您想要的,那么如果有什么问题(而不是稍后的执行过程),就会立即失败。
但是,这种方法对于调用Vulkan API方法的访问器非常有用,这些方法可能被应用程序使用,也可能不被应用程序使用,例如,物理设备的属性:
private VkPhysicalDeviceFeatures features;
public VkPhysicalDeviceFeatures features() {
if(features == null) {
features = new VkPhysicalDeviceFeatures();
vkGetPhysicalDeviceFeatures(handle, features);
}
return features;
}这比强制从Vulkan检索特性作为构造函数的一部分要好,如果需要的话,结果可以缓存(如上面所示),而代价是额外的复杂性。
编辑:一个更好的例子可能是设备内存属性或类似的特性,通常在创建逻辑设备时会立即使用这些特性。
对于通过VkCreateXXX方法创建的对象,我建议使用构造函数和静态工厂方法。单元测试将使用构造函数(通常以某种方式受到保护),而应用程序则调用工厂。
例如(伪码):
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, ...) {
}
}https://stackoverflow.com/questions/65323454
复制相似问题