image — Правильная модель данных для 2D Tilemap (C ++, Qt)

Я сделал небольшой редактор 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);
}
}
}
}

Это работает для карты с плиткой 100×100. Но если я хочу создать еще большие карты … время загрузки действительно невыносимо ..
Может кто-нибудь дать мне совет для лучшего представления карты тайлов? Есть ли другие удобные способы показать карту и отредактировать ячейки (плитки) внутри нее?

РЕДАКТИРОВАТЬ: 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);
}

}

0

Решение

Проблема в том, что вы показываете все, даже вещи не нужны.
Вы должны создавать только видимые элементы (элементы в некотором видимом регионе).

Другой более быстрый подход — создать собственный QGraphicsItem, который рисует карту отверстий и рисует только видимые плитки (без плиток в качестве вложенных элементов).

0

Другие решения

Других решений пока нет …