其实一直很想写博客,但总是以为自己没有时间,今天和女友在学校图书馆看书,无意看到一个技术大牛作的序,从大学开始坚持写技术博客,把自己的所想所获记录下来,现在觉得确实是一种自我提高的有效方式,所以今天终于痛下决心,刚从健身房回到宿舍,便静下心来思忖自己的第一篇博客。由于最近在摸索Unity3D的游戏开发,在学习制作一款FPS射击游戏时,接触到了缓存池(也称对象池)的使用,今天就把自己的所想所获与大家分享。
至于为什么会有缓存池这种东西存在,自然是以节省内存开销的目的。说通俗点,缓存池技术一般应用于实例化物体的过程中,Unity一般实例化物体会使用Instantiate()函数,销毁游戏物体一般使用Destroy()函数,频繁使用这两个函数会造成较大的内存占用,这时有一种技术,假设有一个水池,里边提前存放好游戏要用到的物体,当游戏不需要时,这些物体隐藏在水池里,当游戏需要时,这些物体就显示出来,这就是缓存池技术。
Asset Store中提供了多种缓存池插件,个人用到的时Pool Boss,感觉还是比较好用的。当然Pool Boss集成在Core GameKit插件中,售价是25$,作为一个学生党仍然是感觉比较贵的,因此想办法单独下载了Pool Boss来使用,个人使用的版本是1.1.4,当然各位大佬完全可以选择Asset Store提供的插件,本人也很想知道那个版本有什么强大的功能。
在我所学习制作的FPS射击游戏中,在当主角枪支发射的射线与敌人挂载的碰撞体发生接触,触发粒子特效时,这里用到了缓存池技术。将Pool Boss包导入,把PoolBoss预制体拖曳到Hierarchy层级面板,这样在Inspector视图里可以看到其所搭载的插件,把需要缓存的粒子预制体拖入黄色方框,其中Preload Qty决定了缓存的粒子数目,Allow Instantiate More也可以勾选,表示需要缓存的最大粒子数目,这个地方可以自己设置。这样在程序运行时可以实时监测粒子的产生和回收数目。
相关代码如下:
(1)把Instantiate()函数替换成:
DarkTonic.PoolBoss.PossBoss.Spawn("FX",my_transform.position,my_transform.rotation,null);
(2) 把Destroy()函数替换成:
DarkTonic.PoolBoss.PoolBoss.Despawn(this.transform);
另外不足:
自己在对粒子和子弹这类物体进行测试,效果良好,但是在敌人的产生测试中,效果不理想,缓存池没有进行有效回收,暂时还不知道主要原因是什么;还有一种动态加载的技术,本人还没有深入研究。
自己的第一篇技术博客就这样诞生了,感谢女友激发的灵感,立个flag:争取每两天更新一下,一段时间后看看自己的成长。当然其中自然有很多不足之处,还请各位大牛批评指正,小生一定虚心接受教诲。