我创建了一个 WPF 控件(继承自 FrameworkElement),它显示一个平铺的图形,可以进行平移。每个瓦片大小为 256x256 像素,24bpp。我重写了 OnRender 方法,在那里,我加载任何新的瓷砖(作为 BitmapFrame),然后使用 drawingContext.DrawImage 绘制所有可见的瓷砖。
现在,每当渲染周期中有超过几个新瓷砖时,帧率将从 60fps 掉到零,持续约一秒钟。这不是由于载入图像(大约需要毫秒级别的时间),也不是 DrawImage(因为它仅填充一些中间渲染数据结构,所以不花费时间)。
我的猜测是,当渲染线程获得大量新的 BitmapSource 实例(即它尚未缓存的实例)时,渲染线程本身会受阻。要么它花费了大量时间将它们转换为某种内部 DirectX 兼容格式,要么是缓存问题。它不能耗尽视频 RAM;Perforator 显示峰值低于 60MB,我有 256MB 的 RAM。此外,Perforator 表明所有渲染目标都是硬件加速的,所以也不可能是这个原因。
如果您有任何见解,欢迎分享!
谢谢!
Daniel
@RandomEngy:
BitmapScalingMode.LowQuality 减轻了一些问题,但没有完全解决。我已经按预期分辨率加载了图块。也不可能是显卡驱动程序的问题(Nvidia 已为最新)。
我有点惊讶地发现缩放需要那么长时间。就我所理解的,无论大小如何,位图都只是作为 Direct3D 纹理加载,然后进行硬件缩放。事实上,一旦位图被首次渲染,我可以在不进一步冻结的情况下改变其旋转和缩放。