Я читал по этому вопросу, но я не смог найти конкретного ответа на мой вопрос. Меня интересует использование параллелизма/многопоточности для улучшения производительности моей игры, но я слышал некоторые противоречащие факты. Например, многопоточность может не улучшить производительность игры. ЯParallelism vs Threading - Performance
Я подумал о двух способов сделать это:
- положить компонент рендеринга в нить. Есть некоторые вещи Мне нужно будет изменить, но у меня есть хорошее представление о том, что должно быть сделано.
- с использованием openMP для параллелизации функции рендеринга. У меня уже есть код для этого, поэтому это может быть проще.
Это, как оценка Uni, целевое оборудование - это компьютеры моего Uni, которые являются многоядерными (4 ядра), и поэтому я надеюсь достичь некоторой дополнительной эффективности, используя любой из этих методов.
Мой вопрос, есть поэтому: Какой из них я предпочитаю? Что обычно дает наилучшие результаты?
EDIT: Основная функция, которую я имею в виду распараллелить/многопоточную легко:
void Visualization::ClipTransBlit (int id, Vector2i spritePosition, FrameData frame, View *view)
{
const Rectangle viewRect = view->GetRect();
BYTE *bufferPtr = view->GetBuffer();
Texture *txt = txtMan_.GetTexture (id);
Rectangle clippingRect = Rectangle (0, frame.frameSize.x, 0, frame.frameSize.y);
clippingRect.Translate (spritePosition);
clippingRect.ClipTo (viewRect);
Vector2i negPos (-spritePosition.x, -spritePosition.y);
clippingRect.Translate (negPos);
if (spritePosition.x < viewRect.left_) { spritePosition.x = viewRect.left_; }
if (spritePosition.y < viewRect.top_) { spritePosition.y = viewRect.top_; }
if (clippingRect.GetArea() == 0) { return; }
//clippingRect.Translate (frameData);
BYTE *destPtr = bufferPtr + ((abs(spritePosition.x) - abs(viewRect.left_)) + (abs(spritePosition.y) - abs(viewRect.top_)) * viewRect.Width()) * 4; // corner position of the sprite (top left corner)
BYTE *tempSPtr = txt->GetData() + (clippingRect.left_ + clippingRect.top_ * txt->GetSize().x) * 4;
int w = clippingRect.Width();
int h = clippingRect.Height();
int endOfLine = (viewRect.Width() - w) * 4;
int endOfSourceLine = (txt->GetSize().x - w) * 4;
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
if (tempSPtr[3] != 0)
{
memcpy(destPtr, tempSPtr, 4);
}
destPtr += 4;
tempSPtr += 4;
}
destPtr += endOfLine;
tempSPtr += endOfSourceLine;
}
}
Можете ли вы опубликовать код, который вы рассматриваете как многопоточность? –
Лучшие результаты зависят от того, насколько параллелизуемы части и ваша способность дразнить этот параллелизм, чтобы его можно было использовать. Вы не можете ответить на вопрос, не исследуя код. –
@MichaelB. Он немного длинный, поскольку он включает в себя несколько функций, но если это необходимо, я сделаю ссылку pastebin. – MKII