• 7199阅读
  • 14回复

大家帮忙看看,如何加快程序的运行速度? [复制链接]

上一主题 下一主题
离线superwave
 
只看楼主 倒序阅读 楼主  发表于: 2010-12-02
开辟动态空间 QGraphicsItem *pnode = new QGraphicsItem[6376] (QGraphicsItem是QT里面的一个类)

scene = new QGraphicsScene(0, 0, Xmax*VisZoom, Ymax*VisZoom);

然后通过scene->addItem(&pnode)把6376个QGraphicsItem 的对象加到scene上显示,如下图:(每个小红点就是一个GraphicsItem 对象)


但是这样一来,当我同时变化6376个QGraphicsItem的大小时,程序非常慢,要半分钟才能变化完成。

问问大家如何提高运行速度啊?

谢谢
离线water_wf

只看该作者 1楼 发表于: 2010-12-02
例子里添加几万个也没见慢 啊
离线huzhiwen28

只看该作者 2楼 发表于: 2010-12-02
楼主把代码贴上来,否则,没有依据
http://blog.sina.com.cn/tonyhuzhiwen
https://github.com/huzhiwen28/
专注于工业嵌入设备开发
离线superwave
只看该作者 3楼 发表于: 2010-12-02
是不是因为我每次往scene里面添加一个node就会刷屏一次,所以就慢了?

scene->addItem(node);  这样,共需要刷屏6376次。

我该如何控制,使得所有的node全部添加到scene里面后才刷屏?
离线superwave
只看该作者 4楼 发表于: 2010-12-02

Node *pnode = new Node[6376];

    for (int i=0;i<6376;i++)
    {
        xx=MyNode.iX*VisZoom;
        yy=MyNode.iY*VisZoom;
  
        pnode.setPos(QPoint(xx,yy));
        w.setupNode2(&pnode);
    }


void iItems::setupNode2(Node *node)
{
    node->setScale(1/(float)spinBox2->value());
    scene->addItem(node);/////////////////////////////////////////
    
    scene->clearSelection();
    node->setSelected(true);
}
离线huzhiwen28

只看该作者 5楼 发表于: 2010-12-02
scene->addItem(node);

这行是不是只将第一个节点放进去啊?

w.setupNode2(&pnode);
这个是不是要改为
w.setupNode2(pnode + i);
才合适?
http://blog.sina.com.cn/tonyhuzhiwen
https://github.com/huzhiwen28/
专注于工业嵌入设备开发
离线lxbin2003

只看该作者 6楼 发表于: 2010-12-02
先 setUpdateEnabled(false)
再操作
然后再setUpdateEnabled(true)
这样是不是会快一些?
或者干脆用多线程处理,效率应该N倍提高吧。
离线superwave
只看该作者 7楼 发表于: 2010-12-02
引用第5楼huzhiwen28于2010-12-02 14:46发表的  :
scene->addItem(node);
这行是不是只将第一个节点放进去啊?
w.setupNode2(&pnode);
.......


不好意思,我不小心弄错了,我是这样写的
    for (int i=0;i<6376;i++)
    {
        xx=MyNode.iX*VisZoom;
        yy=MyNode.iY*VisZoom;
  
        pnode.setPos(QPoint(xx,yy));
        w.setupNode2(&pnode);
    }
离线huzhiwen28

只看该作者 8楼 发表于: 2010-12-02
回 7楼(superwave) 的帖子
你的代码我依旧看不懂,pnode到底是什么东西啊?
http://blog.sina.com.cn/tonyhuzhiwen
https://github.com/huzhiwen28/
专注于工业嵌入设备开发
离线superwave
只看该作者 9楼 发表于: 2010-12-03
Node *pnode = new Node[6376];
离线huzhiwen28

只看该作者 10楼 发表于: 2010-12-03
Node *pnode = new Node[6376];
pnode本就是指针, w.setupNode2(&pnode)这样调用不对,应该w.setupNode2(pnode)
http://blog.sina.com.cn/tonyhuzhiwen
https://github.com/huzhiwen28/
专注于工业嵌入设备开发
离线superwave
只看该作者 11楼 发表于: 2010-12-03
您好,我每次把代码复制上来都会显示错误,

我是这样写的:
    for (int i=0;i<6376;i++)
    {
        xx=MyNode.iX*VisZoom;
        yy=MyNode.iY*VisZoom;
  
        pnode.setPos(QPoint(xx,yy));
        w.setupNode2(&pnode);
    }
离线superwave
只看该作者 12楼 发表于: 2010-12-03
每次想变化整个视图的大小时,也需要花费很长的时间。这个好像就和不断地刷屏没关系了吧?

view = new SubGraphicsView;

void iItems::setVisZoom()
{
    view->scale(((float)(spinBox1->value()))/(float)SpinBoxValue1,((float)(spinBox1->value()))/(float)SpinBoxValue1);
    SpinBoxValue1=spinBox1->value();
}
离线water_wf

只看该作者 13楼 发表于: 2010-12-03
挺奇怪的,到群81360735,需要调试下
离线superwave
只看该作者 14楼 发表于: 2010-12-03
还是速度很慢
快速回复
限100 字节
 
上一个 下一个