Vulkan系列教程—VMA教程—Debugging

Posted 赵新政

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vulkan系列教程—VMA教程—Debugging相关的知识,希望对你有一定的参考价值。

文章目录


前言

本文为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_VISIBLEHOST_COHERENT都开启的内存上。

总结

以上就是今天的内容,大家对于vulkan的学习,也可以参考我出品的vulkan系列教程,下面给大家贴出链接。

腾讯课堂《Vulkan原理与实战—铸造渲染核武器—基石篇》

网易课堂《Vulkan原理与实战—铸造渲染核武器—基石篇》

CSDN课程链接《Vulkan原理与实战—铸造渲染核武器—基石篇》

以上是关于Vulkan系列教程—VMA教程—Debugging的主要内容,如果未能解决你的问题,请参考以下文章

Vulkan系列教程—VMA教程—用户数据

Vulkan系列教程—VMA教程—用户数据

Vulkan系列教程—VMA教程—用户数据

Vulkan系列教程—VMA教程—Debugging

Vulkan系列教程—VMA教程—Debugging

Vulkan系列教程—VMA教程—Debugging