我有一个使用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实例的成员)以供加载。
你能不知道我哪里出错了。我是新手使用线程。
一切顺利, 马丁
答案 0 :(得分:0)
穿线往往是一件披着羊皮的狼。它看起来解决了很多问题,但实际上可以解决比他们解决的问题更多的问题。幸运的是,你有许多人认为使用额外线程的有效场景。
我自己写了一个类似的加载器,你的问题看起来确实是你在其他地方使用它时访问Window1。基本上,当线程运行时,你的主线程是否对Window1做了什么。如果是这样,那就表明它是问题。
我发现的解决方案是将数据存储与渲染器正确分开。您可以将数据加载到线程中的存储中。完成后,将存储中的信息传递给线程末尾的主线程(或稍后直接在主线程中移动)。这样可以避免在线程中依赖于Window1对象。
在开始更大规模的场景之前,先对线程做一些进一步的阅读是个好主意,听起来你正在努力。使用线程是软件设计中较为繁琐和复杂的领域之一,根据经验,您无法很好地学习它们。