2014-03-03 73 views
1

我想知道如何加速繪製QML場景來顯示由六邊形瓷磚組成的遊戲地圖。每個圖塊都是在啓動時通過JavaScript動態實例化的qml項目。基於鼠標移動切換每個圖塊的高亮屬性。QML畫布性能問題

圖塊對象類似於這樣:

Item { 
    id: tile 

    x: // is set to fixed value by JS code on item instantiation 
    y: // is set to fixed value by JS code on item instantiation 
    width: // is set to fixed value by JS code on item instantiation 
    height: // is set to fixed value by JS code on item instantiation 

    property bool highlight: false 

    Canvas { 
     id: background 
     anchors.fill: parent 
     onPaint: { 
      // draw filled hexagon 
     } 
    } 
    Canvas { 
     id: border 
     anchors.fill: parent 
     onPaint: { 
      // draw hexagon outline 
     } 
    } 
    Canvas { 
     id: highlightItem 
     anchors.fill: parent 
     visible: highlight 
     onPaint: { 
      // draw filled yellow hexagon 
     } 
    } 
} 

的問題是,這種類型的場景是切換時的單瓦亮點,約在〜300瓦11fps總在場景渲染死慢。

如果我刪除背景和邊框畫布元素,我得到的幀率是三倍以上。我已經確認在初始繪畫操作完成後,onPaint()方法都不會再被調用。

下面是單個高亮事件的QML分析器視圖以及信號處理器處理所花費的時間。細線是切換高亮屬性的位置。

有沒有人有想法,爲什麼這麼簡單的場景如此之慢以及如何加速?

QML Profiler

回答

0

我猜的字節塊Canvas.onPaint代碼是常規疑似當它涉及到實時渲染的瓶頸。

它真的取決於什麼觸發Canvas.onPaint。這不會隱式發生,有些代碼必須顯式調用Canvas.requestPaint()。檢查你的代碼,如果是這樣的話。也許這不是必要的。

如果某些元素已將重新繪製爲每一幀,我會建議使用ShaderEffect。您必須將您的渲染代碼編寫爲片段和頂點着色器,這與canvas API非常不同。但它通常快幾個數量級。

+0

我很早就對此進行了檢查。創建一個貼圖後,每個''onPaint()''方法只需要調用一次。切換高亮顯示時,在任何畫布項上都沒有進一步的「onPaint()」調用,至少沒有執行調用的console.log('paint')調用。 – advancingu