美文网首页
SceneKit - 你必须掌握的优化性能方案

SceneKit - 你必须掌握的优化性能方案

作者: 酷走天涯 | 来源:发表于2018-09-19 09:27 被阅读90次
    d25be61f713a4f90754cf1b97f267efa.gif

    本节学习目标

    掌握一种很实用的优化游戏性能的方法

    先看一种图

    B9A198FB-AE1F-429C-B999-1F4063FAC010.png

    第一个壶的表面是由256多边形组成的
    第二个壶的表面由1024个多边形组成的
    第三个壶的表面是由14400个表面组成的

    我们在渲染游戏模型的时候,如果这个模型特别精致,占的内存必然也会多,这里有一个问题?如果在离照相机很远的地方加载一个面很多和很少的模型,其实对于我们的视觉感受其实差不多,那么有没有一种办法,能够让我们在模型离照相机远的时候,渲染精度小的模型,当照相机靠近模型的时候渲染精度高的模型,这样就能大大节省内存,提高渲染性能?

    接下来就是今天的重要内容?

    • SCNLevelOfDetail
      SCNGeometry有一个属性levelsOfDetail,这个属性就能完成我们上述的需求

    ** 1.如何创建SCNLevelOfDetail对象**

     public convenience init(geometry: SCNGeometry?, worldSpaceDistance distance: CGFloat)
    
    SCNLevelOfDetail(geometry: box2, worldSpaceDistance: 100) 
    

    参数解释

    worldSpaceDistance 当摄像机距离模型的距离大于worldSpaceDistance的值的时候,节点就会渲染指定的geometry

    下面是示例部分参考代码

    初始化

     func initSCNView(){
      let scnView = SCNView(frame: self.view.bounds)
      self.view.insertSubview(scnView, at: 0)
      scnView.scene = SCNScene()
      self.scene = scnView.scene
       // 创建照相机节点
       cameraNode = SCNNode()
       cameraNode.camera = SCNCamera()
       cameraNode.camera?.automaticallyAdjustsZRange = true
       cameraNode.position = SCNVector3Make(0, 0, 0)
       scnView.scene?.rootNode.addChildNode(cameraNode)
       scnView.backgroundColor = UIColor.black
       scnView.allowsCameraControl = true
    }
    

    先创建三个几何体

      let box1 = SCNBox(width: 10, height: 10, length: 10, chamferRadius: 0)
       box1.firstMaterial?.diffuse.contents = UIColor.red
      let box2 = SCNBox(width: 10, height: 10, length: 10, chamferRadius: 3)
      box2.firstMaterial?.diffuse.contents = UIColor.green
      let box3 = SCNBox(width: 10, height: 10, length: 10, chamferRadius: 5)
       box3.firstMaterial?.diffuse.contents = UIColor.purple
    

    设置自定替换渲染模型,提高渲染性能

      let levelD1 = SCNLevelOfDetail(geometry: box2, worldSpaceDistance: 100) // 模型离照相机的距离大于等于100
      let levelD2 = SCNLevelOfDetail(geometry: box3, worldSpaceDistance: 50) // 模型离照相机的距离大于等于10
      let boxNode = SCNNode(geometry: box1)
      boxNode.geometry?.levelsOfDetail = [levelD1,levelD2]
      boxNode.position = SCNVector3Make(0, 0, -200)
    self.scene.rootNode.addChildNode(boxNode)
    

    你可以通过改变照相机离物体的距离来查看效果

    cameraNode.position = SCNVector3Make(0, 0, -150)
    

    我们看一段效果图

    Scenekit_17.gif

    本节内容比较简单,但是确实很实用,希望对您有用!

    相关文章

      网友评论

          本文标题:SceneKit - 你必须掌握的优化性能方案

          本文链接:https://www.haomeiwen.com/subject/zcdoqxtx.html