繁体   English   中英

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

[英]How to create a loader thread in directx

我有一个使用Directx 9进行渲染的游戏引擎。 我希望能够在执行主要更新和渲染循环时加载Sprite图形。 当前,引擎具有一个主更新和渲染循环,因此在此过程中进行的任何加载都会在图形加载时暂停主循环。

我一直在寻找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设备以进行加载,而主应用程序则访问了该设备以进行渲染。

你能告诉我即时错误在哪里。 我是新来使用线程。

祝一切顺利,马丁

穿线通常是披着羊皮的狼。 它看起来可以解决很多问题,但实际上造成的问题远远超过了解决的问题。 幸运的是,您有许多人相信使用附加线程的有效方案。

前一段时间我自己编写了一个类似的加载器,您的问题似乎确实是您在访问Window1时正在其他地方使用它。 基本上,您的主线程在Window1运行时是否对Window1做任何事情。 如果是这样,那将表明这是问题所在。

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

在开始听起来正在努力的更大规模的场景之前,最好对线程做一些进一步的阅读。 使用线程是软件设计中比较棘手和复杂的领域之一,并且从经验中您可能无法充分了解它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM