定义
显式 API 是指开发者需要明确且详细地控制所有操作和资源管理的 API 设计方式。与之相对的是隐式 API,它会在底层自动处理很多细节。
Vulkan 显式 API 的特点
Vulkan 的 API 之所以被称为显式的,主要有以下几个特点:
-
内存管理:开发者需要显式地创建和管理内存分配。比如,你需要明确指定内存类型、大小,并手动处理内存的分配和释放。
-
命令缓冲区管理:你需要明确创建命令缓冲区、记录命令、提交命令。比如:
vkBeginCommandBuffer(commandBuffer, ...);
vkCmdDraw(...);
vkEndCommandBuffer(commandBuffer);-
同步控制:需要显式地指定资源依赖关系和同步点,使用清晰的屏障(barrier)和信号量(semaphore)来确保正确的执行顺序。
-
状态管理:没有隐式的状态转换,所有的管线状态都需要提前定义并显式设置。
与 OpenGL 隐式 API 的对比
这与 OpenGL 这样的隐式 API 形成对比。在 OpenGL 中,很多操作都有默认行为和自动状态管理。比如 OpenGL 会自动处理内存分配,而且可以随时改变渲染状态。
设计原因
Vulkan 选择显式 API 设计的原因是为了:
- 提供更好的性能预测性
- 减少驱动程序的复杂性
- 让开发者能够更精确地控制硬件资源
- 降低运行时开销
虽然这增加了开发的复杂度,但提供了更高的性能上限和更好的可控性。