第一次使用SCNView渲染场景非常缓慢

3
我希望在运行时动态加载Collada文件到SceneKit中。我已经使用copySceneKitAssets生成了.DAE文件并将其放到我的服务器上。应用程序可以从服务器下载它并使用此文件来初始化SCNScene(参见http://www.the-nerd.be/2014/11/07/dynamically-load-collada-files-in-scenekit-at-runtime/)。
执行"./copySceneKitAssets"时没有错误,模型可以正确渲染。在将gameScene设置为scnView.scene之前,我调用了[scnView prepareObject:gameScene shouldAbortBlock:NULL]
问题是第一次scnView渲染gameScene时非常缓慢(几秒钟)。即使在此期间主线程被阻塞,这意味着UI无法刷新,并且有时应用程序会被iOS杀死。从第二次开始渲染场景,速度非常快,主线程也能正常工作。但如果我们删除应用程序并重新安装它,则问题再次出现。
感谢任何帮助。

哪个部分比较慢?从您的服务器下载(您应该在后台线程中执行此操作)?下载后的处理?实例化场景?根据您所尝试的描述,听起来您正在传输压缩的SCN文件而不是DAE文件(这很好!)。为什么您需要将它们在线上而不是将它们作为资源嵌入到您的应用程序中呢? - Hal Mueller
场景已经被实例化。慢的部分是在实例化场景后第一次显示场景。无论是 SCN 还是 DAE,都是一样的。我们这样做是因为资源必须在不同的时间更新。 - lusnaow
你找到解决方案了吗?我有同样的问题,轻材料的大小等并不重要。 第一次加载场景时,我从.scn中加载节点,并将其添加到场景视图中。似乎这段代码会立即执行,但是机器人模型没有显示出来,几秒钟后才会显示。在addNode -> show node in scene之间需要很长时间。 - Michał Ziobro
1个回答

2

我认为值得一看的是prepareObjects(_:withCompletionHandler)(在SCNSceneRenderer上定义),它可以在后台线程上加载资源。


正如我之前提到的,我已经调用了这个函数。但是它仍然很慢。 - lusnaow
是的,我在后台线程上调用它。这个问题只会在第一次渲染新的dae文件时出现。无论我们重新进入场景还是重新打开应用程序,它都会消失。但是,如果我们删除应用程序并重新安装它,问题又会出现。我猜想是否有像在渲染模型时SceneKit需要创建一些沙盒文件之类的东西,而这些文件只在第一次渲染时才需要创建? - lusnaow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接