SpriteKit Shader Glitch(SKAttributeValue崩溃)

时间:2017-01-01 20:56:33

标签: ios swift opengl-es sprite-kit shader

我使用的是一个简单的着色器,这里是

void main() {
    vec2 p = -1.0 + 2.0 * v_tex_coord;
    float len = length(p);
    vec2 uv = v_tex_coord - (p/len)*(sin(len*22.-u_time*5.28) + 1.)*0.1;
    gl_FragColor = texture2D(u_texture, uv) * u_color;
}

这是我将其设置为将其用于具有不同颜色的节点

的方法
self.swirlShader.attributes = [SKAttribute(name: "u_color", type: SKAttributeType.vectorFloat4)]

它会不时地出现故障并向场景中添加节点会影响它的工作方式,基本上它会将节点的纹理更改为正弦函数。 glitch example

这在所有节点之间交替非常快,仅在某些粒子发射时,如左下角。 当2个节点发生碰撞时,它们会爆炸,当发生这种情况时,它也会崩溃,堆栈跟踪中的最后一条指令是[SKAttributeValue copyValueTo:type:count:]

还不时得到这个

Execution of the command buffer was aborted due to an error during execution. Caused GPU Hang Error (IOAF code 3)

编辑:我发现为每个节点使用着色器的新实例并增加节点数会大大增加崩溃的发生,但不会出现故障,它实际上改变了它并使其不那么频繁。以下是每个节点的新实例故障:glitch with new shader instances

更新:它似乎是某种与着色器访问或着色器执行相关的线程问题。另外,为什么使用着色器时CPU时间会上升和下降,而不是时稳定低?我认为着色器直接在GPU上工作。

更新2:发现它崩溃了,因为我在场景中添加了太多节点(大约3600)。我不知道为什么,因为它不是一致的,只有在使用着色器时才会发生。 故障仍然存在,我无法弄清楚究竟是什么导致它。我认为再次将节点添加到场景中,但它不足以运行大量测试。 我尝试删除所有操作并进行手动alpha,旋转等更新,但这不是原因。在其中一个测试中,一切都冻结并开始在2-3帧之间来回跳跃,以及向前跳几次,导致GPU挂起错误。 我不确定着色器是如何受到外部变量影响的,但是它会搞乱GPU。

0 个答案:

没有答案