unity中的内存管理之对象池的使用

2016-07-25  本文已影响237人  半闲书屋半闲人

一、对象池的概念

对象池背后的理念其实是非常简单的。我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实例化一个新的对象。池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象。这样做的好处是优化了在增删对象时CPU的性能损耗,但是增加了内存对游戏对象的小部分存储性能。

二、对象池的使用实例

1、打方块游戏的运行效果介绍

打方块游戏的对象池使用,通过创建一个对象池来储存子弹,减少CPU对子弹预设体的增删。

下面贴出游戏的运行界面:

子弹预设体的数量显示:

子弹的预设体的数量如图所示,根据子弹产生的速度,只要子弹的对象池中有子弹游戏对象存在,已经创建的子弹都可以循环使用,当对象池中没有子弹对象时,或者子弹对象都在使用中,则再创建一个新的子弹对象。


2、编写子弹游戏对象池

分析子弹为游戏对象,为了方便存储其他的游戏对象(如砖块等),根据不同名字的游戏对象,我们将该集合对象池储存为字典型。相同名字的游戏对象储存在动态数组中,则Dictionar<string, ArrayList>,并将该对象池脚本设置为单例脚本。

贴出代码部分:

3、游戏场景的搭建

        层次视图中创建一个空物体命名为GameController,再创建一个平面Plane,置为GameController的子物体。

工程视图中创建如下图所示,material中是砖块的材质球,Texture中是砖块的贴图

贴图如下:

材质球设置如下,将tiling设置为0.5:

砖块预设体设置如下:

子弹预设体设置如下:

Resources中有三个脚本,如下:

Bullet脚本添加在子弹预设体上,GameController脚本添加在GameController上,ObjectPool为单例脚本不添加在任何游戏物体上。

Bullet脚本内容如下:

GameController脚本如下:

三、介绍一个对象池插件

          上文讲解了ObjectPool的基本原理及其实现。下面推荐一个更加成熟的插件——PoolManager该插件功能十分强大,所以才敢卖那么贵,30美刀...国内有位牛人已经写了一份不错的教程,有兴趣的童鞋可以参考下:Unity3D研究院之初探PoolManager插件

上一篇 下一篇

猜你喜欢

热点阅读