Пример #1
0
        /// <summary>
        /// 释放内存及对资源包FileStream的控制
        /// </summary>
        public void Release()
        {
            try
            {
                m_PackageInfosDic.Clear();
                m_FilesPackInfoDic.Clear();

                List <string> packageNamesList = new List <string> (m_FileStreamDic.Keys);
                for (int n = 0; n < packageNamesList.Count; n++)
                {
                    FileStream tempStream = m_FileStreamDic [packageNamesList [n]];
                    tempStream.Flush();
                    tempStream.Close();
                    tempStream = null;
                }
                m_FileStreamDic.Clear();

                packageNamesList.Clear();
                packageNamesList = null;

                m_PackageInfosDic  = null;
                m_FilesPackInfoDic = null;
                m_FileStreamDic    = null;
            }
            catch (Exception e)
            {
                ConsoleMgr.LogRed(e.ToString());
            }
        }
Пример #2
0
        private static double LoadFilesBySelf()
        {
            List <string> packedFileNames = PackedFileMgr.Ins.PackedFileNames;

            SpeedTester2 = new SpeedTester("我的方案: ");
            for (int i = 0; i < packedFileNames.Count; i++)
            {
                string fileName = packedFileNames[i];

                byte[] returnData = PackedFileMgr.Ins.Load(fileName);
                if ((returnData != null) && (returnData.Length > 0))
                {
                    SelfFileCount++;
                    SpeedTester2.AddLoaded((uint)returnData.Length);
                }
                else
                {
                    ConsoleMgr.LogRed("错误:获取不到文件名为" + fileName + "的数据,该文件数据可能为空!");
                }
            }

            if (SelfFileCount == PackedFileMgr.Ins.PackFilesCount)
            {
                double mySpeed = SpeedTester2.GetSpeed();
                return(mySpeed);
            }

            return(0);
        }
Пример #3
0
        public double GetSpeed()
        {
            TimeSpan span        = DateTime.Now - BeginTime;
            double   costSeconds = span.TotalSeconds;
//			ConsoleMgr.LogRed (costSeconds.ToString ());
            double totalMB = (double)TotalBytes / (1024 * 1024);

            double speed = totalMB / costSeconds;
            string str   = frontStr + speed.ToString("F3") + "MB/S";

            ConsoleMgr.LogRed(str);

            return(speed);
        }
Пример #4
0
        public static void Main(string[] args)
        {
            //方案1:用系统自带API
            SpeedTester1 = new SpeedTester("系统方案: ");
            LoadFiles();
            double systemSpeed = SpeedTester1.GetSpeed();

            Console.WriteLine("");

            //方案2:用自写API
            double mySpeed = LoadFilesBySelf();
            double compare = mySpeed / systemSpeed;

            Console.WriteLine("");
            ConsoleMgr.LogRed("我的方案速率是系统方案速率的 " + compare.ToString("F2") + " 倍");

            PackedFileMgr.Ins.Release();
        }
Пример #5
0
        public static void Read(ref Dictionary <string, PackageInfo> packageInfosDic, ref Dictionary <string, PackedFileInfo> filesPackInfoDic, string packagePath)
        {
            try
            {
                FileStream fs = new FileStream(packagePath, FileMode.Open);

                PackageInfo tempPackageInfo = new PackageInfo();

                //1.资源包信息区域
                //1.1资源包版本(int)
                byte[] resVersionData = new byte[4];
                fs.Read(resVersionData, 0, 4);
                tempPackageInfo.Version = MyBinaryReader.ReadInt(resVersionData);
                resVersionData          = null;
                //1.2读取资源包类型名字节大小(ushort),占2个字节
                byte[] resTypeNameSizeData = new byte[2];
                fs.Read(resTypeNameSizeData, 0, 2);
                ushort resTypeNameSize = MyBinaryReader.ReadUshort(resTypeNameSizeData);
                resTypeNameSizeData = null;
                //1.3读取资源包类型名称
                byte[] resTypeNameData = new byte[resTypeNameSize];
                fs.Read(resTypeNameData, 0, resTypeNameSize);
                tempPackageInfo.TypeName = MyBinaryReader.ReadString(resTypeNameData);
                resTypeNameData          = null;
                //1.4读取资源包总共字节大小(uint)
                byte[] resTotalSizeData = new byte[4];
                fs.Read(resTotalSizeData, 0, 4);
                tempPackageInfo.TotalSize = MyBinaryReader.ReadUint(resTotalSizeData);
                resTotalSizeData          = null;
                //获取资源包名称
                FileInfo packageFileInfo = new FileInfo(packagePath);
                string   packageName     = packageFileInfo.Name.Split('.')[0];
                packageInfosDic.Add(packageName, tempPackageInfo);

                //2.文件信息集合区域
                //2.1文件信息集合所占字节大小(int)
                byte[] infoRegionSizeData = new byte[4];
                fs.Read(infoRegionSizeData, 0, 4);
                int infoRegionSize = MyBinaryReader.ReadInt(infoRegionSizeData);
                infoRegionSizeData = null;
                //2.2文件信息集合里的文件信息个数(int)
                byte[] filesCountData = new byte[4];
                fs.Read(filesCountData, 0, 4);
                int filesCount = MyBinaryReader.ReadInt(filesCountData);
                filesCountData = null;

                int fileInfosRegionSize = 4 + 4;
                for (int n = 0; n < filesCount; n++)
                {
                    PackedFileInfo tempInfo = new PackedFileInfo();
                    //2.3.1文件名字节大小(ushort)
                    byte[] nameLengthData = new byte[2];
                    fs.Read(nameLengthData, 0, 2);
                    ushort nameLength = MyBinaryReader.ReadUshort(nameLengthData);
                    fileInfosRegionSize += 2;
                    nameLengthData       = null;
                    //2.3.2文件名(UTF8)
                    byte[] nameData = new byte[nameLength];
                    fs.Read(nameData, 0, nameLength);
                    string fileName = MyBinaryReader.ReadString(nameData);
                    fileInfosRegionSize += nameLength;
                    nameData             = null;
                    //2.3.3文件起始位置(uint)
                    byte[] startPosData = new byte[4];
                    fs.Read(startPosData, 0, 4);
                    tempInfo.StartPos    = MyBinaryReader.ReadUint(startPosData);
                    fileInfosRegionSize += 4;
                    startPosData         = null;

                    //2.3.4文件大小(int)
                    byte[] sizeData = new byte[4];
                    fs.Read(sizeData, 0, 4);
                    tempInfo.Size        = MyBinaryReader.ReadInt(sizeData);
                    fileInfosRegionSize += 4;
                    sizeData             = null;

                    tempInfo.PackageName = packageName;

                    if (!filesPackInfoDic.ContainsKey(fileName))
                    {
                        filesPackInfoDic.Add(fileName, tempInfo);
                    }
                    else
                    {
                        ConsoleMgr.LogRed("有重复文件名:" + fileName);
                    }
                }

                if (fileInfosRegionSize != infoRegionSize)
                {
                    ConsoleMgr.LogRed("错误:文件信息集合区域的字节大小计算有误!");
                }

                fs.Flush();
                fs.Close();
            }
            catch (Exception e)
            {
                ConsoleMgr.LogRed(e.ToString());
            }
        }