2017-01-24 34 views
4

我在QML应用程序中看到主要的性能问题,我写了一个Scene3d以显示点云。 1000点/秒是没问题的,但是在10000点时它基本上停止了我的整个计算机。目标是进入数百万点(这是什么旧的应用程序,一个Qt/VTK混合物可以做的放缓之前)Qt pointcloud在scene3d中的性能下降

我担心我不会卸载处理到另一个线程,或者没有正确渲染。 ...这是我的第一个Qt项目,对所有这些都是新的。

基本上我建立了一个循环缓冲点(每个点是32字节),我将它复制到一个QByteArray上的定制QGeometry,Entity。该实体具有运行顶点和片段着色器的材质。

我能做些什么来提高性能吗?

材料

import Qt3D.Core 2.0 
import Qt3D.Render 2.0 

Material { 
    effect: Effect { 
     techniques: Technique { 
      renderPasses: RenderPass { 
       shaderProgram: ShaderProgram { 
        vertexShaderCode: loadSource("qrc:/shaders/pointcloud.vert") 
        fragmentShaderCode: loadSource("qrc:/shaders/pointcloud.frag") 
       } 
       renderStates: [ 
        PointSize { sizeMode: PointSize.Programmable } //supported since OpenGL 3.2 
       ] 
      } 
      graphicsApiFilter { 
       api: GraphicsApiFilter.OpenGL 
       profile: GraphicsApiFilter.CoreProfile 
       majorVersion: 4 
       minorVersion: 3 
      } 
     } 
    } 
     // some parameters... 
} 

我的着色器是非常简单的:

顶点

#version 430 

layout(location = 1) in vec3 vertexPosition; 

out VertexBlock 
{ 
    flat vec3 col; 
    vec3 pos; 
    vec3 normal; 
} v_out; 

uniform mat4 modelView; 
uniform mat3 modelViewNormal; 
uniform mat4 mvp; 
uniform mat4 projectionMatrix; 
uniform mat4 viewportMatrix; 

uniform float pointSize; 
uniform float maxDistance; 

void main() 
{ 
    vec3 vertexNormal = vec3(1.0, 1.0, 1.0); 
    v_out.normal = normalize(modelViewNormal * vertexNormal); 
    v_out.pos = vec3(modelView * vec4(vertexPosition, 1.0)); 

    float c  = (vertexPosition[0]*vertexPosition[0] + vertexPosition[1]*vertexPosition[1])*maxDistance; 
    v_out.col = vec3(c,c,0.5); 

    gl_Position = mvp * vec4(vertexPosition, 1.0); 
    gl_PointSize = viewportMatrix[1][1] * projectionMatrix[1][1] * pointSize/gl_Position.w; 
} 

片段

#version 430 

in VertexBlock 
{ 
    flat vec3 col; 
    vec3 pos; 
    vec3 normal; 
} frag_in; 

out vec4 colour; 

void main() 
{ 
    colour = vec4(frag_in.col, 1.0); 
} 

渲染

import Qt3D.Core 2.0 
import Qt3D.Render 2.0 

import "Cameras" 

RenderSettings { 
    id: root 

    property CameraSet cameraSet: CameraSet { 
     id: cameraSet 
    } 

    property real userViewWidth: 0.79 
    property real topOrthoViewHeight: 0.79 

    activeFrameGraph: Viewport { 
     id: viewport 
     normalizedRect: Qt.rect(0.0, 0.0, 1.0, 1.0) 

     RenderSurfaceSelector { 
      ClearBuffers { 
       buffers : ClearBuffers.ColorDepthBuffer 
       clearColor: theme.cSceneClear 

       NoDraw {} 
      } 

      Viewport { 
       id: userViewport 
       normalizedRect: Qt.rect(0, 0, userViewWidth, 1.0) 

       CameraSelector { 
        id: userCameraSelectorViewport 
        camera: cameraSet.user.camera 
       } 
      } 
      // Two other viewports... 
     } 
    } 
} 

实体

Entity { 
    property PointBuffer buffer: PointBuffer { 
     id: pointBuffer 
    } 

    PointsMaterial { 
     id: pointsMaterial 
     dataBuffer: pointBuffer 
    } 

    Entity { 
     id: particleRenderEntity 
     property GeometryRenderer particlesRenderer: GeometryRenderer { 
      instanceCount: buffer.count 
      primitiveType: GeometryRenderer.Points 
      geometry: PointGeometry { buffer: pointBuffer } 
     } 

     components: [ 
      particlesRenderer 
      , pointsMaterial 
     ] 
    } 
} 

回答

2

发现了问题,这是不是在我最初发布的信息。

在实体中,我有instanceCount: buffer.count,但在我的几何体中,我一次性写入整个缓冲区。因此,我有效地调整了缓冲区的大小。

解决的办法是设置instanceCount: 1

我不解此行之前,甚至删除它,但我怀疑它默认为是价值..我不明白什么正是这个会的QML文档做。

在任何情况下,真正使用这个的几何形状如SphereGeometry,它为每个点构建一个缓冲区。所以,给定一个点,它会建立顶点和索引来渲染围绕该点的球体。 (我不确定他们为什么不在几何着色器中这样做。)