vtk 在绘制球体或者其他形状的时候,如何加快绘制速度

暴走の小新 2018-01-18 01:51:23
我在vtk绘制一万个球体的时候他的速度很慢,大概要3到4秒钟才能绘制完成,师傅说这个速度太慢了,怎么才能加快绘制的速度呢?求大神指点,这是我写的代码,画出来的球体呈圆柱分布,
private void DrawSphere_Cylinder(int xyCount, int zCount, double r)
{
//计算夹角(都是弧度制)
double theta = 2 * Math.PI / xyCount;
for (int i = 0; i < zCount; i++)
{
for (int j = 0; j < xyCount; j++)
{
//坐标
//以z轴为圆柱的中心,底座在xy平面上
double x = Math.Cos(j * theta) * r;
double y = Math.Sin(j * theta) * r;
double z = i * 0.25;//每层间距

vtkSphereSource sphereSource = vtkSphereSource.New();
sphereSource.SetRadius(0.05);
sphereSource.SetCenter(x, y, z);
sphereSource.SetPhiResolution(8);
sphereSource.SetThetaResolution(16);

vtkShrinkPolyData sphereShrink = vtkShrinkPolyData.New();
sphereShrink.SetInputConnection(sphereSource.GetOutputPort());
sphereShrink.SetShrinkFactor(0.5);

vtkPolyDataMapper sphereMapper = vtkPolyDataMapper.New();
sphereMapper.SetInputConnection(sphereSource.GetOutputPort());

vtkProperty shpreProperty = vtkProperty.New();
shpreProperty.SetOpacity(1.0);//不透明度
shpreProperty.SetColor(1, 1, 0.5);
shpreProperty.SetLighting(true);

vtkActor sphereActor = vtkActor.New();
sphereActor.SetMapper(sphereMapper);
sphereActor.SetProperty(shpreProperty);

renderer.AddActor(sphereActor);
}
}
}

一万个球就要4秒了;师傅说这个速度完全不能接受;

绘制出来的效果
...全文
2227 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独的学习 2019-10-02
  • 打赏
  • 举报
回复
博主解决了吗?我也遇到同样的问题,应该怎样解决?谢谢
暴走の小新 2018-01-22
  • 打赏
  • 举报
回复
引用 22 楼 HW140701 的回复:
[quote=引用 20 楼 slk11580 的回复:] [quote=引用 18 楼 HW140701 的回复:] VTK的效率本来就低,40000个球这样绘制下来,如果好要求每一个光滑美观自然需要更多的三角面片,那么你40000个球其实可能已经在计算机中绘制了几百个三角面片了,自然慢
画球体的时候如果用gpu来计算渲染的话,能不能提高速度呢?[/quote] GPU的处理速度是CPU的几百甚至上千倍,自然是可以的[/quote] 那你知道怎么弄吗
HW140701 2018-01-21
  • 打赏
  • 举报
回复
引用 20 楼 slk11580 的回复:
[quote=引用 18 楼 HW140701 的回复:] VTK的效率本来就低,40000个球这样绘制下来,如果好要求每一个光滑美观自然需要更多的三角面片,那么你40000个球其实可能已经在计算机中绘制了几百个三角面片了,自然慢
画球体的时候如果用gpu来计算渲染的话,能不能提高速度呢?[/quote] GPU的处理速度是CPU的几百甚至上千倍,自然是可以的
暴走の小新 2018-01-19
  • 打赏
  • 举报
回复
引用 18 楼 HW140701 的回复:
VTK的效率本来就低,40000个球这样绘制下来,如果好要求每一个光滑美观自然需要更多的三角面片,那么你40000个球其实可能已经在计算机中绘制了几百个三角面片了,自然慢
画球体的时候如果用gpu来计算渲染的话,能不能提高速度呢?
HW140701 2018-01-18
  • 打赏
  • 举报
回复
VTK的效率本来就低,40000个球这样绘制下来,如果好要求每一个光滑美观自然需要更多的三角面片,那么你40000个球其实可能已经在计算机中绘制了几百个三角面片了,自然慢
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 16楼xuzuning 的回复:
为什么,我也不知道。我也是搜索来的 说是 vtk GPUVolumeRenderMapper 是通过 DirectX 访问 GPU 的
好的!我去查查!谢谢你!
xuzuning 2018-01-18
  • 打赏
  • 举报
