问题描述
我有一些 (8-10) 大纹理图集(大约 8192x8192 保存为 BC1 DDS),但它们的磁盘空间相当小,只有 32MiB。
问题是,当我使用 WIC 加载这些文件时,它们会丢失块压缩并占用高达 256MiB 的 RAM,根据 sources
public Bitmap LoadBitmap(string path) {
Bitmap m;
using (BitmapDecoder d = new BitmapDecoder(imagingFactory,$"plugins/HDPatch/{path}",Guid.Empty,SharpDX.IO.NativeFileAccess.Read,DecodeOptions.Cacheondemand)) {
DdsDecoder decoder = d.QueryInterface<DdsDecoder>();
decoder.GetFrame(0,out BitmapFrameDecode frame);
m = SharpDX.Direct2D1.Bitmap.FromWicBitmap(_target,frame);//_target.CreateBitmap(converter,new BitmapProperties());
decoder.dispose();
frame.dispose();
}
return m;
}
我是否需要更改某些内容,还是应该使用与 WIC 不同的加载方法?
我查看了 DdsFrameDecode.CopyBlocks (+ ID2D1Bitmap::CopyFromMemory) 方法,但我不知道它是如何工作的..(我的步幅究竟是什么以及我从哪里获得这些信息)
编辑:
所以 BitmapFrameDecode 给了我一个 32bppPBGRA 的 PixelFormat
如果我从那个 BitmapFrameDecode 查询一个 DDSFrameDecode,我会从 DdsFrameDecode 得到一个 BC1_Unorm 的格式。 DdsDecoder 还报告了一个带有 DdsAlphaModePremultiplied 和 BC1_Unorm 的 dxgiFormat 的纹理。
但是当我在 BitmapProperties 中强制使用 BC1_Unorm 的像素格式时,我收到 D2D 调试错误:“传递给此 API 的像素格式与 IWICBitmapSource 的像素格式不兼容”
编辑2: 我想出了如何使用 copyBlocks
SharpDX.DataStream stream = new
SharpDX.DataStream(test2.FormatInfo.BytesPerBlock * test2.SizeInBlocks.Width * test2.SizeInBlocks.Height,true,true);
test2.copyBlocks(null,test2.FormatInfo.BytesPerBlock * test2.SizeInBlocks.Width,stream);
m = new Bitmap(_target,new SharpDX.Size2(decoder.Parameters.Width,decoder.Parameters.Height),stream,test2.FormatInfo.BytesPerBlock * test2.FormatInfo.BlockWidth,new BitmapProperties(new PixelFormat(SharpDX.dxgi.Format.BC1_Unorm,AlphaMode.Premultiplied)));
但是问题依然存在。它可以成功创建Bitmap,但仍然消耗大量内存(250MiB+而不是32MiB的实际块压缩大小)
它可能与渲染目标有关吗? 我使用软件 B8G8R8A8_Unorm DeviceContext 渲染目标
编辑 3:
示例项目:https://drive.google.com/file/d/1hCgQnEV9xcTevgdswAiPJNREk1oDgqDC/view?usp=sharing
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)