我创建了一个 WPF 控件(从 FrameworkElement 继承),它显示一个可以平移的平铺图形。每个图块为 256x256 像素,24bpp。我已经覆盖了 OnRender。在那里,我加载任何新的图块(作为 BitmapFrame),然后使用drawingContext.DrawImage 绘制所有可见的图块。
现在,只要每个渲染周期有多个新图块,帧率就会从 60fps 下降到零大约一秒钟。这不是由加载图像(以毫秒为单位)引起的,也不是由 DrawImage 引起的(它根本不需要时间,因为它只是填充了一些中间渲染数据结构)。
我的猜测是,每当渲染线程获得大量(~20)新的 BitmapSource 实例(即,它尚未缓存的实例)时,它本身就会阻塞。要么花费大量时间将它们转换为某些内部 DirectX 兼容格式,要么可能是缓存问题。它不能用完视频 RAM;Perforator 显示峰值低于 60MB,我有 256MB。此外,Perforator 说所有渲染目标都是硬件加速的,所以也不是这样。
任何见解将不胜感激!
提前致谢
丹尼尔
@RandomEngy:
BitmapScalingMode.LowQuality 稍微减少了问题,但并没有摆脱它。我已经在以预期的分辨率加载图块。而且它不能是最新的图形驱动程序(Nvidia)。
得知缩放需要这么多时间,我有点惊讶。按照我的理解,位图(无论其大小)只是作为 Direct3D 纹理加载,然后进行硬件缩放。事实上,一旦位图第一次被渲染,我可以改变它的旋转和缩放,而不需要进一步的冻结。