【发布时间】:2017-03-26 21:52:40
【问题描述】:
我目前正在为我的游戏项目寻找性能优化。我初始化过程的瓶颈是加载模型的纹理。加载和分配大型纹理最多需要 100 毫秒。这是一个问题,因为我有很多。我分析了我的代码,发现大部分时间(大约 96%)都花在了 CopyPixels 的调用上(见下文)。
我在下面附加了用于导入所有纹理的功能。这个函数就像一个魅力,基于官方的 SharpDX-samples-master 示例代码。首先,我从自定义文件格式加载图像字节(大纹理大约需要 2 毫秒)。然后,我创建格式转换器并使用它将像素复制到数据流中。但是,复制像素非常慢。
有没有更快的方法来达到同样的效果?
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 文件?它支持压缩和未压缩格式
-
我的纹理都是PNG文件。在我的内容管道中,我将所有数据(模型几何、纹理、动画等)打包到资源包中,并在需要时在运行时加载它们。所以,我存储了 PNG 文件的字节,并使用上面的函数处理它们。您认为另一种源文件格式会更好吗?
-
好吧,我会试一试。我们使用压缩 (DXT5) DDS 文件进行纹理处理。此外,DDS 文件也支持 mipmaps
标签: c# directx textures directx-11 sharpdx