gpt4 book ai didi

ios - 如何优化以获得更好的帧率?

转载 作者:搜寻专家 更新时间:2023-10-31 22:07:28 25 4
gpt4 key购买 nike

这是一款益智游戏。从屏幕截图中可以看出,屏幕上有 256 个节点,帧率徘徊在 10 FPS 左右。

我看到很多益智游戏,我认为屏幕上有数百个独立的节点,但帧速率很高……我也想达到同样的效果。根据我的代码,我可以考虑哪些优化点? (下图代码)

我实际上只是在创建一堆 SKShapeNode,将它们放入 NSArray,然后将它们作为子节点添加到 didMoveToView 上的场景

class GameScene: SKScene {

var grid: Grid! = nil

override func didMoveToView(view: SKView) {

self.grid = Grid()
self.grid.initWithParent(parent: self, rows:16, columns:8, hexagonSize:40.0)
self.grid.drawGrid()

}

override func update(currentTime: CFTimeInterval)
{
// nothing here!! why so slow..
}
}

//…

class Grid : NSObject {

// this all gets initialized later
var hexagonSize: CGFloat! = nil
var hexagonArray: NSMutableArray! = nil
var numRows: Int! = nil
var numColumns: Int! = nil
var parentScene: SKScene? = nil

// …

func drawGrid(){

//…

if(self.parentScene != nil){

for rowIdx in 0..<self.numRows {

for colIdx in 0..<self.numColumns {

//…
let hex = Hexagon()
hex.initWithParentNode(node: self.parentScene!, size: self.hexagonSize)
hex.drawAtPoint(positionPoint: hexCenter)
self.hexagonArray.addObject(hex) hex.drawAtPoint(:positionPoint)
}
}
}
}

func initWithParent(#parent: SKScene, rows: Int, columns: Int, hexagonSize: CGFloat){

self.parentScene = parent
self.numRows = rows
self.numColumns = columns
self.hexagonSize = hexagonSize
}
}


//…

class Hexagon: NSObject {

//…

var parentNode : SKNode? = nil

var size : CGFloat! = nil

var shape : SKShapeNode! = nil

func drawAtPoint(#positionPoint: CGPoint){

let diameter = self.size

let radius = diameter/2

let normal = radius * sqrt(3)/2

var path = CGPathCreateMutable()

self.shape = SKShapeNode(path: path)

let point = CGPointZero

CGPathMoveToPoint(path, nil, point.x, point.y+radius)

CGPathAddLineToPoint(path, nil, point.x+normal, point.y+(radius/2))
CGPathAddLineToPoint(path, nil, point.x+normal, point.y-(radius/2))

CGPathAddLineToPoint(path, nil, point.x, point.y-(diameter/2))

CGPathAddLineToPoint(path, nil, point.x-normal, point.y-(radius/2))
CGPathAddLineToPoint(path, nil, point.x-normal, point.y+(radius/2))

CGPathAddLineToPoint(path, nil, point.x, point.y+radius)

self.shape?.path = path
self.shape?.fillColor = SKColor.blueColor()

if(self.shape != nil && self.parentNode != nil){

self.shape.position = positionPoint
self.parentNode!.addChild(self.shape!)

}
}

func initWithParentNode(#node: SKNode, size: CGFloat){

self.parentNode = node
self.size = size

}
}

simulator screenshot

最佳答案

好吧……你是在屏幕上手动绘制……你应该让 SpriteKit 引擎负责在屏幕上绘制你的 Sprite (它有大量的优化来做得比我们通常做的更好)。

我的建议

首先扔掉你的类 GridHexagon

完成了吗?好:)

图片

  1. 获取类似 iDraw 的软件
  2. 画一个透明背景的六边形
  3. 然后导出为hexagon.png(我为你准备了image)
  4. 将其添加到 Xcode Assets 目录

六边形类

创建一个文件 Hexagon.swift 并在其中写入以下代码

import SpriteKit

class Hexagon : SKSpriteNode {
init() {
let texture = SKTexture(imageNamed: "hexagon")
super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

填充场景

现在只需创建一些 Hexagon(s) 并将它们放置在您的场景中即可。

class GameScene: SKScene {
override func didMoveToView(view: SKView) {
let hexagon0 = Hexagon()
hexagon0.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
self.addChild(hexagon0)

// add more Hexagon(s) at different positions...
}
}

结论

就是这样。 SpriteKit 将负责绘制您添加到场景中的 Sprite 。

按照这种方法,您可以在屏幕上添加大量 Sprite ,SpriteKit 将进行我们凡人永远不会知道的优化,以保持尽可能高的帧率。

(Xcode 7 和 iOS 9 的优化会更好,因为 SpriteKit 现在构建在 Metal 之上)。

希望这对您有所帮助。

关于ios - 如何优化以获得更好的帧率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com