Direct2D против GDI + без выделенной видеокарты - PullRequest
1 голос
/ 27 мая 2020

Пишу игру в бильярд в GDI +. Я потратил на это кучу времени, и моя работа оставляет желать лучшего. У меня в среднем около 13 кадров в секунду, когда мне действительно нужно 50-60. Я начал оптимизировать свой код, но мои самые узкие места не выглядят так, как будто они могут стать намного лучше. Простое рисование и заливка нескольких полигонов занимает до 20 мс.

Я читал, что GDI + не работает близко к оборудованию для повышения производительности, в то время как Direct2D работает. Поскольку у меня нет выделенной видеокарты, я не уверен, что увижу какой-либо выигрыш в производительности, если бы вместо этого переписал проект в Direct2D. Это правда? Я был бы готов сделать это, но я не хочу тратить часы на его переписывание, если нет очень хороших шансов, что производительность будет лучше.

EDIT Эта функция - мое самое узкое место. Я использовал std :: clock для тайм-аута различных сегментов функции. Я пометил разные сегменты как комментарии.

В среднем, для прорисовки сегмента 1 требуется 9 мсек, для сегмента 2 - 8 мсек, а для сегмента 3 - 1,5 мсек. Я предполагаю, что сегмент 1 занимает некоторое время, потому что он использует TextureBru sh, который использует изображение. Сегмент 2 представляет собой многоугольник с 25 вершинами. Я действительно не знаю, смогу ли я сократить это число. Что еще я могу сделать?

void CTable::Draw(Gdiplus::Graphics* graphics)
{
    // Segment 1
    graphics->FillRectangle(&woodBrush, mTLTable.X, mTLTable.Y, mLenTable, mWidTable);

    // Segment 2
    graphics->FillRectangle(&felt, mTLFelt.X, mTLFelt.Y, mFeltLen + 2 * mRailWid, mFeltWid + 2 * mRailWid);
    graphics->DrawPath(&feltBorder, &mFelt);

    // Segment 3
    graphics->FillPath(&pocketBrush, &mTLPocket);
    graphics->FillPath(&pocketBrush, &mBRPocket);
    graphics->FillPath(&pocketBrush, &mTRPocket);
    graphics->FillPath(&pocketBrush, &mBLPocket);
    graphics->FillPath(&pocketBrush, &mTMPocket);
    graphics->FillPath(&pocketBrush, &mBMPocket);
}

Вот как создается мой графический объект. Графический объект передается в функцию OnDraw, которая вызывает функцию Draw (которая принимает графический объект в качестве аргумента) для каждого игрового объекта.

void CChildView::OnPaint()
{
    CPaintDC paintDC(this);     // device context for painting
    CDoubleBufferDC dc(&paintDC); // device context for painting
    Graphics graphics(dc.m_hDC);    // Create GDI+ graphics context
    mGame.OnDraw(&graphics);
    ...
}
...