本节学习目标
掌握一种很实用的优化游戏性能的方法
先看一种图
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本节内容比较简单,但是确实很实用,希望对您有用!
网友评论