QGraphicsscene落后于150多件物品

时间:2014-06-04 14:23:39

标签: c++ performance qt qgraphicsview qgraphicsscene

我对QGraphicsScene和QGraphicsView的性能不太熟悉。我知道有一万个芯片示例效果很好,而且QGraphicsScene针对其中包含大量项目进行了优化。然而,我制造的游戏滞后了。(我需要注意的是,这是我的第一个游戏,实际上可以这样称呼)

我的主循环处理如下所示:

timer.setInterval(0);
timer.start();
connect(&timer, SIGNAL(timeout()), this, SLOT(mainloop()));

在这个主循环中我更新了所有游戏逻辑。一切似乎都没问题,但是一旦我进入全屏并且我在场景中有大约100个项目..它开始滞后并且主循环的完成需要(有时)超过33ms。除了播放器,我只有GameCollectable的对象,你可以在下面的代码中看到更新例程。这是因为我在GUI线程上有我的主循环吗?因为每个GameCollectable都是由图像渲染的?我应该尝试在自己的线程中创建mainloop吗?

如果有人可以查看我的GameCollectable课程的更新例程并告诉我为什么我的代码会产生如此多的延迟,那对你来说真的很温柔。我有一台I5 2500K处理器。

void GameCollectable::update(int t)
{
    //animationstuff
    if(t>lastframeupdate)
    {
        if(m_spawner!=NULL)
        {
            if(animindex>=m_spawner->animation_collectable_normal.get()->animationimgs.size()-1)
                animindex=0;
            m_graphicsitem->setImage( m_spawner->animation_collectable_normal.get()->getFrameImage(animindex));
            lastframeupdate=t;
            //animindex++;
        }
    }

    if(started==false)starttime=t;
    started=true;
    move(t);
}

bool GameCollectable::move(int t)
{
    float t_inc=(t-starttime)/animtime;
    //reached our destination?
    if(m_graphicsitem->pos().x()<destPos.x())
    {
        onDestination=true;
        emit signal_reached(this);
        return false;
    }
    //collided with player?
    else if(m_graphicsitem->collidesWithItem(Game::GameManager::instance()->getPlayer()->getGraphicsItem()))
    {
        Game::SoundManager::instance()->playCoinPickup(t);
        bumpedPlayer=true;
        emit signal_bumped(this);
        return false;
    }
    else
    {
        m_graphicsitem->setPos(lerp(startPos.x(),destPos.x(),t_inc),m_graphicsitem->pos().y());
        return true;
    }
    return false;
}

0 个答案:

没有答案