作者:张琪健V | 来源:互联网 | 2023-12-12 19:01
本文讨论了在iOS平台中的Metal框架中,对于if语句中的判断条件的限制和处理方式。作者提到了在Metalshader中,判断条件不能写得太长太复杂,否则可能导致程序停留或没有响应。作者还分享了自己的经验,建议在CPU端进行处理,以避免出现问题。
各位大神你们好,我想问问在OpenGLES或者Metal中,是不是if语句中的判断条件不能写得太长太复杂?
就比如说iOS平台中的Metal框架吧,我在它的shader中写了一个if语句,看上去有点长,不过在CPU端处理的时候根本不叫事。
语句是下面这样的
1
| if ((vector0.x * vector1.y == vector0.y * vector1.x) && (((point.x <= segment.x && point.x >= segment.z) || (point.x <= segment.z && point.x >= segment.x)) && ((point.y <= segment.y && point.y >= segment.w) || (point.y <= segment.w && point.y >= segment.y)))) |
我发现程序停留在
1
| [MetalGPU().gpuDevice newComputePipelineStateWithFunction:kernelFunction error:&error]; |
也不报错,也不崩溃,也没有error,就是没有响应了。
当时我的想法是可能是这个条件判断写得太长太复杂了,于是我想分布计算bool值于是写成了下面这个样子。
1 2 3 4 5 6 7 8 9 10 11
| bool isPointOnSegment(float2 point,float4 segment) {
float2 vector0 = segment.xy - point;
float2 vector1 = segment.zw - segment.xy;
bool cOndition= vector0.x * vector1.y == vector0.y * vector1.x;
cOndition= condition && ((point.x <= segment.x && point.x >= segment.z) || (point.x <= segment.z && point.x >= segment.x));
cOndition= condition && ((point.y <= segment.y && point.y >= segment.w) || (point.y <= segment.w && point.y >= segment.y));
if (condition) {
return true;
}
return false;
} |
我发现依旧是不响应。于是我在想是不是condition里面不是bool值呢?
于是我直接塞了个bool值到里面,就变成了下面这个样子。
1 2 3 4 5 6 7 8 9 10 11 12 13
| bool isPointOnSegment(float2 point,float4 segment) {
float2 vector0 = segment.xy - point;
float2 vector1 = segment.zw - segment.xy;
bool cOndition= vector0.x * vector1.y == vector0.y * vector1.x;
cOndition= true;
cOndition= condition && ((point.x <= segment.x && point.x >= segment.z) || (point.x <= segment.z && point.x >= segment.x));
cOndition= false;
cOndition= condition && ((point.y <= segment.y && point.y >= segment.w) || (point.y <= segment.w && point.y >= segment.y));
if (condition) {
return true;
}
return false;
} |
然后就好使了,我就不明白了这前后有啥区别。
那么我的问题就是
Metal的if条件在写法上有啥讲究?
到底是什么原因导致上述现象?