前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SceneKit - 你必须掌握的优化性能方案

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

作者头像
酷走天涯
发布2019-06-15 11:20:11
7620
发布2019-06-15 11:20:11
举报

d25be61f713a4f90754cf1b97f267efa.gif

本节学习目标

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

先看一种图

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

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

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

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

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

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

代码语言:javascript
复制
 public convenience init(geometry: SCNGeometry?, worldSpaceDistance distance: CGFloat)

SCNLevelOfDetail(geometry: box2, worldSpaceDistance: 100) 

参数解释

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

下面是示例部分参考代码

初始化

代码语言:javascript
复制
 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
}

先创建三个几何体

代码语言:javascript
复制
  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

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

代码语言:javascript
复制
  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)

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

代码语言:javascript
复制
cameraNode.position = SCNVector3Make(0, 0, -150)

我们看一段效果图

Scenekit_17.gif

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档