zoukankan      html  css  js  c++  java
  • 《Game Engine Architecture》学习笔记内存管理1

    内存管理

    内存使用效率和两个东西有关:

    1,同过new,malloc操作进行动态内存分配很慢,尽量避免,可以通过使用传统内存分配来减少分配开销。

    2,CPU处理连续的内存区域比处理离散的内存区域要快。所以为了提高效率,要对内存碎片进行处理。

    通过这两条路线来优化内存管理代码。

    1.优化动态内存分配

    通过malloc()和new()等进行动态内存分配是基于堆的。典型的非常慢。

    因为:

    1)堆是一个通用存储区域,它被控制来可以分配任何大小的内存,使得malloc,new等函数需要更多的上层管理。导致了缓慢。

    2)使用malloc,new等函数时系统首先会进行环境切换,切换到核心模式处理内存分配申请,然后又切换会程序,这样的环境切换也增加了开销。

    下面是一条约定俗成的游戏开发内存分配规则:

    keep heap allocation to a minimun,and never allocate from the heap within a tight loop.

    尽量少的使用malloc和new 等基于堆的动态分配,更不要在一个紧密的循环里面使用。

    当然,没有任何游戏引擎避开了动态内存分配,所以绝大部分的游戏引擎都有自己的一个或者多个内存分配器。一个自己的内存分配器在刚刚提到那两点上有比操作系统更好的Heap分配器性能。第一,一个自己的内存分配器可以安全的访问一块被分配好的内存(她自己通过malloc()或者new或者已经声明的全局变量)。这样可以允许这些访问在user mode下以及避免了开销昂贵的操作系统上下文切换。第二,对于各种内存使用模式处理上,一个自定义的内存分配器也比一个通用的Heap内存分配器更有效率。

    有几种形式的传统分配器:

    1)基于栈的分配器,双向栈。

    2)内存池(通常用于同样尺寸的多段内存)

    3)线性分配器

    4)单帧,双帧内存分配器(用于只在一帧或者两帧中使用的临时数据,每一帧的开始时需要clear)

  • 相关阅读:
    [Go] 写文件和判断文件是否存在
    [日常] 解决github速度特别慢
    [Go] imap收信非并发
    [Linux] 使用secureCRT实现SSH隧道服务器端口转发到本机内网穿透
    [Linux] 解决nginx: [emerg] directive "rewrite" is not terminated by ";"
    [MySQL] 解决Error 1698: Access denied for user 'root'@'localhost'
    [Go] gocron源码阅读-判断是否使用root用户执行
    [日常] 前端资源测试机上忽略版本号的的nginx配置
    [Go] 使用go mod安装beego
    [Go] tcp服务下的数据传递
  • 原文地址:https://www.cnblogs.com/wonderKK/p/2283846.html
Copyright © 2011-2022 走看看