cocos2d 缓存池 对象重复使用

1.缓冲池简单描述

我们知道一个游戏比如跑酷类型的游戏,游戏元素会不断重复。游戏元素会不断从屏幕右边创建出来,当一个元素移出左边屏幕时,又会消失掉。如果不断地new 对象,release 对象 会有性能影响。如何优化呢?就涉及到缓存池的概念。

再举一个例子:一个主角在一个竞技场中不断杀怪。每次有5个怪出现,杀死一个又会出来一个。每次出怪就new 怪,死亡怪就release怪,会很浪费的。已经死亡的怪,我们简单地给他补满血不就可以重复使用了嘛!像拍电影,一个人不是真正死亡,只是看起来死了,还是可以重复使用的嘛!

2.缓存池简单实现

我们可以事先new10个怪放入到一个数组中,简单把这个数组称作缓存池,其实就是一个数组。再搞个int的变量表示取数组中第几个怪,初始化为0,表示取第一个怪。

1.当我们想要从屏幕中创建一个新怪时,不去new,而是用那个int变量从数组中取一个怪拿来用,当然拿来用之后,还要简单的初始化下,给他补满血啊,穿上完整衣服等等。再把int变量加1,如果int变量等于数组的长度时,把它归0。

2.当一个怪被主角杀死时,让这怪播完死亡动画后,就remove掉,但不把他完全release掉。

差不多实现就是这样,简单吧!只是注意初始缓存池,new对象的数量。一般要大于你实际使用的数量。

3.简单代码

//创建缓存池
Vector bonePools;
void createBonePools(){

    if(bonePools.empty()){
        for(int i = 0; i < 30; ++i){
            auto oneBone = Bone::create();
            bonePools.pushBack(oneBone);
        }
    }
}

//从缓存池中取一个对象
int _boneIndex;
Bone* getOneBone(){
    if(_boneIndex == bonePools.size()){
        _boneIndex = 0;
    }
    Bone* result = bonePools.at(_boneIndex);
     result->reuseInit();//这个比较重要,重复使用一个元素也要简单初始化一些东西的,之前死亡的人物记得给他补满血
    ++_boneIndex;
    return result;
}

cocos2d 缓存池 对象重复使用

时间: 2024-10-24 05:18:53

cocos2d 缓存池 对象重复使用的相关文章

iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)

一个瀑布流的实现有三种方式: 继承自UIScrollView,仿写UITableView的dataSource和delegate,创造一个缓存池用来实现循环利用cell 写多个UITableview(UITableView的cell宽度是与UITableView宽度一样的,那么每行可以摆设多个宽度相等的UITableView,从而实现瀑布流),不过这种方法是最差的,因为不能有效的做到循环利用cell 可以自定义UICollectionViewCell的布局,从而实现瀑布流,UICollectio

定长单元的批次内存缓存池的简洁实现

问题描述: 1.内存管理计算机编程中一个基本问题,其目的在于: 1)一次可分配多个单元块,缓存维护,以改善反复的小对象申请的性能开销: 2) 管理以分配的内存,有效减少碎片的产生: 3) 保证软件使用的内存透明,了解峰值,了解使用情况,便于优化查错: 2.常用的内存管理机制有以下: 1) 变长块,依靠链表维护,一个节点一块申请了的内存,内存块大小不等,等接到一个申请时,先查维护的链表,若有可从链表取出.这种方法有很多缺点:1,当申请的内存块要遍历链表节点找到大小合适的块,最坏情况下需要把链表所有

tableView循环引用以及缓存池中的两个常见Bug

一.直接看Bug:unable to dequeue a cell with identifier cell_id - must register a nib or a class for the identifier or connect a prototype cell in a storyboard 二.使用tableView的cell重用机制后cell中不显示detailTextLabel. * *  本文中大量涉及tableView的重新引用机制 *  在tableView上下滑动的时

自定义adapter的基础上Listview优化方案以及几个小错误(checkbox吃掉点击事件以及对象重复问题)

每次adapter运行都有一个getcount,有多少条就调用多少次getview,就会解析多少次xml文件(创建view,条数多了很消耗时间),13年谷歌提出了一个机制,每次只缓存一屏幕多几个,把划出屏幕外的listview回收(用的convertView),只要修改里面的值就可以重新用不用再创建一个view 修改的是自定义adapter中的getview方法 @Overridepublic View getView(int position, View convertView, ViewGr

管理ceph缓存池

目录 缓存池简介 缓存池原理 缓存池的工作模式 配置缓存池 1. 创建一个缓存池 2. 设置缓存层 3. 缓存层相关参数说明 4. 测试缓存池 删除缓存池 1. 删除read-only缓存池 2. 删除writeback缓存池 缓存池简介 缓存池原理 ceph的缓存分层特性是在ceph的F版当中正式发布的.所谓的缓存分层其实就是在更快的磁盘(通常是ssd)上创建一个存储池.然后将这个存储池放置在常规的复制池或者纠删码池的前端充当缓存.这样所有的客户端I/O操作都首先由缓存池处理,之后再将数据写回

Mysql InnDB 缓存池(Buffer Pool)

InnoDB通过在内存中维护缓存池(Buffer Pool)来对数据和索引进行缓存,从而提高数据库性能.了解Mysql内存缓冲池的原理,并针对性地进行调优,能够最大化其带来的性能优势. 通常,在保证服务器上其他应用程序有足够内存的情况下,可以给buffer pool分配尽可能多的内存空间.越大的buffer pool能够使mysql越能够像内存数据库一样提供服务.其大小通过innodb_buffer_pool_size配置.对于64 bit 机器,可以将buffer pool 配置为多个部分,以

《Java架构筑基》从Java基础讲起——基础类型缓存池概念

以Integer为例 new Integer(123) 与 Integer.valueOf(123) 的区别在于: new Integer(123) 每次都会新建一个对象: Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用. Integer x = new Integer(123); Integer y = new Integer(123); System.out.println(x == y); // false Integer z = Integ

Android数据库源码分析(3)-连接缓存池SQLiteConnectionPool

本系列主要关注安卓数据库的线程行为,分为四个部分: (1)SQLiteOpenHelper的getReadableDatabase和getWritableDatabase (2)SQLiteDatabase的实现以及多线程行为 (3)连接缓存池SQLiteConnectionPool (4)SQLiteDatabase多线程实践 本篇主要关注SQLiteConnectionPool(连接池)在并发下的行为. 上文提到,SQLiteDatabase会在每个线程中使用一个SQLiteSession,

CP30--使用配置文件properties进行连接池对象DataSource的创建

使用配置文件properties进行连接池对象DataSource的创建 如下: 1 public class CP30Util { 2 private static DataSource dataSource; 3 //使用静态代码块,使驱动在调用工具类时就被加载,且只加载一次 4 static { 5 try { 6 //使用工厂方法"Using the DataSouces factory class"创建DataSource连接池对象 7 dataSource= DataSou