我一直在閱讀這個主題,但是我一直沒有找到具體的答案來解決我的問題。我有興趣使用並行/多線程來提高我的遊戲性能,但我聽到了一些矛盾的事實。例如,多線程可能不會對遊戲的執行速度產生任何改進。我並行與線程 - 性能
我已經想到了兩種方法可以做到這一點:
- 將呈現組件到一個線程。有一些事情 我需要改變,但我有一個好主意,需要做什麼 。
- 使用openMP來並行渲染功能。我已經編寫了代碼,因此這可能更容易。
這是一個Uni評估,目標硬件是我的Uni計算機,它是多核(4核),因此我希望使用其中任何一種技術來獲得額外的效率。
因此,我的問題如下:我應該選擇哪一個?通常會產生最好的結果?
編輯:主要功能我的意思是並行/多線程遠:
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;
}
}
你可以發佈你正在考慮多線程的代碼嗎? – 2015-01-20 23:23:30
最好的結果取決於這些部件是如何並行化的,以及你梳理出並行性的能力,以便它可以被利用。沒有調查代碼就無法回答問題。 – 2015-01-20 23:29:34
@MichaelB。它有點長,因爲它包含多種功能,但如果有必要,我會製作一個pastebin鏈接。 – MKII 2015-01-20 23:30:09