Xcode Mac OS X El Capitan和多个精灵套件SKView
使用El Capitan和Xcode 7.2在Mac上开发: 如果我有一个只有一个窗口的项目,它有一个Xcode Mac OS X El Capitan和多个精灵套件SKView,xcode,macos,performance,sprite-kit,Xcode,Macos,Performance,Sprite Kit,使用El Capitan和Xcode 7.2在Mac上开发: 如果我有一个只有一个窗口的项目,它有一个SKScene用于SpriteKit,那么我将获得所需的60 fps,一切都按预期进行。但是,一旦我定义了第二个窗口,其中包含一个SKScene,那么我的第一个窗口中只有30 fps,即使第二个窗口根本没有使用,甚至没有定义第二个窗口的引用出口。第二个窗口仅存在于main menu.xib中,根本不使用 我需要四个Sprite工具包窗口,其中一个场景用于我的项目,因此我的更新性能非常差。约塞米蒂
SKScene
用于SpriteKit
,那么我将获得所需的60 fps,一切都按预期进行。但是,一旦我定义了第二个窗口,其中包含一个SKScene
,那么我的第一个窗口中只有30 fps,即使第二个窗口根本没有使用,甚至没有定义第二个窗口的引用出口。第二个窗口仅存在于main menu.xib
中,根本不使用
我需要四个Sprite工具包窗口,其中一个场景用于我的项目,因此我的更新性能非常差。约塞米蒂的程序运行得很好,但我一在El Capitan运行它们,这个问题就出现了
我很幸运能得到任何建议。在旧的Xcode版本和最新的Xcode版本(7.2)中,问题是相同的。我已经编译了几个月前的最终程序和新的程序,它们都有相同的问题,所以我认为这与Xcode无关,而是与El Capitan Mac OS有关
当将SKView
设置为“核心动画层”时,在Xcode“main menu.xib
”对话框页面的“查看效果检查器”中,选中所有SKView
设置为“核心动画层”,那么对于小动画来说一切正常。由于场景中的对象太多,60 fps无法录制时,视图仅每秒更新一次,这看起来很可怕。在约塞米蒂,场景每秒更新30次,这对我来说已经足够了
因为这不依赖于Xcode版本,所以苹果似乎已经改变了一些东西来“优化”屏幕重画,如果不能达到60 fps,那么绘图就不能达到30 fps或任何可能的速度,而只能达到1 fps。我还在“属性检查器”页面上尝试了“可以同时绘制”,但这一点都没有区别。我使用新的8核Mac Pro和D700图形。所以这不应该是原因
我还尝试使用myView.frameInterval=30
限制屏幕更新,我希望每秒只进行两次更新。但这个命令似乎毫无用处。myView.allowsttransparency=…
生成异常,不管该异常是真是假myView.asynchronous=true
使更新与约塞米蒂一样平滑。但是需要30秒左右的时间才能下拉菜单(当然,节点数很大),您无法使用该程序。在结果中,这与Xcode中的“可以并发绘制”选项不同
是否可以更改为Yosemite渲染,因为所有描述的选项似乎都不是最优的
如何处理大量节点计数或限制更新速率,以便通过菜单轻松退出程序?我现在开发了一种解决方法。通过一些额外的代码行,我在约塞米蒂和El Capitan得到了相同的结果。埃尔卡皮坦的表演速度大约是约塞米蒂的两倍
“SKView
”必须设置到“main menu.xib
”中的“Core Animation Layer
”中,否则您将看不到任何精灵
您可以根据需要定义任意多的“SKViews
”。我只举一个例子
AppDelegate
类中视图的定义还需要一些代码:
class AppDelegate: NSObject, NSApplicationDelegate
{
@IBOutlet var myWindow1: NSWindow!
@IBOutlet var mySKView1: SKView!
// other functions here as needed
func applicationDidFinishLaunching (aNotification: NSNotification)
{
let scene_size = CGSizeMake(1280.0, 800.0) // For example 1280x800 Pixel
let myScene1 = myScene1Class(size: scene_size)
mySKView1.scaleMode = .ResizeFill // works for me better than ".AspectFill"
mySKView1.ignoresSiblingOrder = false
mySKView1.asynchronous = true // This makes the difference in smooth Display-Speed
mySKView1.showsFPS = false
mySKView1.showsNodeCount = false
mySKView1.presentScene(myScene1)
mySKView1.paused = true // This makes the difference in Event-Handling
// Start your Main-Program-Process here
}
}
“MainMenu.xib”中的“Can Draw Concurrence”选项可以设置,也可以不设置,这没有区别
添加精灵和显示窗口时,屏幕更新会自动启动。当我在“AppDelegate
”中呈现场景时,其中没有精灵。这是通过我对每个程序的自动初始化来完成的
如果需要,可以使用两个选项“mySKView1.asynchronous=true
”和“mySKView1.paused=true
”。如果将其设置为“false
”,则可以看到问题。请注意,您必须定义多个节点才能使此问题完全可见,因为如果您的Mac速度达到60 fps,因为您的节点数较少,那么无论您选择哪个选项,一切看起来都很好。您将在一个或多个窗口中创建两个“skview
”或多个视图
测试了130000(130k!)个节点,每秒约20帧。使用260000(260k!)个节点进行测试,速度约为10 fps。另外三个“SKViews
”定义为没有精灵来测试整个东西