【问题标题】:pthread slower than no thread at allpthread 比没有线程慢
【发布时间】:2012-08-23 00:32:37
【问题描述】:

您好,我尝试将线程添加到我的 Towerdefence 以使其更快,但现在速度变慢了。

代码结构很简单

主要以 sdl opengl init 和 init 开头。然后游戏循环。 没有线程顺序: 1:键盘鼠标事件优先 2:游戏管理器 3:绘制GlScene

gameManager 计算一切:移动怪物,攻击怪物,创建攻击动画和声音,检查你是赢还是输,如果波完成,如果速度模式开启,怪物产卵和功能运行 2 次。以及其他一些小功能。

绘图功能使用所有数据来绘制一切。绘图功能修改数据为0次

我使用的 CPU 是四核的,这是视觉部分 第一步在 main 中初始化线程的东西

int main ( int argc, char** argv )
{
 pthread_t t_engine;
 pthread_attr_t attr;
 pthread_attr_init(&attr);
 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

然后是所有其他的初始化内容和游戏循环的开始 然后从 sdl 事件切换开始(仍在游戏循环中):

//calculate everything if we are in playing gamestate
    if(id == MODE_PLAY)
    {
        rc = pthread_create(&t_engine, &attr, gameManager, (void *)t);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
        //gameManager((void *)t);
    }

    //draw everything
    DrawGLScene();

if(id == MODE_PLAY)
    {
        rc = pthread_join(t_engine, &status);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

游戏管理器:

void *gameManager(void *t)
{
  //then lot of stuff
  //function ending like this
  pthread_exit((void*) t);
}

ps:我使用的是 Windows 7,我的 ide 是代码块,我使用 gnu gcc 编译器 pps:我也尝试过互斥锁、sem 和其他东西,但没有真正的区别 感谢您花时间帮助我(=

【问题讨论】:

  • 线程不是你扔给你的代码以使其更快的灵丹妙药,你必须计划并理解你在做什么。我建议退后一步,先阅读一下。
  • 您的程序运行多长时间?主线程和衍生线程是否共享大量数据?它们是如何同步的?这个问题无法用以下任何方式来回答:与许多其他功能一样,您的里程会有所不同
  • 我找到的大多数关于 pthread 的教程都是非常基础的,不会谈论很多东西。但我可以告诉你,绘图函数读取了大量由 gameManager 操作的数据。我从来没有从中得到任何错误。绘图功能什么也不写。
  • 您需要了解什么是慢,以及为什么,才能让它更快!
  • 从发布的代码看来,您在游戏事件循环的每次迭代中都会生成一个线程,然后等待线程退出。如果是这样的话,那就难怪事情比以前慢了......每秒产生一个线程 30-60 次(并等待它每次退出)肯定会减慢速度。

标签: c++ multithreading thread-safety pthreads


【解决方案1】:

这点来自你对问题的解释:

然后是所有其他的初始化内容和游戏循环的开始

让我相信执行上述pthread_create()/pthread_join() 的代码的 sn-p 是在循环中完成的。

如果是这种情况,请意识到重复创建/销毁线程的成本很高。您需要考虑在您的gameManger 对象中放置一个游戏循环,并使用信号量、条件变量或线程屏障等方式将该循环与执行DrawGLScene() 的循环同步。除了使用线程终止作为同步技术之外,几乎没有其他任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 2014-10-28
    • 2021-01-01
    • 2021-12-14
    • 2012-09-05
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多