我对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;
}