在SCNView的overlaySKScene属性中运行SpriteKit粒子系统会导致应用程序崩溃,并显示下面的堆栈跟踪.

基于堆栈跟踪,似乎所有系统代码都在运行,所以你应该如何调试崩溃,更重要的是,确定它是否是SceneKit / SpriteKit的错误或应用程序中的错误?

对于它的价值,下面是添加粒子系统的函数,但它没有在堆栈跟踪中引用.

fileprivate func animateFireworks(scnPoint: CGPoint,color: UIColor) {
    // Set emitter properties
    let particleBirthRate = CGFloat(150)
    let maxParticles = 50
    let numEmitters = 5

    // SceneView point -> SpriteKit point
    let skOverlayPoint = skOverlay.convertPoint(fromView: scnPoint)

    // Create emitters
    for _ in 0..<numEmitters {
        let fireworksEmitter = SKEmitterNode(fileNamed: ExplosionEmitterFilename)!

        // Set particle size
        let particleSize = CGSize(width: 20,height: 20)
        fireworksEmitter.particleSize = particleSize

        // Set color for emitter
        fireworksEmitter.particleColorSequence = nil
        fireworksEmitter.particleColor = color

        // Set number of particles
        fireworksEmitter.particleBirthRate = particleBirthRate
        fireworksEmitter.numParticlesToEmit = maxParticles

        // Position at point
        fireworksEmitter.position = skOverlayPoint

        // Add to SpriteKit overlay
        skOverlay.addChild(fireworksEmitter)

        // Remove emitter,<animationDur> is only a rough estimate
        let animationDur = 3 * Double(fireworksEmitter.particleLifetime + fireworksEmitter.particleLifetimeRange)
        delay(animationDur) {
            fireworksEmitter.removeFromParent()
        }
    }
}


func delay(_ delay:Double,closure:@escaping ()->()) {
    dispatchQueue.main.asyncAfter(
        deadline: dispatchTime.Now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC),execute: closure)
}


> Thread 11 Queue : com.apple.scenekit.renderingQueue.SCNView0x121d8d570
> (serial)
> #0    0x000000019c710aac in SKCParticleManager::enumerateParticleSystems(void (SKCParticleSystem*)
> block_pointer) ()
> #1    0x000000019c723d74 in SKCParticleSystemNode::generateRenderData_Quads(SKCRenderInfo*) ()
> #2    0x000000019c7236c0 in SKCParticleSystemNode::addRenderOps_Quads(SKCRenderInfo*,> std::__1::shared_ptr<jet_command_buffer> const&) ()
> #3    0x000000019c71dc4c in SKCRenderer::expandRenderGroup(std::__1::shared_ptr<SKCRenderSortGroup>
> const&,std::__1::shared_ptr<jet_command_buffer> const&) ()
> #4    0x000000019c71b238 in SKCRenderer::expandRenderPass(std::__1::shared_ptr<SKCRenderPass>
> const&,std::__1::shared_ptr<jet_command_buffer> const&) ()
> #5    0x000000019c71a888 in SKCRenderer::render(SKCNode*,float __vector(4),std::__1::shared_ptr<jet_framebuffer> const&,unsigned int __vector(4),simd_float4x4,bool,NSDictionary*,SKCStats*,> SKCStats*,double) ()
> #6    0x000000019c6516a4 in -[SKSCNRenderer renderWithEncoder:pass:commandQueue:] ()
> #7    0x0000000199479fc8 in -[SCNRenderContextMetal renderSKSceneWithRenderer:overlay:atTime:] ()
> #8    0x0000000199525018 in -[SCNRenderer _drawOverlaySceneAtTime:] ()
> #9    0x00000001995e199c in __C3DEngineContextRenderPassInstance ()
> #10   0x00000001995e27cc in C3DEngineContextRenderMainTechnique ()
> #11   0x0000000199526508 in -[SCNRenderer _renderSceneWithEngineContext:sceneTime:] ()
> #12   0x0000000199526688 in -[SCNRenderer _drawSceneWithNeWrenderer:] ()
> #13   0x0000000199526ccc in -[SCNRenderer _drawScene:] ()
> #14   0x0000000199527144 in -[SCNRenderer _drawAtTime:] ()
> #15   0x00000001995cfa74 in -[SCNView _drawAtTime:] ()
> #16   0x00000001994876c0 in __69-[NSObject(SCN_displayLinkExtensions) SCN_setupdisplayLinkWithQueue:]_block_invoke ()
> #17   0x000000019959700c in __36-[SCNdisplayLink _callbackWithTime:]_block_invoke ()
> #18   0x00000001042a12cc in _dispatch_call_block_and_release ()
> #19   0x00000001042a128c in _dispatch_client_callout ()
> #20   0x00000001042aff80 in _dispatch_queue_serial_drain ()
> #21   0x00000001042a47ec in _dispatch_queue_invoke ()
> #22   0x00000001042b0f6c in _dispatch_root_queue_drain_deferred_wlh ()
> #23   0x00000001042b8020 in _dispatch_workloop_worker_thread ()
> #24   0x00000001858a6f1c in _pthread_wqthread ()
单独查看此函数时很难分辨出发生了什么,但崩溃堆栈跟踪行SKCParticleManager :: enumerateParticleSystems(void(SKCParticleSystem *))让我怀疑该问题与粒子发射器的添加/删除有关,可能是主队列以外的队列.

