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

2018-09-19  本文已影响90人  酷走天涯
d25be61f713a4f90754cf1b97f267efa.gif

本节学习目标

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

先看一种图

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

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

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

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

** 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

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

上一篇下一篇

猜你喜欢

热点阅读