回复
为什么,我也不知道。我也是搜索来的 说是 vtk GPUVolumeRenderMapper 是通过 DirectX 访问 GPU 的
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 14 楼 xuzuning 的回复:
不知道你用的 vtk 是否把 GPUVolumeRenderMapper 编译进去了,不过没有 directX 也是枉然
什么意思,这个不是OpenGL封装的吗?为什么要DirectX; 我用的是c#版的vtk,那个工具叫ActiViz.NET
xuzuning 2018-01-18
  • 打赏
  • 举报
回复
不知道你用的 vtk 是否把 GPUVolumeRenderMapper 编译进去了,不过没有 directX 也是枉然
xuzuning 2018-01-18
  • 打赏
  • 举报
回复
把集成显卡换成鼓励显卡,速度就上去了
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 11 楼 xuzuning 的回复:
当然,你可以减小 sphereSource.SetThetaResolution(16);的值 球表面精度低些,速度就会提高
这个我试过,并不能解决根本问题
xuzuning 2018-01-18
  • 打赏
  • 举报
回复
当然,你可以减小 sphereSource.SetThetaResolution(16);的值 球表面精度低些,速度就会提高
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
据说 vtk 是对 openGL 的封装,那你就直接 openGL 就是了 至于 GPU 就算了(openGL 本身就可利用了 GPU),要你的显卡支持才行
直接用OpenGL来做吗?这样太底层了,时间不允许;我想要找到vtk里用GPU跑程序的方法
xuzuning 2018-01-18
  • 打赏
  • 举报
回复
据说 vtk 是对 openGL 的封装,那你就直接 openGL 就是了 至于 GPU 就算了(openGL 本身就可利用了 GPU),要你的显卡支持才行
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 7楼秋的红果实 的回复:
双循环,时间复杂度O(n^2),本来耗时,你加了5个new,自然慢
这个工具画几何体的基本流程,我每次程序一跑起来cpu占用率就飙升,我觉得可能是需要把gpu 用起来才能提升渲染速度。可是不知道怎么用。
秋的红果实 2018-01-18
  • 打赏
  • 举报
回复
双循环,时间复杂度O(n^2),本来耗时,你加了5个new,自然慢
秋的红果实 2018-01-18
  • 打赏
  • 举报
回复
不知道你这个vtk有哪些功能 但我知道,可以用C#画个圆圈儿,填充下就是个球体

class circleBase
{
    createCircle();
    copyCircle();
    //.........................

}
循环体外,create一个球theCircle,填充下 for (int i = 0; i < zCount; i++) { for (int j = 0; j < xyCount; j++) { //坐标 //以z轴为圆柱的中心,底座在xy平面上 double x = Math.Cos(j * theta) * r; double y = Math.Sin(j * theta) * r; double z = i * 0.25;//每层间距 theCircle.copyCircle(); 只调整位置就可以了
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 3 楼 From_TaiWan 的回复:
没用过vtk, 不过从算法上提点建议: 绘制出一个球,能否按照“复制一个球”的方式,延半径扩展; “复制一个半径上的球”,扫一周,扩展出一个面上的球; “复制一个面上的球”,延柱体z轴扩展 ---------------------------\0
这个好像不能复制,只能一个个的创建新的对象
暴走の小新 2018-01-18
  • 打赏
  • 举报
回复
引用 2 楼 xomix 的回复:
我想你师傅想让你做的事情应该是同样大小的球体批量渲染吧。
差不多,当球体数量太多像我绘制一万个的时候,要4秒;而且在winform上进行交互的时候会很卡,是不是没有用到GPU进行渲染的原因呢?
秋的红果实 2018-01-18
  • 打赏
  • 举报
回复
没用过vtk, 不过从算法上提点建议: 绘制出一个球,能否按照“复制一个球”的方式,延半径扩展; “复制一个半径上的球”,扫一周,扩展出一个面上的球; “复制一个面上的球”,延柱体z轴扩展 ---------------------------\0
加载更多回复(2)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