2017-03-23 16 views
1

私は現在、私のゲームプロジェクトのパフォーマンスの最適化を探しています。私の初期化プロセスのボトルネックは、私のモデルのテクスチャをロードしています。大きなテクスチャの読み込みと割り当てには最大100msかかります。私はそれらの多くを持っているので、これは問題です。私は自分のコードを分析し、ほとんどの時間(約96%)がCopyPixels(以下を参照)の呼び出しに費やされていることを発見しました。テクスチャの読み込みパフォーマンスを向上させるにはどうすればよいですか?

下記のすべてのテクスチャをインポートするために使用する関数を添付しました。この関数は魅力的に機能し、公式SharpDX-samples-masterサンプルコードに基づいています。まず、自分のカスタムファイルフォーマットからイメージバイトを読み込みます(大きなテクスチャの場合は約2msかかります)。次に、フォーマットコンバータを作成し、それを使ってピクセルをデータストリームにコピーします。ただし、ピクセルのコピーは非常に遅いです。

これを達成するための方法はありますか?

public static Resources.Texture ImportTexture(Resources.AResourceManager resourceManager, string resourcePackFileName, int bytePosition, out string resourceItemName) 
{ 
    // Load image bytes from file. 
    FileReader fileReader = new FileReader(); 
    DataTypes.Content.ResourceItem resourceItem = fileReader.ImportTextureFromCollection(resourcePackFileName, bytePosition); 
    resourceItemName = resourceItem.Name; 

    // Create texture. 
    Resources.Texture tex = null; 
    using (SharpDX.WIC.BitmapDecoder bitmapDecoder = new SharpDX.WIC.BitmapDecoder(resourceManager.ImagingFactory, new MemoryStream(resourceItem.Data, false), SharpDX.WIC.DecodeOptions.CacheOnDemand)) 
    { 
     using (SharpDX.WIC.FormatConverter formatConverter = new SharpDX.WIC.FormatConverter(resourceManager.ImagingFactory)) 
     { 
      formatConverter.Initialize(bitmapDecoder.GetFrame(0), SharpDX.WIC.PixelFormat.Format32bppPRGBA, SharpDX.WIC.BitmapDitherType.None, null, 0.0, SharpDX.WIC.BitmapPaletteType.Custom); 

      SharpDX.DataStream dataStream = new SharpDX.DataStream(formatConverter.Size.Height * formatConverter.Size.Width * 4, true, true); 

      // This takes most of the time! 
      formatConverter.CopyPixels(formatConverter.Size.Width * 4, dataStream); 

      // Creating texture data structure. 
      tex = new Resources.Texture(formatConverter.Size.Width, formatConverter.Size.Height, formatConverter.Size.Width * 4) 
      { 
       DataStream = dataStream 
      }; 
     } 
    } 

    return tex; 
} 
+0

ビットマップを使用しているようです。代わりにDDSファイルの使用を検討しましたか?圧縮形式と非圧縮形式の両方をサポートします – Asesh

+0

私のテクスチャはすべてPNGファイルです。私のコンテンツパイプラインでは、すべてのデータ(モデルのジオメトリ、テクスチャ、アニメーションなど)をリソースパックにパックし、必要に応じて実行時にロードします。だから、私はPNGファイルのバイトを格納し、上記の関数で処理します。別のソースファイル形式が良いと思いますか? – Endgegner85

+0

さて、私はそれを試してみましょう。我々は、テクスチャリングのために圧縮された(DXT5)DDSファイルを使用します。また、DDSファイルもミップマップをサポートしています – Asesh

答えて

1

あなたはビットマップを使用しているように見えます。代わりにDDSファイルの使用を検討しましたか?圧縮形式と非圧縮形式の両方をサポートしています - Asesh

Aseshが正しくありました。最初は懐疑的でしたが、いくつかの調査を行い、平均的なPNGテクスチャは、同等のDDSテクスチャよりもハードドライブ上のメモリが少なくて済むという古い記事を発見しました。ただし、PNGテクスチャは実行時にDDSテクスチャを使用するよりも遅く変換する必要があります。

私は昨晩、適切な変換ツールを探して、GIMP用のプラグインのようなものをテストした後、AMDのCompressonatorを使ってすべてのPNGテクスチャをDDSテクスチャに変換しました。新しいファイルは、ハードドライブ上のPNGファイル(2.1 GBではなく1.7 GB)よりも少ないメモリしか使用しません。

最初の記事で紹介したテクスチャ読み込み方法はまだ機能していて、少し速かったです。しかし、私はオンラインで見つけたいくつかのコードサンプルに基づいてDDSインポータをコード化することに決めました。

結果:大きなテクスチャは、インポートに103ミリ秒ではなく1ミリ秒かかります。私はそれが改善できると思います。 :-D

ありがとう、Asesh!

+0

嬉しい私はあなたに提案を与えることができました:) – Asesh

+0

DDSインポーターコードを共有できますか?私が見つけた唯一の参照コードは、SharpDx.Toolkit.Graphicsの今放棄されたコードです。 – NathanAldenSr

関連する問題