Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode Mac OS X El Capitan和多个精灵套件SKView_Xcode_Macos_Performance_Sprite Kit - Fatal编程技术网

Xcode Mac OS X El Capitan和多个精灵套件SKView

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工具包窗口,其中一个场景用于我的项目,因此我的更新性能非常差。约塞米蒂

使用El Capitan和Xcode 7.2在Mac上开发:

如果我有一个只有一个窗口的项目,它有一个
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
    ”定义为没有精灵来测试整个东西