SKNode docs:

Manipulations to nodes must occur in the main thread.

我将仔细检查是否仅在主队列上调用addChild和removeFromParent方法.

swift – SceneKit:应用程序在SCNView上渲染SpriteKit粒子系统时崩溃,当所有代码似乎都是系统代码的一部分时如何调试的更多相关文章

  1. ios – 在Sprite Kit中播放声音

    我在myScene.h中有以下代码:而这个代码在touchBegin方法中:音频文件位于主文件夹中.当我运行应用程序并触摸应用程序关闭时,我收到以下错误:我认为这是在SpriteKit中播放音频的方法,但我一定是做错了什么..解决方法从项目中删除该文件并再次添加.记得选择并选择您的项目作为目标.

  2. ios – SceneKit.哪种方式起来了?

    似乎大多数3D创作应用程序使用Z作为“向上”轴.而SceneKit使用Y作为’向上’轴.SceneKit允许您将场景加载为Collada.DAE文件.通过以下任一方式加载场景时:要么您可以指定选项,包括SCNScenesourceConvertToYUpKey和SCNScenesourceConvertUnitsToMetersKey.相应地设置这些,我期望当我将它们添加到从加载场景中的节点构造的

  3. 如何在iOS 11 ARKit-Scenekit中为SCNNode创建边框以指示其选择?

    如何绘制边框以突出显示SCNNode并向用户指示该节点已被选中?在我的项目中,用户可以放置多个虚拟对象,用户可以随时选择任何对象.选择后,我应该向用户显示高亮显示的3D对象.有没有办法直接实现这个或在SCNNode上绘制边框?

  4. ios – 如何获取通过SpriteKit Editor创建的项目的SKSpriteNode?

    :-O解决方法如果在SpriteKitEditor中设置节点的name属性,则可以在Swift中访问该节点要么在Obj-C.

  5. ios – 无法使用Xcode 8和Swift 3以编程方式在SpriteKit中触发segue

    我正在使用SpriteKit在Xcode8中制作游戏,并且在编程上触发segue时非常困难.我已经进入“Main.storyboard”并在我的“GameViewController”和“MenuViewController”之间创建了一个segue,因为它标识符为“toMenu”.尝试失败#1在我的GameScene.swift文件中,我将以下代码添加到更新功能中.我的目标是每当gameIsRu

  6. ios – 在球体表面SceneKit上写文字?

    我想知道是否有一种方法可以在SceneKit中沿着球体对象的表面写入文本.我知道如果我有一个图像,我会在表面上放置纹理并实现这种效果,但我想知道我是否可以在球体表面上以某种方式动态添加文本.任何的想法?

  7. ios – ARKit/SpriteKit – 将pixelBufferAttributes设置为SKVideoNode或在视频中制作透明像素(色度键效果)另一种方式

    )的视频,如您在此屏幕截图中所示:我想达到相同的效果,但是在SKVideoNode上,而不是在AVPlayerLayer上.但是,我找不到任何方法将pixelBufferAttributes设置为SKVideoNode,并且设置播放器层无法实现ARKit的预期效果,因为它已固定在位.我的问题是否有任何解决方案,或者是否有其他技术可以达到相同的预期效果?

  8. ios – 检测Sprite Collision而不在SpriteKit中反弹

    我正在使用Xcode6Beta7提前致谢!以下评论中的解决方案;)解决方法spritekit的默认行为是,除非碰撞位掩码更改为0,否则所有内容都会与所有内容发生冲突.在您不希望退回但接收来自它们的通知的所有对象中,将代码中的此值更改为0.这将阻止这些对象相互反弹.

  9. ios – 在SpriteKit中,touchesBegan在与SKScene更新方法相同的线程中运行吗?

    在这里的Apple文档AdvancedSceneProcessing中,它描述了更新方法以及场景的呈现方式,但没有提到何时处理输入.目前尚不清楚它是否与渲染循环位于同一个线程中,或者它是否与它并发.如果我有一个对象,我从SKScene更新方法和touchesBegan方法(在这种情况下是SKSpriteNode)更新,我是否要担心同步对我的对象的两次访问?解决方法所以几天后没有回答我设置了一些实验

  10. ios – SpriteKit在转换到新场景时收到有关UIElements的错误

    代码设置场景加载场景:来自GameScene的代码:解决方法你这样做:一旦URL请求完成,可能会在后台线程上调用myLoadingScene.end().end设置loadCount,它有一个启动新视图的setter,self.view?.presentScene这是需要在主线程上运行的最后一块.假设你有一个方便的函数来在主线程上运行一些东西:然后您可以将场景演示代码更改为应该做的伎俩.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部