在微信小游戏开发中,最重要的问题之一就是游戏的内存管理,想要微信小游戏能够持续稳定的运行下去,那么对游戏的运行内存要把握好,针对于平凡操作的资源对象(类似于图片、音频),我们不能时刻的去创建于销毁它,因为对象销毁后,该对象的内存资源不会立刻释放掉,微信小游戏有着自己的垃圾回收算法,所以针对这种对象,我们需要创建资源对象池,用的时候从对象池中进行获取,释放的时候返回给对象池就可以了,对象池代码如下:
const __ = {
poolDic: Symbol('poolDic')
}
import Param from '../utils/Params'
/**
* 简易的对象池实现
* 用于对象的存贮和重复使用
* 可以有效减少对象创建开销和避免频繁的垃圾回收
* 提高游戏性能
*/
export default class ImagePool {
constructor() {
this[__.poolDic] = {}
}
/**
* 根据对象标识符
* 获取对应的对象池
*/
getPoolBySign(name) {
return this[__.poolDic][name] || (this[__.poolDic][name] = [])
}
/**
* 根据传入的对象标识符,查询对象池
* 对象池为空创建新的类,否则从对象池中取
*/
getItemByClass(name, indexName) {
let pool = this.getPoolBySign(name)
let result = (pool
? pool[indexName]
: null)
return result
}
/**
* pengweikang 20181105 初始化资源库池数据
*/
init(){
/**
* pengweikang 20181105 初始化正面麻将牌数据
*/
this[__.poolDic]['PAI'] = {}
for (let i = 0; i < Param.PAI_LIST.length; i++){
this[__.poolDic]['PAI'][Param.PAI_LIST[i]] = new Image()
this[__.poolDic]['PAI'][Param.PAI_LIST[i]].src = 'images/pai/' + Param.PAI_LIST[i] + '.png'
}
/**
* 初始化牌背景麻将
*/
this[__.poolDic]['BG'] = {}
this[__.poolDic]['BG']['SELF_PAI'] = new Image()//自己手牌
this[__.poolDic]['BG']['SELF_PAI'].src = 'images/pai/bg/自己手牌.png'
this[__.poolDic]['BG']['SELF_CHU_PAI'] = new Image()//自己出牌与对家出牌
this[__.poolDic]['BG']['SELF_CHU_PAI'].src = 'images/pai/bg/自己出牌对家出牌对家碰牌.png'
this[__.poolDic]['BG']['LEFT_PAI'] = new Image()//左侧手牌
this[__.poolDic]['BG']['LEFT_PAI'].src = 'images/pai/bg/左家手牌.png'
this[__.poolDic]['BG']['TOP_PAI'] = new Image()//对家手牌
this[__.poolDic]['BG']['TOP_PAI'].src = 'images/pai/bg/对家手牌.png'
this[__.poolDic]['BG']['RIGHT_PAI'] = new Image()//对家手牌
this[__.poolDic]['BG']['RIGHT_PAI'].src = 'images/pai/bg/右家手牌.png'
}
}
通过建立对象池连接,在真机测试是长期运行没有出现内存过大导致小程序自动推出问题。
运行界面如下图所示: