gpt4 book ai didi

ios - 在 IOS 中使用线程时,assimp 无法导入 3d 模型

转载 作者:行者123 更新时间:2023-11-29 03:46:27 28 4
gpt4 key购买 nike

我正在尝试使用 IOS 中的 assimp lib 将模型导入渲染器。我的模型文件大小为 2mb;

我可以不使用线程成功导入模型。

但是当我在线程内运行代码时,assimp 无法导入。

Assimp::Importer* importer =  new Assimp::Importer();
scene = importer->ReadFile(modelPath.data,aiProcessPreset_TargetRealtime_MaxQuality);

所以如果我使用线程,这个场景基本上就变成了零。

我使用线程错误吗?

我错过了什么?

您可以从此链接查看更多代码:http://pastebin.com/aLjx7dvZ

为了保持问题的简单性,我没有发布完整的代码。

最佳答案

首先,您想要使用 openGL 的每个线程中都需要一个 EAGLContext。多个上下文将确保在处理多个线程时状态更改、绑定(bind)等不会发生冲突。例如,如果您的主线程将尝试绘制一个对象,它可能会绑定(bind)一些缓冲区,可能还会绑定(bind)一些纹理等等,后台线程将尝试加载一个对象,该对象再次必须绑定(bind)一些缓冲区,纹理......因为您无法控制在什么时间执行什么操作(因为多线程),您需要多个上下文,因此不会发生此类冲突。这意味着每次创建新线程时都需要创建一个新上下文:

EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:sharegroup]; //ignore sharegroup for now

并将其设置为线程本身的当前

[EAGLContext setCurrentContext:context];

通过这样做,就 openGL 而言,两个线程之间将没有任何关系。这解决了冲突问题,但提出了一个新问题,即您无法在后台线程上创建的资源(除了创建它的线程之外的其他地方)使用。因此,为了在后台加载对象并在主线程上使用它们,有一个称为共享组的东西。您应该只创建 1 个实例,并在创建新上下文时将其用作所有后台线程的参数(如已经提到的代码片段)。

EAGLSharegroup *sharegroup = [[EAGLSharegroup alloc] init];

EAGLContext *context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:sharegroup];

这应该可以解决您的主要问题,但查看您的代码可能还有更多问题。您需要确保在后台线程上创建的资源在完成之前不会被使用。您正在使用一些全局对象(而不是指针),您可以在其上分配新创建的资源,但稍后用相同的方法初始化数据。如果另一个线程正在使用同一指针,则可能会发生这种情况,您可能会在不幸的时候交换它,导致(在您的情况下)主线程尝试绘制未初始化的对象。现在,即使您将全局分配移到方法的末尾,如果这些资源正在使用,事情也会变得不稳定。为了正确地做到这一点,我建议您独立于任何全局变量在后台线程上加载对象,并在主线程上使用对象执行选择器,以通知它加载完成并在主线程本身上进行交换。

关于ios - 在 IOS 中使用线程时,assimp 无法导入 3d 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17698037/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com