[英]Creating bitmap on background thread stalls render thread
有點背景:我正在為聲納記錄回放的動畫制作動畫。 聲納記錄文件很大(通常為100-600MB),因此可以根據需要加載片段。 膽量是我們先為聲納文件編索引,然后使用內存映射文件根據需要加載數據塊。 數據然后用於創建位圖-非常簡單,因為數據由字節組成,我們僅使用8位調色板將其映射為顏色。
出於性能方面的考慮,我們在后台進行所有加載,並在其自己的圖形中呈現每個分段。 這可以正常工作,並且手動滾動視圖(或跳轉到特定位置)可提供非常好的性能。
我們遇到的問題-確實是一個小問題,但很煩人-是我們以較高的速度獲得故障播放。 我將原因歸結為在線程池線程中創建可寫位圖的那一刻。 代碼如下:
BitmapPalette bmp = new BitmapPalette(Palette);
WriteableBitmap wb = new WriteableBitmap(segment_bytes.ping_width, segment_bytes.height, 96, 96, System.Windows.Media.PixelFormats.Indexed8, bmp);
Int32Rect update_rect = new Int32Rect(0, 0, segment_bytes.ping_width, segment_bytes.height);
wb.WritePixels(update_rect, segment_bytes.data, segment_bytes.ping_width, 0);
wb.Freeze();
_element.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
new Action(delegate()
{
brush.set_image_brush(wb);
}));
set_image_brush調用僅設置畫筆的圖像源,該畫筆用於渲染線段(通過drawRectangle)並啟動簡短的不透明度動畫。
通過反復試驗(注釋掉一些代碼),我確定是WriteableBitmap的構造函數導致了每個段的減速/毛刺,並且在較大的段上更引人注意。 因此,即使這全部在線程池線程中進行,WB的創建仍在渲染線程(UI線程?)上進行。
有什么辦法可以解決這個問題?
謝謝,馬特
編輯:絕對要清楚,這是WB的創建引起的。 如果刪除代碼以在UI線程上設置圖像,然后將細分呈現為輪廓矩形,則仍然可以看到小故障。 同樣,如果我刪除writepixels調用。 僅僅創建WB就是造成此問題的原因,我不知道該如何停止。
嘗試使用Dispatcher.CheckAccess()方法,如下所示:
if (_element.Dispatcher.CheckAccess())
{
new Action(delegate()
{
brush.set_image_brush(wb);
}));
}
else
{
_element.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
new Action(delegate()
{
brush.set_image_brush(wb);
}));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.