unity 4.7.1f1
MemoryPool主要是对内存分配的碎片化和频繁分配和释放进行优化。
结构
MemoryPool的设计结构如下:
1 |
|
这里解释下里面的结构布局:
这里有个巧妙的设计就是Bubble分配了一块内存,这块内存会被分成几个指定的Block。这些Block在没有分配给用户使用的时候每个Block的首部4字节会存储下一个Block的首部地址,对于第一个Block的首部地址就单独用一个4字节的成员变量保存,就像一个链表一样。这样就不需要另外在用其他变量去保存每个Block的地址。
分配
每次用户请求内存的时候,固定给用户返回一个Block,这里有一个限制就是用户不能一次请求大于Block大小的内存。具体如下:
1 |
|
通过上述操作就可以分配一块新的可用的内存,当用户申请内存的时候直接返回给用户一个Block的地址即可:
1 |
|
分配内存给用户的时候会有两个问题。
- 分配内存给用户的时候必须限制用户最大分配Block大小的内存,否则返回NULL。
- 因为分配的这个Block是在一个大块的连续的Bubble内存中,如果Block不是Bubble中最后一块内存,那么用户越界的话不会产生错误,但是会把下一个Block的数据给覆盖的问题。
释放
1 |
|