TAG / 游戏引擎

游戏引擎设计 之 内存管理框架

内存管理对于大型游戏来说是至关重要的一环,这里我们所说的“内存”指的是动态分配的内存。一个好的内存管理框架,能显著提升程序执行效率,也能大大提高内存问题的调试效率。所以,我们设计内存管理框架时必须能够满足以下两大需求:

  1. 自定义内存分配器
  2. malloc/free(包括间接由new/delete等调过来的)等函数本身的开销其实并不大,但由于其功能太过基础了,没有任何策略可言,从而导致反复分配释放带来的开销、大量内存碎片以及多线程内存分配引起的效率问题。所以自定义一个高效的内存分配器就显得必不可少了,对于一般情况,我们可以使用 nedmallocjemalloc 等第三方多线程内存分配器,也可以根据具体需求自己实现一套(例如 Nebula3 中的内存池以及 Heap 对象机制),甚至是基于栈的动态内存分配。而具体的内存分配/释放策略是另一个话题了,以后新开一篇讨论。

  3. 内存统计及内存泄漏跟踪
  4. 虽然 CRT 有 dump 内存泄漏的功能,但最大的问题就在于——仅限于 DEBUG 环境下,而游戏由于其实时计算的复杂性,在后期很多情况下开 DEBUG 模式已经无法满足正常调试的需求了,所以 Release with debug info 模式其实才是我们更常用的,这样我们就必须自己实现内存统计及泄漏跟踪的功能,甚至提供对动态内存泄漏(运行时大量已无用的内存未释放,直到游戏退出时才一并释放,最常见的就是由智能指针引起的动态内存泄漏)的检查。

CONTINUE READING »