【发布时间】:2019-11-15 22:12:56
【问题描述】:
我编写了一个简单的路径跟踪器,希望能够在我的 GUI 中显示实时预览。目前,我正在使用一些 hacky 解决方案:
应用程序基于 .NET Core 3。 GUI 是 .NET Core 3 WPF。 GUI 是它自己的项目,而实际的渲染器是一个单独的类库。目前,我在 GUI 中使用 Image 对象,其源绑定到 Renderer.ImageBuffer,这是一个位图。我添加了一些 INotifyPropertyChanged 代码,让 GUI 知道它应该以用户设置的间隔刷新。我正在使用此转换器在此处显示一些内容:
public class ConvertBitmapToBitmapImage : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (!(value is System.Drawing.Bitmap rawBitmap)) return null;
using var memory = new MemoryStream();
rawBitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
return bitmapImage;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
但是,当我在渲染器中启用更新代码时,将原始位图数据转换为 GUI 友好的 BitmapImage 格式会产生大量开销,并且会大大降低渲染速度。据我所知,没有办法直接从后端访问 BitmapImage 对象类型,而不使类库成为 Core 3 中的 WPF 项目本身。有没有更好的方法可以做到这一点,或者更合适的控制用于将原始值映射到 GUI 中可查看的内容?
【问题讨论】:
-
为什么源属性是 System.Drawing.Bitmap?当您问“有什么方法可以将原始数组直接映射到 WPF 中的图像?”时,答案是:当然,只需将 Image 的 Source 属性绑定到
byte[]类型的属性即可。内置类型转换使其开箱即用。 -
呵呵,不开玩笑。雅每天都学习新东西。我得试一试。它期望字节数组采用什么格式才能使其正常工作?只是图像中像素总数大小的平面数组?
-
当前解决方案的帧速率是多少?您确定是渲染需要额外的时间吗?
-
如果您希望在 CPU 使用率最低的情况下获得最高性能(60fps,最终更高),您可以构建一个 Directx 12 资产,将其注入 WPF 视图框或其他东西中,并拥有例如 cuda- directx12 互操作。您的延迟将低于微秒。
-
@MatthewHeimlich 字节数组将包含一个编码的图像帧,例如PNG 或 JPEG。除非事先知道位图的宽度、高度和像素格式,否则绑定原始像素缓冲区会很困难。