文章仅记录部分内容作为笔记,对视频感兴趣的可见下面链接的原视频:
https://gameinstitute.qq.com/course/detail/10119
课程目录:
【第一章】内存
- 游戏机内存演化历史
- 游戏引擎内常用的内存分配器介绍
- 面向数据的设计方法
- Entity Component System
【第二章】多线程
- 主渲染线程结构
- 任务系统
正文:
一、内存
游戏的性能优化从哪出发?从内存的使用效率上出发的。
1.1 游戏机捏村演化历史
略
1.2 游戏引擎内常用的内存分配器介绍
- Malloc/Free
支持任意尺寸内存分配
Free开销远远大于申请开销
绝 大多数的实现依赖Global Mutex(如果说是多线程的程序,频繁的申请释放内存,会发现你的性能并没有随着多核而SCALE)
容易造成内存碎片
- Linear,Stack Allocator
Linear Allocator(线性分配器):
申请=线性增长
释放=do nothing
特定时间重置
典型应用场景:每帧生成的渲染状态数据,每帧送给GPU骨骼动画数据
好处:非常容易支持Lockfree ,效率极高--只需要一个index递增操作
Stack Allocator(栈分配器)
实现类似线性分配器
LIFO by marked positions
典型应用场景:关卡资源加载
好处:性能类似线性分配器,可以按需进行释放,可以作为其他allocator的back allocator
- Freelist Allocator
用链表的方式管理的连续内存
申请/释放复杂度O(1)
缺点:连续申请返回的内存不连续,通常是固定尺寸
典型应用场景:粒子特效缓冲池
- Buddy Allocator
支持2^n大小的内存
自动合并相邻内存
应用场景:可能会持续多帧,GPU上的内存管理
- Handle Based Allocation
略
1.3 面向数据的设计方法
- 对采用面向对象设计的系统的优化方法
略
- Entity Component System