今天才发现badkeeper关于Resource Manager的设计真是妙啊!
2007-11-06 17:55
239 查看
写出来大概是这个样子,完全没有必要像我写的MemMan那样复杂!
class Resource {
public:
Resource()
{
ResourceManager.attach( this );
}
virtual ~Resource()
{
ResourceManager.detach( this );
}
virtual void streamIn() = 0;
virtual UINT streamOut() = 0;
public:
UINT last_use_time;
};
class ResourceManager {
public:
void attach( Resource *res );
void detach( Resource *res );
UINT get_current_time()
{
return ++current_time;
}
UINT pop()
{
Resource *old_res;
for( UINT i = 0; i < reslist.size(); ++i )
{
Resource *res = reslist[i];
// LRU...
if( res->last_use_time < old_res->last_use_time )
old_res = res;
}
return old_res->steamOut();
}
private:
std::vector<Resource*> reslist;
UINT current_time;
};
class MemoryAllocator {
public:
void *alloc( UINT size )
{
if( memoryAvailable > 0 )
return new char[size];
else
{
UINT got_size = 0;
do {
got_size += ResourceManager.pop();
} while( got_size < size );
return new char[size];
}
}
};
class RayObject : public Resource {
public:
void streamIn()
{
if( compressed )
{
prilist = new RayTriangle [prisize];
compressed = false;
}
last_use_time = ResourceManager.get_current_time();
}
UINT streamOut()
{
if( !compressed )
{
delete [] prilist;
compressed = true;
}
return size;
}
private:
RayTriangle prilist;
bool compressed;
};
class Resource {
public:
Resource()
{
ResourceManager.attach( this );
}
virtual ~Resource()
{
ResourceManager.detach( this );
}
virtual void streamIn() = 0;
virtual UINT streamOut() = 0;
public:
UINT last_use_time;
};
class ResourceManager {
public:
void attach( Resource *res );
void detach( Resource *res );
UINT get_current_time()
{
return ++current_time;
}
UINT pop()
{
Resource *old_res;
for( UINT i = 0; i < reslist.size(); ++i )
{
Resource *res = reslist[i];
// LRU...
if( res->last_use_time < old_res->last_use_time )
old_res = res;
}
return old_res->steamOut();
}
private:
std::vector<Resource*> reslist;
UINT current_time;
};
class MemoryAllocator {
public:
void *alloc( UINT size )
{
if( memoryAvailable > 0 )
return new char[size];
else
{
UINT got_size = 0;
do {
got_size += ResourceManager.pop();
} while( got_size < size );
return new char[size];
}
}
};
class RayObject : public Resource {
public:
void streamIn()
{
if( compressed )
{
prilist = new RayTriangle [prisize];
compressed = false;
}
last_use_time = ResourceManager.get_current_time();
}
UINT streamOut()
{
if( !compressed )
{
delete [] prilist;
compressed = true;
}
return size;
}
private:
RayTriangle prilist;
bool compressed;
};
相关文章推荐
- 今天看StarterKit.Communities中的关于获取路径部分,发现一个问题?难道老外也会不仔细看MSDN,还是?
- 刚发现了一个问题,关于vs2005 datagridview的,我发现在设计行标头的HeaderCell.Value的时候要是设置RowTemplate.Height 的值>= 17则行标头的那个黑三角就显示出来了,要是小于17就不能显示了,想问问大家,是怎么回事?
- 今天发现关于Ajax异步的问题
- 真是学无止境阿——关于PCA投影建模,今天又学到了很多
- 20151224今天发现到的两篇关于CSS架构、可复用可维护CSS和CSS学习提升能有改变思想观念意识的文章 分别是CSS架构目标和说说CSS学习中的瓶颈
- 今天发现的关于gridview不显示内容的问题
- 今天学习filter函数,做课后题时发现一大神写的关于[::-1]的用法
- 今天看了一眼我的书架,发现清华出版社出的书真是多啊
- 今天发现一个关于CSS的东东,解决了我很多疑问
- 今天发现了一个很傻的设计
- 今天发现了JBuilder 2006 一个BUG,关于资源文件重构后的BUG
- 今天发现一个Java的关于java.io.File在处理com1到com9为文件名的Bug.
- 今天才发现,网上误人子弟的事还很多----关于做不规窗体
- 今天在看Head First 设计模式的时候发现了一点问题,可能是翻译的原因吧
- 今天发现了一个很好用的,可以试用一个月的免费asp.net2.0空间!!真是太高兴了.感谢提供者;
- 今天发现的可以使用参数的方式将表单设计元素名传给方法
- 今天新发现的一个php设计模式(初学者,才看了两天的设计模式,勿笑之)
- 今天发现腾讯TM一直发udp包往一个ip地址。初步估计不是病毒,而是跟它设计的通信机制有关。
- 今天关于android运行时权限的一点发现...
- 关于接下来的课程设计的安排