专栏首页每日一篇技术文章SceneKit - 你必须掌握的优化性能方案

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你必须要掌握的Android冷启动优化

    事件发生在发包上线的前两天,在某某云进行移动测试时,提示冷启动速度低于平均值的问题,之前自己也曾尝试过优化,但是发现效果并不是很明显,作为一个有追求的开发者,趁...

    用户1269200
  • 必须掌握的 MySQL 优化原理

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型…

    PHP开发工程师
  • 9 个可以快速掌握的 Java 性能调优技巧,必须掌握!

    大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论。好吧,这也不完全错。优化一个应用做到性能最优化可能不是件容易的任务,但是这并不意味...

    芋道源码
  • 必须掌握的30种SQL语句优化

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    动力节点Java学院
  • 【优化】949- 你必须知道的图片性能优化方式

    前言:其实图片优化网上有非常多的方案,这份初探里面做的更多的是从不同方向进行的探索~

    pingan8787
  • 你必须懂的前端性能优化

    对于 DNS 解析和 TCP 连接两个步骤,我们前端可以做的努力非常有限。相比之下,HTTP 连接这一层面的优化才是我们网络优化的核心。

    ConardLi
  • 你必须懂的前端性能优化

    对于 DNS 解析和 TCP 连接两个步骤,我们前端可以做的努力非常有限。相比之下,HTTP 连接这一层面的优化才是我们网络优化的核心。

    张炳
  • 【优化】356- 你必须懂的前端性能优化

    对于 DNS 解析和 TCP 连接两个步骤,我们前端可以做的努力非常有限。相比之下,HTTP 连接这一层面的优化才是我们网络优化的核心。

    pingan8787
  • VR+全景播放器+头控讲解-01

    近两年随着AR/VR逐渐火热,企业为了给自己的产品中加入新的元素,有可能会将3D元素添加到应用中去,对于IOS 工程师,你有三种选择 OpenGL ES / M...

    酷走天涯

扫码关注云+社区

领取腾讯云代金券