1

私はゲームを作成しており、次のように定義されたテクスチャやメッシュなどを使用して、3D モデルをロードするためのリソース ファイル形式を持っています。

/* PackageHeader definition */
    struct PackageHeader
    {
        std::string mSignature;
        uint8_t mMajorVersion;
        uint8_t mMinorVersion;


        PackageHeader();
    };

    /* PackageMesh definition */
    struct PackageMesh
    {
        std::vector<Vec3> mVertexData;
        std::vector<Vec3> mNormalData;
        std::vector<Vec2> mTexCoordsData;
        std::vector<uint32_t> mIndiceData;
        uint16_t mMaterialIndex;
        bool mHasMaterial;


        PackageMesh();
    };

    /* PackageTexture definition */
    struct PackageTexture
    {
        std::string mName;
        std::vector<uint8_t> mTextureData;
        uint32_t mTextureWidth;         // width/height in pixels
        uint32_t mTextureHeight;
        ITexture::TextureFormat mTextureFormat;
        ITexture::TextureType mTextureType;


        PackageTexture();
    };

    /* PackageMaterial definition */
    struct PackageMaterial
    {
        std::string mName;
        PackageTexture mDiffuseTexture;
        Vec3 mDiffuseColor;
        Vec3 mAmbientColor;
        Vec3 mSpecularColor;
        Vec3 mEmissiveColor;


        PackageMaterial();
    };

    /* PackageModel definition */
    struct PackageModel
    {
        std::string mName;
        std::vector<PackageModel> mChildren;
        std::vector<PackageMesh> mMeshes;
        Mat4 mTransform;


        PackageModel();
    };

    /* JonsPackage definition */
    struct JonsPackage
    {
        PackageHeader mHeader;
        std::vector<PackageModel> mModels;
        std::vector<PackageMaterial> mMaterials;


        JonsPackage();
    };

私は Boost Serialization を使用してファイルシステムから保存/読み込みを行っていますが、それを行うためのコードはほとんど必要ないため、これまでは非常に素晴らしいものでした。

ただし、いくつかの 3d モデルをインポートしてから再度ロードしようとすると、ロード時間が非常に長くなります。ファイルシステムからロードしてデシリアライズするのに約 30 秒かかります。

これはシリアライズ/デシリアライズするコードです:

JonsPackagePtr ReadJonsPkg(const std::string& jonsPkgName)
    {
        std::ifstream jonsPkgStream(jonsPkgName.c_str(), std::ios::in | std::ios::binary);        // TODO: support opening of older resource packages
        JonsPackagePtr pkg(HeapAllocator::GetDefaultHeapAllocator().AllocateObject<JonsPackage>(), boost::bind(&HeapAllocator::DeallocateObject<JonsPackage>, &HeapAllocator::GetDefaultHeapAllocator(), _1));

        if (jonsPkgStream && jonsPkgStream.good() && jonsPkgStream.is_open())
        {
            std::stringstream buf(std::ios_base::binary | std::ios_base::in | std::ios_base::out);
            buf << jonsPkgStream.rdbuf();
            buf.seekg(0);
            jonsPkgStream.close();

            boost::archive::binary_iarchive iar(buf);

            iar >> (*pkg.get());
        }

        jonsPkgStream.close();

        return pkg;
    }

    bool WriteJonsPkg(const std::string& jonsPkgName, const JonsPackagePtr pkg)
    {
        std::ofstream outStream(jonsPkgName.c_str(), std::ios::out | std::ios::binary | std::ios::trunc);
        bool ret = false;

        if (outStream.is_open())
        {
            boost::archive::binary_oarchive oar(outStream);
            oar << (*pkg.get());

            ret = true;
        }

        return ret;
    }

VS2012 パフォーマンス分析の画像は次のとおりです: http://postimg.org/image/smdsnu5gl/

私が使用しているリソース ファイルは、ディスク上で約 26 MB で、3 つのパッケージ モデルと 14 のパッケージ テクスチャが含まれています。これについて何ができるでしょうか。私のファイル形式の設計は行き止まりですか?

4

1 に答える 1

1

これは 26MB だけでは時間がかかりすぎます。あなたがVS2012でそれを実行していることを見ました。ファイル エクスプローラーから直接 .exe をクリックするだけで、VS2012 環境の外でプログラムをリリースして実行することをお勧めします。

また、コンテンツをデシリアライズするためにファイル全体をメモリにロードする必要もありません。

次のコードで試すことができます。

std::ifstream file("path.dat");
boost::archive::binary_iarchive iar(file);
于 2013-07-15T15:00:01.763 に答える