加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 场景套件性能与立方体测试

发布时间:2020-12-14 05:20:10 所属栏目:百科 来源:网络整理
导读:在学习游戏的3D图形编程时,我决定使用Scene Kit 3D API开始简单.我的第一个游戏目标是建立一个非常简单的模拟MineCraft.一个只是立方体的游戏 – 它有多难. 下面是一个循环,我写了一个100 x 100立方体(10,000),FPS表现是糟糕的(?20 FPS).我的初始游戏目标对
在学习游戏的3D图形编程时,我决定使用Scene Kit 3D API开始简单.我的第一个游戏目标是建立一个非常简单的模拟MineCraft.一个只是立方体的游戏 – 它有多难.

下面是一个循环,我写了一个100 x 100立方体(10,000),FPS表现是糟糕的(?20 FPS).我的初始游戏目标对于场景套件来说太多了,还是有更好的方法呢?

我已经阅读了StackExchange上的其他主题,但不觉得他们回答了我的问题.将暴露的表面块转换为单个网格将不起作用,因为SCNGeometry是不可变的.

func createBoxArray(scene : SCNScene,lengthCount: Int,depthCount: Int) {
    let startX : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) / 2.0
    let startY : CGFloat = 0.0
    let startZ : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) / 2.0

    var currentZ : CGFloat = startZ

    for z in 0 ..< depthCount {
        currentZ += CUBE_SIZE + CUBE_MARGIN

        var currentX = startX
        for x in 0 ..< lengthCount {
            currentX += CUBE_SIZE + CUBE_MARGIN

            createBox(scene,x: currentX,y: startY,z: currentZ)
        }
    }
}


func createBox(scene : SCNScene,x: CGFloat,y: CGFloat,z: CGFloat) {
    var box = SCNBox(width: CUBE_SIZE,height: CUBE_SIZE,length: CUBE_SIZE,chamferRadius: 0.0)
    box.firstMaterial?.diffuse.contents = NSColor.purpleColor()

    var boxNode = SCNNode(geometry: box)
    boxNode.position = SCNVector3Make(x,y,z)
    scene.rootNode.addChildNode(boxNode)
}

更新12-30-2014:
我修改了代码,以便创建一次SCNBoxNode,然后通过以下方式创建100 x 100数组中的每个附加框:

var newBoxNode = firstBoxNode.clone()
newBoxNode.position = SCNVector3Make(x,z)

这种变化似乎将FPS增加到?30fps.其他统计信息如下(从SCNView中显示的统计信息):

10K(我假设这是绘制电话?)
120K(我假设这是脸)
360K(假设这是顶点数)

大部分运行循环在渲染(我估计98%).总循环时间为26.7ms(ouch).我运行在Mac Pro 2013年底(6芯/双D500 GPU).

鉴于MineCraft风格的游戏具有根据玩家操作而不断变化的风景,我看不到我可以在Scene Kit的范围内进行优化.一个很大的失望,因为我真的很喜欢这个框架.我很乐意听到有人提出如何解决这个问题的想法 – 没有,我被迫用OpenGL.

更新12-30-2014 @ 2:00 pm ET:
使用flattenedClone()时,我看到性能提升显着. FPS现在是60fps,甚至更多的盒子和两个绘图电话.然而,适应动态环境(如MineCraft支持)仍然是有问题的 – 见下文.

由于数组会随着时间的推移而改变组合,因此我添加了一个keyDown处理程序,以便将现有的更大的盒子数组添加到现有的并且定时的添加盒子数组之间的区别,导致更多的调用,而不是添加为flattenedClone.这是我发现的:

在keyDown上,我添加了另外一个120 x 120盒的数组(14,400盒)

// This took .0070333 milliseconds
scene?.rootNode.addChildNode(boxArrayNode)
// This took .02896785 milliseconds
scene?.rootNode.addChildNode(boxArrayNode.flattenedClone())

调用flattenedClone()再次比添加数组慢4倍.

这导致两个绘图调用具有293K面和878K个顶点.我还在玩这个,如果我找到任何新东西,将会更新.底线,随着我的额外测试,我仍然觉得Scene Kit的不变的几何约束意味着我无法利用框架.

正如你提到的Minecraft,我认为值得看看它是如何工作的.

我没有技术细节或代码示例给你,但一切都应该是相当直截了当的:

你有没有在网上玩过minecraft,而且没有加载地形可以让你看透?那是因为里面没有几何.

假设我有一个2x2x2数组立方体.这使得2 * 2 * 2 * 6 * 2 = 96个三角形.

但是,如果您从相机的角度测试并绘制可见的多边形,也许通过测试法线(容易从立方体),这个数字可以下降到48个三角形.

如果您找到一种方法来查看哪些面孔被其他人遮住(这不应该太难,要么考虑使用平面,夸张的,基于网格的面孔),您只能绘制这些面孔.那就是我们画八到八角三角形.这是高达90%的优化.

如果你想要真正深入,你甚至可以组合面孔,使一个单一的N-gon从可见的平坦的面孔.如果您创建一种新的方法来生成几何,可以组合两个以前的方法并在同一平面上测试相邻的可见面,您可以这样做.

如果你成功了,我们要说的是2到6个多边形,而不是96个,来渲染8个立方体.

请注意,最后一个方法仅在您的块相互接触时才起作用.

可能有大量的Minecraft像渲染器的文件,几个谷歌会帮你弄清楚!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读