2014-03-03 72 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