美文网首页
阅读《游戏引擎架构》(五)

阅读《游戏引擎架构》(五)

作者: mx乐乐 | 来源:发表于2016-12-26 02:21 被阅读85次

内存管理

游戏程序员总希望把代码变得更快。任何软件的效能,不仅受算法的选择和算法编码效率所支配,程序如何运用内存(RAM)也是重要因素。
以malloc( )或C++的全局new运算符进行动态内存分配,是非常慢的操作。要提升效能,最佳方法是尽量避免动态内存分配,不然也可利用自制的内存分配器来大大减低分配成本。
当然,任何游戏引擎都无法完全避免动态内存分配,所以多数游戏引擎会实现一个或多个定制分配器。
定制分配器能享有比操作系统分配器更优的性能特征,原因有二。第一,定制分配器从预分配的内存中完成分配请求(预分配的内存来自malloc( ) 、new,或声明为全局变量)。这样放,分配过程都在用户模式下执行,完全避免进入操作系统的上下文切换。第二,通过对定制分配器的使用模式做出多个假设,定制分配器便可以比通用的堆分配器高效的多。

1.基于堆栈的分配器

堆栈分配器是非常容易实现的。我们要分配一大块连续内存,可简单的使用malloc( ) 、new。另外安排一个指针指向堆栈的顶端,指针以下的内存是已分配的,指针以上的内存是未分配的。对于每个分配请求,仅需要把指针往上移动请求所需的字节数量。要释放最后分配的内存块,也只需要把指针向下移动该内存块的字节数量。
通常堆栈分配器的接口类型类似这样:

class StackAllocator
{
public:
    // 堆栈标记:表示堆栈的当前顶端
    // 用户只可以回滚至一个标记,而不是堆栈的任意位置
    typedef U32 Marker;

    // 给定总大小,构建一个堆栈分配器
    explicit StackAllocator(U32 stackSize_bytes);

    // 给定内存块大小,从堆栈 顶端分配一个新的内存块
    void* alloc(U32 size_bytes);
    // 取得指向当前堆栈顶端的标记
    Marker getMarker();

    // 把堆栈回滚至之前的标记
    void freeToMarker(Marker marker);

    // 清空整个堆栈(把堆栈归零)
    void clear();
private:
    //  .......
};```


![向堆栈分配,以及释放至一个标记](https://img.haomeiwen.com/i915770/db206971d4740170.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

未完待续......

相关文章

  • 阅读《游戏引擎架构》(五)

    内存管理 游戏程序员总希望把代码变得更快。任何软件的效能,不仅受算法的选择和算法编码效率所支配,程序如何运用内存(...

  • 阅读游戏引擎架构

    通过malloc()/free()或C++的全局new/delete运算符动态分配内存——又称为堆分配——通常是非...

  • 阅读《游戏引擎架构》

    最近开始读《游戏引擎架构》这本书。这绝对是一本值得所有游戏开发人员都拥有的书籍。 首先译者在行业内大名鼎鼎,又有云...

  • 阅读《游戏引擎架构》(二)

    游戏引擎是什么 引擎的三个特性:数据驱动,可复用,可扩展。 类型第一人称精细而超现实的效果,对于技术要求最高。高效...

  • 阅读《游戏引擎架构》(四)

    对象的内存布局 在class和struct中,编译器不会把数据程序员紧凑的包裹在一起,因为每种数据都有其天然的对齐...

  • 阅读《游戏引擎架构》(三)

    运行时引擎架构 上图显示了一个典型三维游戏引擎的主要运行时组件。 简单文字复述一下这个图: 首先是Engine以外...

  • 《游戏引擎架构》PDF高清完整版-免费下载

    《游戏引擎架构》PDF高清完整版-免费下载 《游戏引擎架构》PDF高清完整版-免费下载 下载地址:网盘下载 备用地...

  • 游戏引擎架构

    还记得刚开始上班的第一天,手里抱着DirectX相关的几本书,准备好好学习一下关于哪些炫酷画面的单机游戏是如何做出...

  • 游戏引擎架构

    不用说,一图胜千言!

  • 《游戏引擎架构》概述

    真希望能早些看到此书:在介绍各个知识点之外,更重要的是将相关的知识点给整合了起来,形成了一种框架感。比如Unity...

网友评论

      本文标题:阅读《游戏引擎架构》(五)

      本文链接:https://www.haomeiwen.com/subject/hcodvttx.html