如何解决Direct2D (SharpDX) 块压缩位图未在内存中压缩
我有一些 (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 举报,一经查实,本站将立刻删除。