【发布时间】: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