纹理资源管理的困惑

      这几天开始写资源管理,参考了ogre中的一些框架,同样使用档案(archive)来组织资源,定义resource manager类来处理资源resource类,包括将字符串迅速hash到一个指向某个资源的地址。档案目前使用mpq的开放库(自己还没能力写出同样出色的压缩定位算法),resource manager通过字符串作为唯一的ID来迅速hash到资源数组的某个位置当然高深的hash算法也是网上找来的貌似也是Mpq的hash算法
unsigned long GFResGroup::HashString(const char*lpszFileName,unsigned long dwHashType)
{
    unsigned char *key=(unsigned char*)lpszFileName;
    unsigned long seed1=0x7FED7FED;
    unsigned long seed2=0xEEEEEEEE;
    int ch;
    while(*key!=0)
    {
        ch=toupper(*key++);
        seed1=m_cryptTable[(dwHashType<< 8)+ch]^(seed1 + seed2);
        seed2=ch+seed1+seed2+(seed2<<5)+3;
    }
    return seed1;
}

乱七八糟的也没仔细研究就拿来用了。目前最大障碍在于纹理资源管理,我一直徘徊在市使用d3d内置的纹理管理(managed)还是自己写纹理管理,如果要自己写一张纹理就要分成2张一张放在内存(system memory)一张放在显存(video memory);然后必要的时候使用updateTexture.自己写需要实现很多算法比如优先队列用来存储lru算法的节点包括那些时候可以将显存中的纹理已给其他纹理用什么时候需要销毁显存中的纹理从而获得更大的显存空闲,还有很多零碎的小问题比如不同格式大小的纹理应该如何组织等等,想乐半天风险太大还是决定使用managed纹理,仔细研究了下文档功能还不错包括优先级设定都有应该能满足基本要求,总的来说这2星期主要目标就是将一个基本的纹理/顶点资源管理框架搭建出来具体的优化工作包括自己的纹理资源管理器放在以后优化

你可能感兴趣的:(管理)