专栏首页每日一篇技术文章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 条评论
登录 后参与评论

相关文章

  • ARKit多机画面同步解决方案,原理分析,技术讲解

    由于所有玩家的坐标系的y轴都是和水平面垂直的,所以我们看做坐标系的位置相对标定点的位置,是有沿着y轴旋转了一个角度,然后平移一个值所得,只要计算出两个坐标系之间...

    酷走天涯
  • SceneKit - AR换装应用解决方案

    由于今年是AR元年,在苹果推出的ARKit框架之后,各行各业都在马不停蹄的玩起了创意,希望在自己的应用基础上加入AR的元素

    酷走天涯
  • OpenGL ES _ 高级03_调试工具

    酷走天涯
  • JustMock .NET单元测试利器(二)JustMock基础

    JustMock API基础 Mock是Telerik®JustMock框架中的主要类。Mock用于创建实例和静态模拟,安排和验证行为。 本文将介绍 “Mock...

    码农阿宇
  • 代码写了那么多,你搞明白yield是个啥没?

    本文作者:IMWeb 否子戈 原文出处:IMWeb社区 未经同意,禁止转载 ES6真是颠覆JavaScript的东西,随便翻一个新特性出来,就让自以为...

    IMWeb前端团队
  • 代码写了那么多,你搞明白yield是个啥没?

    ES6真是颠覆JavaScript的东西,随便翻一个新特性出来,就让自以为是的老古董们傻眼跳楼。在之前接触ember.js的时候,接触到了yield,嫩是半天没...

    IMWeb前端团队
  • JS-检测浏览器类型及版本

    xing.org1^
  • SAP HANA技术基础知识

    根据SAP的字面意思理解,SAP HANA是硬件和和软件组合起来一个解决方案,容许客户分析大量的数据,而且是以接近Real Time的方式来同步数据,不需要花费...

    用户5495712
  • 我是怎么让全国最大的儿童失踪预警平台流量掉底的

    去年底CCSER(儿童失踪预警平台)终于完成了大量前期工作,准备开始发力面向全国用户做推广,作为互联网老兵,我们深知要做一个面向海量用户的大平台需要面临巨大的技...

    黄希彤
  • 区块链多币种钱包开发,交易平台开发,抵押借贷平台开发

    区块链在经历交易平台,公链,区块链游戏的热潮之后,下一轮该轮到谁了呢?要知道,交易平台是用户交易,公链则是一个独立的链条,区块链游戏则是挑起用户的趣味心,接下来...

    电微13823115027

扫码关注云+社区

领取腾讯云代金券