私は現在、私のゲームプロジェクトのパフォーマンスの最適化を探しています。私の初期化プロセスのボトルネックは、私のモデルのテクスチャをロードしています。大きなテクスチャの読み込みと割り当てには最大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;
}
ビットマップを使用しているようです。代わりにDDSファイルの使用を検討しましたか?圧縮形式と非圧縮形式の両方をサポートします – Asesh
私のテクスチャはすべてPNGファイルです。私のコンテンツパイプラインでは、すべてのデータ(モデルのジオメトリ、テクスチャ、アニメーションなど)をリソースパックにパックし、必要に応じて実行時にロードします。だから、私はPNGファイルのバイトを格納し、上記の関数で処理します。別のソースファイル形式が良いと思いますか? – Endgegner85
さて、私はそれを試してみましょう。我々は、テクスチャリングのために圧縮された(DXT5)DDSファイルを使用します。また、DDSファイルもミップマップをサポートしています – Asesh