1

我有一个使用 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);
}

代码在我的引擎渲染函数中崩溃。我确定这是因为作为 window1 实例的成员的 directx 设备被线程访问以进行加载,而主应用程序访问它以进行渲染。

你能解释一下我哪里出错了。我是使用线程的新手。

一切顺利,马丁

4

1 回答 1

0

穿线往往是披着羊皮的狼。它看起来解决了很多问题,但实际上可能导致的问题比他们解决的问题多得多。幸运的是,您拥有许多人认为使用附加线程的有效场景。

不久前我自己编写了一个类似的加载器,您的问题看起来确实是您正在访问 Window1 而它在其他地方使用。基本上,当线程运行时,您的主线程是否对 Window1 执行任何操作。如果是这样,那将表明它是问题所在。

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

在开始听起来你正在处理的更大规模的场景之前,最好先对线程进行一些进一步的阅读。使用线程是软件设计中比较繁琐和复杂的领域之一,从经验中你不能很好地学习它们。

于 2013-10-15T13:15:10.050 回答