我们在使用PIX For Windows分析UE 5.3.2的内存时发现一个非常奇怪的问题。

我们在使用PIX For Windows分析UE 5.3.2的内存时发现一个非常奇怪的问题。

使用**-ansimalloc**启动游戏,在一个静态场景加载完之后,PIX显示FFileIoStore::GetCompletedRequests()中下图申请的内存有泄露:

[Image Removed]

为此我在这里和Free的地方加了日志,打印申请和释放时的大小、内存地址段:

[Image Removed]

[Image Removed]

跑测下来发现日志中Malloc/Free都是成对的,并没有泄露的情况。看了引擎FMallocAnsi的实现也没什么特别,都是非常正常的系统调用。

然后我自己写了个简单的C++ Console项目,在其中用多个线程申请/释放内存(malloc/free),再用PIX分析结果是正常的,没有上面这种误报。

请问是UE有什么隐藏的机制导致这种情况发生吗?

补充一个问题:precache带来的冗余编译比较严重,我做过测试关掉后编译耗时和数量都有非常明显的下降(trunk开启precache,trunk_new关掉了)

[Image Removed]

Hi,

你好,如果地址是成对的,应该能说明不存在泄露,也许是系统层做了类似cache的工作?Ansi应该就只是调用系统的分配器,没有做什么额外的事情。

关于precache,有冗余编译我们是有预期的,它的作用主要是提前编译好可能用到的pso,可能比实际用到的多2到3倍,但它的好处是,它只预测当前加载到的资源所需的pso,而不是需要把游戏从头到尾收集到的pso都提前编译,可以减少启动的时间,同时尽量避免在游戏内有实时编译pso的情况。