簡體   English   中英

在后台線程停頓上創建位圖渲染線程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM