我有一个游戏引擎,它使用Directx 9进行渲染。我希望能够在主更新和渲染循环执行的同时加载精灵图形。目前,引擎有一个主更新和渲染循环,所以在此进行的任何加载都将在图形加载时暂停主循环。
我正在寻找POSIX线程来做这件事。我已经创建了线程函数并包含了互斥锁,但代码在运行时会崩溃。
以下是线程函数:
void GameApp::InternalThreadEntry()
{
pthread_mutex_lock (&mutex);
for(int i = 0; i < MAX_NUMBER; i++)
{
test_loader_sprites[i].loadImage(window1,"Test_Image.tga");
}
has_finishd_loading = true;
pthread_mutex_unlock (&mutex);
}代码在我的引擎渲染函数中崩溃。我确信这是因为directx设备是window1实例的成员,它被线程访问以加载,而主应用程序访问它以进行呈现。
你能说明一下我哪里出错了吗?我是个使用线程的新手。
万事如意,马丁
发布于 2013-10-15 21:15:10
穿线常常是一只穿着羊皮的狼。它看起来解决了这么多问题,但实际上可能导致的问题比他们解决的问题多得多。幸运的是,您有许多人认为有效的方案可以使用额外的线程。
我之前写过一个类似的加载器,你的问题看起来确实是你正在访问Window1,而它却在其他地方被使用。基本上,你的主线程会在线程运行时对Window1做些什么吗?如果是这样,那么这就表明这就是问题所在。
我找到的解决方案是适当地将数据存储与渲染器分开。您可以将数据加载到线程中的存储区。完成后,将存储中的信息传递给线程末尾的主线程(或稍后直接在主线程中移动它)。这避免了对线程中的Window1对象的依赖。
在开始一个更大规模的场景之前,做一些关于线程的进一步阅读将是一个好主意。使用线程是软件设计中比较繁琐和复杂的领域之一,根据经验,您无法很好地学习它们。
https://stackoverflow.com/questions/19381428
复制相似问题