上一篇具体介绍了几种常见的游戏服务器的CPU架构模型([立即转到])。服务器的CPU架构处理了服务器端数据运算的能力,实现了服务器端的数据资源访问修改的具体功能。但是如果内存架构不好或者内存泄漏,都会让游戏体验大大降低,并且给运维造成一定的困难。本篇将继续介绍游戏服务器的内存架构的几种常见模型。
一、采用动态内存分配
对一个新进入游戏的玩家来说,他的数据应当是在服务器中一直存在的,同时,当他退出游戏时,服务器中有关这个玩家的数据的内存应当被释放掉。所以我们就要不断的给新来的玩家new/delete对象。这样子做是非常难控制的,因为我们并不知道在何时会释放掉他的资源,一旦对堆的控制出现了问题,整个服务器就会挂掉;更不用说有大量玩家涌入游戏时的问题了,服务器的资源会被一直占用直到人工重启服务器。针对这个问题,常见的解决方法是采取对象树的方式,使用new/delete一个主要类型的对象,其他对象都作为其成员存在,对象只需要管理好自己的成员就可以。
二、采用预内存分配
当我们能够很好的使用动态内存分配时,能够很大程度的发挥内存的作用。但是一个游戏业务通常使用大量的数据结构,变化很大,这就使得动态内存分配管理容易出现问题。所以就会使用预内存分配。服务器启动后,将提供一个预先分配好的内存池,服务器运行时,不出现new关键字,那么就会方便我们对内存的管理,有效减少动态分配时带来的性能消耗和内存泄漏出现的概率。因为整个内存池都是预先分配出来的,每个用户对象都交给内存池进行管理,内存池的大小决定了服务器承载用户量的能力,方便了运营的维护。如果硬件方面达不到需求的时候,服务器无法启动,那么部署服务器就出现了困难,而且所有用到的类对象需要在根对象中包含一个引用或者指针,否则也会产生内存泄漏,指针指向的内存不能使用new关键字,只能是现成的成员,所以维护问题也会因为类的成员属性过多而加大。解决的办法是内存池采用动态内存分配的方式,让内存池动态增长同时有增长的上限,对于从内存池获取的对象使用new关键字。