Vulkan系列教程—VMA教程—Debugging
Posted 赵新政
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vulkan系列教程—VMA教程—Debugging相关的知识,希望对你有一定的参考价值。
文章目录
- 前言
- Debugging Incorrect Memory Usage
- 一、内存初始化(Memory initialization)
- 二、边距(Margins)
- 三、损坏检测(Corruption detection)
- 总结
前言
本文为Vulkan® Memory Allocator系列系列教程,定时更新,请大家关注。如果需要深入学习Vulkan的同学,可以点击课程链接,学习链接
Vulkan学习群:594715138
CSDN课程链接:《Vulkan原理与实战—铸造渲染核武器—基石篇》
腾讯课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》
网易课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》
Debugging Incorrect Memory Usage
如果你遇到了因为写入内存超出超出Allocation边界或者使用了没初始化的内存的一些Bug,你可以使用如下的特性来调试VMA。
一、内存初始化(Memory initialization)
如果你在程序中发现了不正确的或者随机的内存数据,那么你可能认为是内存没有初始化就被使用了,你可以启用内存自动初始化来修复它。为了使用自动初始化,你可以开启如下宏:
#define VMA_DEBUG_INITIALIZE_ALLOCATIONS 1
#include "vk_mem_alloc.h"
它会把内存内容初始化为 0xDCDCDCDC的序列。在Allocation销毁之前,内存中是充满了0xEFEFEFEF。在有必要的时候,内存是自动Map跟UnMap。
如果你在调试内存读取的时候,在回读的数据里发现了这些值,那么很有可能是没有对这块Vulkan内存初始化。
这种内存初始化,只会在HOST_VISIBLE类型的内存有用,它也会对专用内存有用。
二、边距(Margins)
默认情况下,Allocation在内存块中都是一个挨着一个来存储的,如下图所示:
在定义了VMA_DEBUG_MARGIN这个宏为某个非零值之后(比如16),就会强制在每一个Allocation前后加上一个内存边距(也就是多分配了一些),如下图所示:
如果你遇到了一个奇怪的内存Bug,然后加入边距之后发现Bug消失了,那么其有可能就是因为写入或者读取内存超出已有内存边界的情况。程序行为的变化也可能是由应用边距后,内存块之间分配的不同顺序和分布引起的(多种原因咯)。
在一个内存块中,会有很多的Allocation,边距首先会存在于Block的起始位置以及最后一个Allocation的屁股上,但是两个相邻的Allocation之间,只有一个边距内存。
边距只适用于从Block中分配的内存,而不适用于专用内存。也就是说不适用于 启用了VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT这个Flag的Allocation或者哪些VMA自动决策进行专用内存分配的Allocation(前面讲过自动决策)。内存边界对于使用了VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT内存分配算法的用户自定义内存池,也无法使用。
内存边距在JSON Dump中,会表现为空闲内存的一部分。
请注意,如果开启了内存边距功能,那么肯定会增加内存占用以及内存碎片。
三、损坏检测(Corruption detection)
你可以另外定义一个宏,VMA_DEBUG_DETECT_CORRUPTION为1,来开启对于边距内存内容的校验,从而可以知道是否读写超出了边界。
#define VMA_DEBUG_MARGIN 16
#define VMA_DEBUG_DETECT_CORRUPTION 1
#include "vk_mem_alloc.h"
当这个特性被开启的时候,那么每一块分配出来的边距内存,都会被填充如一个魔法数字(Magic Number)。内存在必要的情况下是自动Map以及UnMap的。
边距当中的魔法数字,会在对应的Allocation销毁的时候进行校验。如果它不是等于预期的魔法数字,那么VMA_ASSERT()就会被触发。这意味着GPU或者CPU端对这块内存进行了超出其边界的写入,也就是你的程序出了Bug!
你也可以明确的调用vmaCheckCorruption()来主动检测是否Allocation的边距已经遭到了破坏。在用户自定义内存池当中,你可以使用 vmaCheckPoolCorruption()来主动检测。
内存边距检测,只能够应用在HOST_VISIBLE 与 HOST_COHERENT都开启的内存上。
总结
以上就是今天的内容,大家对于vulkan的学习,也可以参考我出品的vulkan系列教程,下面给大家贴出链接。
腾讯课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》
网易课堂:《Vulkan原理与实战—铸造渲染核武器—基石篇》
CSDN课程链接:《Vulkan原理与实战—铸造渲染核武器—基石篇》
以上是关于Vulkan系列教程—VMA教程—Debugging的主要内容,如果未能解决你的问题,请参考以下文章