【发布时间】:2015-03-19 08:42:22
【问题描述】:
我一直在阅读有关该主题的内容,但我无法找到我的问题的具体答案。我对使用并行/多线程来提高我的游戏性能很感兴趣,但我听到了一些相互矛盾的事实。例如,多线程可能不会对游戏的执行速度产生任何改进。我
我想到了两种方法:
- 将渲染组件放入线程中。有一些事情 我需要改变,但我很清楚需要改变什么 完成。
- 使用 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;
}
}
【问题讨论】:
-
你能发布你正在考虑多线程的代码吗?
-
最佳结果取决于各部分的可并行性,以及您梳理并行性以便加以利用的能力。不调查代码就无法回答问题。
-
@MichaelB。它有点长,因为它包含多个功能,但如果有必要我会做一个 pastebin 链接。
-
感觉这个问题太笼统了。
-
@inetknght 我担心可能是这种情况。如果是这样,请随时投票关闭它。
标签: c++ multithreading optimization parallel-processing