MPQ文件系统优化(续)

天啊, 自己解析(listfile)本身就是一个错误!

因为StormLib在打开MPQ文件时就已经自己解析过了, 没必要多此一举!

而且, 虽然自己缓存一下文件树会加快查找和枚举的速度, 但是, 从字符串构造这个棵树的时间太长了~~~

这就导致了一个很严重的问题: 启动速度慢.......

对于文件树, 游戏没有什么用, 因为游戏读文件时根本不管是什么目录, 你可以把目录也看是文件名的一部分

换句话说, MPQ包里根本就没有目录的概念!

而对于编辑器等需要列举文件/文件夹列表的场合, 直接对所有文件进行枚举再判断字符串即可:

//------------------------------------------------------------------------------  
Array<String>  
MpqArchive::ListFiles(const String& dirPathInMpqArchive, const String& pattern)  
{  
    Array<String> result;  
    String fileMask(dirPathInMpqArchive);  
    fileMask.SubstituteChar('/', '//');  
 if (fileMask[fileMask.Length() - 1] != '//')  
    {  
        fileMask.Append("//");  
    }  
    fileMask.Append(pattern);  
 // start to find  
    SFILE_FIND_DATA findData;  
 BOOL found = TRUE;  
 HANDLE fileHandle = SFileFindFirstFile(this->mpqFileHandle, fileMask.AsCharPtr(), &findData, NULL);   
 while (0 != fileHandle && TRUE == found)  
    {  
        result.Append(String(findData.cFileName).ExtractFileName());  
        found = SFileFindNextFile(fileHandle, &findData);  
    }  
 return result;  
}  

下面是我的"单元"测试程序(嘿嘿, 包装一个好听的名字), 运行一下不会超过2秒, DEBUG模式下

//------------------------------------------------------------------------------  
//  mpqfilesystemtest.cc  
//  (C) 2008 xoyojank  
//------------------------------------------------------------------------------  
#include "stdneb.h"  
#include "mpqfilesystemtest.h"  
#include "interface/iointerface.h"  
namespace Test  
{  
__ImplementClass(Test::MpqFileSystemTest, 'MQFT', Test::TestCase);  
using namespace IO;  
using namespace Interface;  
using namespace Util;  
//------------------------------------------------------------------------------  
/** 
*/ 
void 
MpqFileSystemTest::Run()  
{  
    Ptr<IoServer> ioServer = IoServer::Create();  
    ioServer->SetZipFileSystemEnabled(false);  
    ioServer->RegisterStandardUriSchemes();  
    ioServer->MountWoWMpqArchives();  
 //n_assert(ioServer->IsFileExsit("wow:Creature/Cat/Cat.m2"));  
    Array<String> catFiles = ioServer->ListFiles("wow:Creature/Cat", "*.*");  
 for (IndexT i = 0; i < catFiles.Size(); ++i)  
    {  
        n_printf("%s/n", catFiles[i].AsCharPtr());  
    }  
    Array<String> charDirs = ioServer->ListDirectories("wow:Character", "*");  
 for (IndexT i = 0; i < charDirs.Size(); ++i)  
    {  
        n_printf("%s/n", charDirs[i].AsCharPtr());  
    }  
    URI uri = "wow:Character/BloodElf/HAIR00_00.blp";  
    Ptr<Stream> texture = ioServer->CreateStream(uri);  
    texture->Open();  
    Array<char> buffer(texture->GetSize(), 0, 0);  
    texture->Read(&buffer.Front(), texture->GetSize());  
    texture->Close();  
}  
} // namespace Test  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏iOS开发

iOS开发之 Method Swizzling 深入浅出

如果产品经理突然说:"在所有页面添加统计功能,也就是用户进入这个页面就统计一次"。我们会想到下面的一些方法:

4767
来自专栏程序员维他命

iOS 代码规范

花了一个月的时间结合几篇博客和书籍写了这套 iOS 代码规范(具体参考底部的参考文献部分)。这套代码规范除了有仅适用于 iOS 开发的部分,还有其他的比较通用性...

1912
来自专栏YG小书屋

Hadoop Streaming 读ORC文件

hadoop Streaming的处理流程是先通过inputFormat读出输入文件内容,将其传递mapper,再将mapper返回的key,value传给re...

1562
来自专栏程序猿DD

Spring框架中的设计模式(二)

在 上一篇 中我们在Spring中所谈到的设计模式涉及到了创建模式三剑客和1个行为模式(解释器模式)。这次我们会将眼光更多地关注在具有结构性和行为性的设计模式上...

4108
来自专栏FreeBuf

浅析ReDoS的原理与实践

*本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

6555
来自专栏androidBlog

java 解决文件名重复问题的两种方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

3131
来自专栏Android 研究

APK安装流程详解5——Installer、InstallerConnection和Installd守护进程

因为Installer继承自SystemService,所以我们看下Installer的onStart方法 代码在Installer.java 396行

1311
来自专栏冰霜之地

高效的序列化/反序列化数据方式 Protobuf

上篇文章中其实已经讲过了 encode 的过程,这篇文章以 golang 为例,从代码实现的层面讲讲序列化和反序列化的过程。

5255
来自专栏JavaEdge

Netty源码阅读入门实战(八)-解码(更新 ing)

就像很多标准的架构模式都被各种专用框架所支持一样,常见的数据处理模式往往也是目标实现的很好的候选对象,它可以节省开发人员大量的时间和精力。 当然这也适应于本文...

1254
来自专栏nummy

IPython简要入门

IPython增强了python自带的Console的功能,下面的语法只在IPython中有效。

832

扫码关注云+社区

领取腾讯云代金券