GMS2在输出游戏时提供两种编译模式,一种是VM,也即默认编译模式,一种是YYC。
VM就是字节码,这样的输出虽然快,但是有被破解的风险。
YYC则是将GML转化为cpp进行输出,尽管编译时间相比VM来讲长的多,但是造出来的程序是几乎不可能被破解的,此外,YYC游戏的处理效率远高于VM编译。
因此,有时候使用YYC编译就显得很必要了。
这里给不知道的同学们提一下,切换地点就在GMS2的右上角,那个像是个瞄准器的图标,点下去,在Output窗口中切换为YYC即可。
但是,YYC有很多毛病——这也是我今天要讲的问题。
有时候,你在VM中编译起来毫无问题的游戏,转入YYC后,你会发现bug奇多——而且这些bug不是你能想象的。例如,instance_create_depth与instance_create_layer,往常,哪怕你的代码再混乱,最起码创建的实例也是正确的。
但是,在YYC中,可能它创建的实例根本就不是你想要的。你填的是obj_123,它有可能给你创建obj_456。实际上,这还不是最糟的,它最后的运行结果可能会比这还要可怕的多......包括但不限于出现死循环,出现你根本没调用的函数——从某种意义上,它的创造力比Shader的创造力还强。
这就是我们今天探讨的问题:到底该怎么减少这种错误编译?
仅据个人研究,如果你的码风(代码风格)符合“某种规范”,可以大大减少这种错误率。
首先,你必须尽一切可能地减少那些不符合大众所认可的码风,包括但不限于:语句中不能省略括号,逻辑判断必须使用双等于,每一行结束后添加分号以示结束......
但是这并不是我们所需要的全部。即使你完全遵循这些公认码风,YYC的编译依然会出错。
以下是某个示例:

这是可以在YYC中运行的代码(注意图中仍然有些问题,如等于号前后的空格问题)。
这些代码有个很奇怪的现象,第六行,第七行的临时变量似乎是完全不必要的,你完全可以在下文中的instance_create_depth中将它们替换掉,不是吗?
按照常规理解确实如此,但是,事实证明,如果我不这么干,在执行这里时,创建的实例是一个叫做“obj_system_heart”的实例。
事实上,各种平日里可以在函数里直接写入的表达式,似乎都必须使用一个变量储存表达式的值,然后在函数内写入变量......反正很莫名其妙。
现在,我想请教的问题是,还有什么码风是能降低YYC编译错误概率的?又或者不是码风,总之,什么能规避YYC的出错?
(是的,这其实不是个科普贴,是个请教问题的贴子)
VM就是字节码,这样的输出虽然快,但是有被破解的风险。
YYC则是将GML转化为cpp进行输出,尽管编译时间相比VM来讲长的多,但是造出来的程序是几乎不可能被破解的,此外,YYC游戏的处理效率远高于VM编译。
因此,有时候使用YYC编译就显得很必要了。
这里给不知道的同学们提一下,切换地点就在GMS2的右上角,那个像是个瞄准器的图标,点下去,在Output窗口中切换为YYC即可。
但是,YYC有很多毛病——这也是我今天要讲的问题。
有时候,你在VM中编译起来毫无问题的游戏,转入YYC后,你会发现bug奇多——而且这些bug不是你能想象的。例如,instance_create_depth与instance_create_layer,往常,哪怕你的代码再混乱,最起码创建的实例也是正确的。
但是,在YYC中,可能它创建的实例根本就不是你想要的。你填的是obj_123,它有可能给你创建obj_456。实际上,这还不是最糟的,它最后的运行结果可能会比这还要可怕的多......包括但不限于出现死循环,出现你根本没调用的函数——从某种意义上,它的创造力比Shader的创造力还强。
这就是我们今天探讨的问题:到底该怎么减少这种错误编译?
仅据个人研究,如果你的码风(代码风格)符合“某种规范”,可以大大减少这种错误率。
首先,你必须尽一切可能地减少那些不符合大众所认可的码风,包括但不限于:语句中不能省略括号,逻辑判断必须使用双等于,每一行结束后添加分号以示结束......
但是这并不是我们所需要的全部。即使你完全遵循这些公认码风,YYC的编译依然会出错。
以下是某个示例:

这是可以在YYC中运行的代码(注意图中仍然有些问题,如等于号前后的空格问题)。
这些代码有个很奇怪的现象,第六行,第七行的临时变量似乎是完全不必要的,你完全可以在下文中的instance_create_depth中将它们替换掉,不是吗?
按照常规理解确实如此,但是,事实证明,如果我不这么干,在执行这里时,创建的实例是一个叫做“obj_system_heart”的实例。
事实上,各种平日里可以在函数里直接写入的表达式,似乎都必须使用一个变量储存表达式的值,然后在函数内写入变量......反正很莫名其妙。
现在,我想请教的问题是,还有什么码风是能降低YYC编译错误概率的?又或者不是码风,总之,什么能规避YYC的出错?
(是的,这其实不是个科普贴,是个请教问题的贴子)