如何在directx中创建加载程序线程

时间:2013-10-15 12:37:24

标签: c++ multithreading directx posix

我有一个使用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实例的成员)以供加载。

你能不知道我哪里出错了。我是新手使用线程。

一切顺利, 马丁

1 个答案:

答案 0 :(得分:0)

穿线往往是一件披着羊皮的狼。它看起来解决了很多问题,但实际上可以解决比他们解决的问题更多的问题。幸运的是,你有许多人认为使用额外线程的有效场景。

我自己写了一个类似的加载器,你的问题看起来确实是你在其他地方使用它时访问Window1。基本上,当线程运行时,你的主线程是否对Window1做了什么。如果是这样,那就表明它是问题。

我发现的解决方案是将数据存储与渲染器正确分开。您可以将数据加载到线程中的存储中。完成后,将存储中的信息传递给线程末尾的主线程(或稍后直接在主线程中移动)。这样可以避免在线程中依赖于Window1对象。

在开始更大规模的场景之前,先对线程做一些进一步的阅读是个好主意,听起来你正在努力。使用线程是软件设计中较为繁琐和复杂的领域之一,根据经验,您无法很好地学习它们。