Files
LayaNative2.0/Conch/source/common/resource/JCResource.h
T
2020-11-11 16:17:13 +08:00

117 lines
3.8 KiB
C++

/**
@file JCResource.h
@brief
@author James
@version 1.0
@date 2016_5_12
*/
#ifndef __JCResource_H__
#define __JCResource_H__
#include <functional>
#include <vector>
#include "../util/ListNode.h"
namespace laya
{
class JCResManager;
class JCResStateDispatcher
{
public:
enum ResState
{
getting=0,
ready=1,
freed=2,
error=3
};
enum ResError
{
noError=0,
downloadError=1,
decodeError=2
};
public:
typedef std::function<void(JCResStateDispatcher*)> ResOnReadyCB;
typedef std::function<void(JCResStateDispatcher*,int)> ResOnErrCB;
JCResStateDispatcher();
ResState getState(){return m_nResState;};
//可能会触发回调。
void setState( ResState p_state );
//资源准备好之后的回调。可以调用多次,添加多个回调
void setOnReadyCB(ResOnReadyCB cb );
//资源出错了的回调。
void setOnErrorCB(ResOnErrCB cb);
void setOnFreeCB(ResOnReadyCB cb );
virtual bool restoreRes(){return false;};
public:
//资源准备好了的回调。回调函数在执行之后就会被删除
std::vector<ResOnReadyCB > m_allOnReadyCB,m_tmpOnReadyCB;
std::vector<ResOnErrCB > m_allOnErrCB,m_tmpOnErrCB;
std::vector<ResOnReadyCB > m_allOnFreeCB,m_tmpOnFreeCB;
ResState m_nResState; //当前的状态。外部禁止修改
int m_nErrNo; //错误代码
};
class JCResource :public JCResStateDispatcher, public ListNode
{
friend class JCResManager;
public:
JCResource();
~JCResource();
//本资源占用的容量。
//这个值可能会变。
//问题:如果直接通过manager.addMemSize则不用这个。但是
// 用addMemSize的话,
// 没有地方保存资源占用的大小,在add到资源管理器之前,无法进行加减操作
// 需要到处进行加减的维护
// 用 resSize 的话
// 外部直接调用释放资源,无法通知到resMgr
// 如果是固定大小,如果是异步资源,无法得到一致的大小,会导致问题。变化的大小没有问题。
//virtual int resSize(){return mnResSize;};
//设置资源大小,如果为0的话,会被从活动列表中删除
void setResSize(int sz);
int getResSize(){ return m_nResSize;}
//清理本资源占用的内存。此对象本身不会被释放。
//p_bNeedUpdateSize 表示是否需要通知资源管理器自己状态发生变化了。如果是资源管理器调用的FreeRes,显然应该为false
// 其他情况应该为true。
// 这个参数不用了,外部调用者不应该关心占用空间的问题。如果关心的话,则自己再调用manager去管理
//p_bNeedRestore 表示是否还需要再恢复。例如当整个系统析构的时候,就不再需要了。
// 例如bitmap资源会在释放的时候生成缩略图。如果是系统要关闭了,则没有必要做这个了。
virtual void freeRes( bool p_bNeedRestore ){};
//恢复res的内容,这个是给ResMap使用的,
//当获得成功后,要通知已有的回调
//如果restore后增加占用内存,可能又会导致自己被释放掉。
virtual bool restoreRes(){return false;};
inline bool isActive(){ return !notInChain();}
virtual void touch( bool p_bRestoreRes=false);
public:
int m_nTouch; //上次活动时间
int m_nUsedMem; //当前在管理器中记录的大小。即上次统计的时候的大小。
int m_nResSize; //当前的资源的大小。这个会被随时修改。
JCResManager* m_pResManager;
};
}
//------------------------------------------------------------------------------
#endif //__JCResource_H__
//-----------------------------END FILE--------------------------------