Я сделал небольшой редактор 2D-уровней, в котором вы можете создавать карты на основе 2D-тайлов. Однако производительность внутри моего приложения действительно очень плохая. Сейчас думаю начать все заново.
Проблема в том, что в настоящее время я использую QGraphicsItem для представления одной плитки внутри QGraphicsScene. Плитка имеет некоторые свойства, в том числе изображение. Когда создается карта, я создаю элемент для каждой плитки, который рисует изображение для каждой плитки... что в основном представляет собой множество графических элементов и замедляет работу всего приложения. Это функция, которая заполняет карту после ее создания:
for(int i=0;i<map->m_rows;i++)
{
for(int j=0;j<map->m_cols;j++)
{
Tile* thetile=map->getAt(i,j);
if(thetile)
{
if(map->getType()==twoditor::RECTANGLETILE)
{
QGraphicsItem* item= new TileGraphicsItem(thetile);
m_scene->addItem(item);
}
else if(map->getType()==twoditor::HEXAGONTILE)
{
QGraphicsItem* item= new HexagonGraphicsItem(thetile);
m_scene->addItem(item);
}
}
}
}
Это работает для карты с тайлами 100x100. Но если я хочу создать еще большие карты... время загрузки действительно невыносимо... Может ли кто-нибудь дать мне совет для лучшего представления тайловой карты? Есть ли другие удобные способы отображения карты и редактирования ячеек (тайлов) внутри нее?
РЕДАКТИРОВАТЬ: TileGraphicItem
функция рисования:
void TileGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,QWidget *widget){
setZValue(0);
if(!m_thetile->getImage().isNull())
{
painter->drawImage(0,0,m_thetile->getImage());
}
QPainterPath circle_path;
QRect duwagrect(boundingRect().x(),boundingRect().y(),boundingRect().width(),boundingRect().height());
circle_path.addRect(duwagrect);
m_pen.setStyle(Qt::SolidLine);
m_pen.setColor(Qt::black);
m_pen.setWidth(1);
painter->setPen(m_pen);
painter->drawPath(circle_path);
if(m_thetile->getProperty()->getBlocks())
{
QPainterPath circle_path;
QRect duwagrect(boundingRect().x()+2,boundingRect().y()+2,boundingRect().width()-3,boundingRect().height()-3);
circle_path.addRect(duwagrect);
m_pen.setStyle(Qt::DotLine);
m_pen.setColor(Qt::red);
m_pen.setWidth(2);
painter->setPen(m_pen);
painter->drawPath(circle_path);
}
if(this->isSelected())
{
QPainterPath circle_path;
QRect duwagrect(boundingRect().x()+2,boundingRect().y()+2,boundingRect().width()-3,boundingRect().height()-3);
circle_path.addRect(duwagrect);
m_pen.setStyle(Qt::SolidLine);
m_pen.setColor(Qt::green);
m_pen.setWidth(3);
painter->setPen(m_pen);
painter->drawPath(circle_path);
}
if(option->state & QStyle::State_MouseOver)
{
QPainterPath circle_path;
QRect duwagrect(boundingRect().x()+2,boundingRect().y()+2,boundingRect().width()-3,boundingRect().height()-3);
circle_path.addRect(duwagrect);
m_pen.setStyle(Qt::SolidLine);
m_pen.setColor(Qt::cyan);
m_pen.setWidth(2);
painter->setPen(m_pen);
painter->drawPath(circle_path);
}
}
TileGraphicsItem
? - person epsilon   schedule 20.12.2013QTimer
(вероятно, с интервалом 0, чтобы это происходило так быстро, как это может сделать цикл событий Qt), чтобы создавать элементы небольшими партиями, чтобы избежать зависания графического интерфейса. - person hyde   schedule 20.12.2013map->getAt(i,j)
, убедитесь, что это постоянное время. Если вы используетеQMap
(получение значения O(log N)), рассмотрите возможность переключения наQHash
(получение значения O(1)). - person hyde   schedule 20.12.2013