本篇文章主要介绍了"给虚幻4添加内存跟踪功能",主要涉及到方面的内容,对于软件工程感兴趣的同学可以参考一下:
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/d...
本文章由cartzhang编写,转载请注明出处。 所有权利保留。
文章链接:http://blog.csdn.net/cartzhang/article/details/50524317
作者:cartzhang
本篇译文同发与蛮牛译馆,
地址:http://www.manew.com/thread-46327-1-1.html?_dsign=ae91354a
从我上次谈论内存申请和跟踪已经有一段时间了。我得抽出时间来在虚幻4上实现跟踪,并且已经完成了。我假设你已经阅读过来之前的博客:“虚幻引擎4中内存跟踪功能的局限性”和“内存申请和跟踪”。
虚幻引擎4内存管理的API
基本的内存分配方法。
虚幻引擎4中,有三种基本的内存分配和释放方法:
1.使用GMalloc指针。这种方法是获得全局的分配器,分配器的使用依赖于GCreateMalloc()函数。
2.FMemory函数。有静态函数比如:Malloc(),Realloc(),Free()。他们也是使用GMalloc来申请内存,但是在此之前,它会在每次allocation, reallocation或free之前检查GMalloc 是否定义。若GMalloc 是空,就调用GCreateMalloc() 。
3.全局的的New和delete操作。缺省情况下,只在模块的ModuleBoilerplate.h 的文件中定义,也就是说,很多调用new和delete的操作不在虚幻4的内存系统中管理。重载操作实际上调用的是FMemory函数。
这些情况就会出现使用这些机制就可能出现内存不会释放和清空的问题。为了扑捉这些问题,我提交了一个申请,已经被整合并发布在版本4.9上,通过C运行时库调用_CrtSetAllocHook()来获取这些分配。其中一个例子,是引擎中Zlib集成并没有使用引擎工具来分配,它使用了_CrtSetAllocHook() ,我提交了一个修复版本在4.9版本发布。
直接调用GMalloc 和FMemory 函数这两个基础的API,如下:
virtualvoid* Malloc( SIZE_T Count, uint32 Alignment = DEFAULT_ALIGNMENT ) = 0;
virtualvoid* Realloc( void* Original, SIZE_T Count, uint32 Alignment = DEFAULT_ALIGNMENT ) = 0;
virtualvoid Free( void* Original ) = 0;
These are the places that would need to be modified if we want to add any new piece of data per allocation.
引擎的整合
为了写法类似,我重载了分配器,我从FMalloc继承了一个新类,叫做FMallocTracker,这样就可以勾到虚幻的内存分配系统上。因为一个有效的分配器必须在创建FMallocTracker 实例时所有实际的分配已经由其分配器完成。FMallocTracker 只是保存了跟踪信息。但是这是不够的,实际上需要知道分配器所有方法来跟踪数据。因此,第一步就是当我们使用内存跟踪功能时,修改分配器函数。