【发布时间】:2015-06-24 16:43:22
【问题描述】:
我有一个 CPU 密集型任务,我希望它使用更少的 CPU 并占用更多时间。
我在启动时将大量 SCNNode 加载到场景中。它会占用大量内存,我希望它能够以安全的速度运行,而不是拖慢我的系统或可能导致系统崩溃。
这是我用来加载节点的代码。
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void){
NSLog(@"Start Loading Level");
SCNNode *cameraNode = [SCNNode node];
cameraNode.camera = [SCNCamera camera];
cameraNode.camera.zFar = 5000;
cameraNode.position = SCNVector3Make(0, 3000, 0);
cameraNode.rotation = SCNVector4Make(1, 0, 0, -M_PI_2);
[scene.rootNode addChildNode:cameraNode];
for (int i = 0; i < 100000; i++)
{
int side = 3000;
SCNNode *node = [SCNNode node];
node.geometry = [SCNBox boxWithWidth:1 height:1 length:1 chamferRadius:0];
node.position = SCNVector3Make(arc4random_uniform(side) - side / 2.0,
0,
arc4random_uniform(side) - side / 2.0);
[scene.rootNode addChildNode:node];
}
dispatch_async(dispatch_get_main_queue(), ^(void){
NSLog(@"Finished");
});
});
以下是统计数据:
【问题讨论】:
-
SceneKit 必须渲染这么多节点,我会更加专注。 100000 个节点非常庞大。
-
这是一个测试用例。我可以使用我自己项目中的代码,但这似乎明白了这一点。
-
我建议在 dispatch_async() 中使用带有 stride 的 dispatch_apply() 而不是 for(;;) 来同时创建节点。
-
感谢您的提示,但在 cpu 使用方面根本没有帮助。
-
你确定它不会在你有一些竞争任务时自动使用正确的时间吗?如果是这样,您可以尝试定期调用 usleep() 或 sched_yield,但不确定它们如何与 GCD 交互。
标签: objective-c scenekit