简单火箭2吧 关注:5,846贴子:83,643
  • 6回复贴,共1

Vizzy应当注意的那些事儿

只看楼主收藏回复

有什么需要注意的地方,欢迎大家补充。
为了方便区分,回复时请用“【数字】”作为问题的标注。谢谢!
这里我先起个头:
【1】伪多线程
现象:
并发的多个事件,有的得不到响应。
解决方法:
while循环体末尾增加 wait 0 second。
原因:
由于vizzy是伪多线程,实际上并不支持多事件并发处理。系统的解决办法是:采用分时响应方式,交叉处置并发事件,实现多线程模拟。
说白了就是,同时发生俩事儿,系统只能先开始处理事件A。但只处理1条代码,占用0.001秒,然后把事件B拿过来再处理0.001秒,剩下0.008秒啥也不干。然后再从A开始A继续处理。
这就造成当并发事件较多、有高速循环程序体时,系统一个处理周期的时间被塞满,有的事件要等到其他事件的代码处理完才能排上队。
wait(等待)语句,能起到把事件挂起到后台的作用,可以将处理队列释放出来。所以能解决这种并行处理冲突。


IP属地:河北来自Android客户端1楼2024-08-25 15:01回复
    【2】message消息广播溢出
    现象:循环广播某个消息一段时间后,突然无响应。(或者可以叫做重复事件触发,我更习惯称其为函数循环调用)
    解决方法:当需要反复触发某个事件,或者在部件间传递参数时,老老实实的用自定义变量和Funk吧。
    原因:
    vizzy管挖不管埋。当用黄色触发器启动一个函数(我还是习惯于将被执行的整个程序段称呼为函数,C语言带过来的习惯,大家理解就行)后,即便这个函数执行完毕,vizzy也不会将其终止,而是始终保留。这就造成当同一个message广播,被反复触发多次后,所在部件的函数上限(50个)被填满。
    目前vizzy中,没有结束函数的语句【强烈建议假如这个“end”语句】。break语句的作用,只是“跳出当前循环体”,注意,是“循环体”。功能很有限。
    使用自定义变量,以自定义变量的变化作为“触发事件”,在需要触发的函数中加入while循环和wait等待,可以起到message广播同样的触发效果。还不受函数数量上限的限制,是个很好的解决办法。跨部件触发(传递参数),则需要使用Funk读取特定部件自定义变量的方法解决。


    IP属地:河北来自Android客户端2楼2024-08-25 15:19
    回复
      【3】MFD函数调用(广播)差异
      这是在做MFD面板时发现的。
      因为要用到两个“事件广播”。一个是MFD内的点击触发函数,另一个是跨部件(飞船)的事件广播(完成主控飞行器切换的)。
      结果发现两个调用,取用data变量方法不同。
      MFD内的广播内,data是一个“数组”或者叫“堆栈”。而其他部件上的广播,data是一个“变量”。于是形成下图中的使用差异。
      另外广播事件(响应)数量限制(最大线程数50),MFD属性面板中也有。但从使用经验来说,似乎不存在这个限制。至少是目前编写/用过的程序中,“点击触发事件”这种MFD专属广播,没遇到这个限制。



      IP属地:河北来自Android客户端3楼2024-08-29 11:29
      回复
        【4】多控制器控制组混乱
        最近不是弄返回火箭嘛。后来又给返回火箭套了个“移动发射台”。就把成品搞成了多控制器的“怪物”。
        然后就发生问题了:
        下面这段程序里(写在火箭一级油桶上)简简单单的一个序列控制。
        发射台控制激活组1触发时,火箭上分离器被激活,与发射台分离,并继续图2程序的运行。
        首先节流阀开到最大,然后用激活组6开启一级外圈6台起飞发动机。
        接着激活第一组部件(一级7台发动机+与发射台连接用的侧级间)。
        后面获取起飞位置参数,点火八秒后(截屏没包含的部分)收着陆腿、开始程序转弯。
        【执行结果】
        1.节流阀控制在火箭上不生效,但手拉节流阀后正常,后面载入返回等阶段控制节流阀正常。
        【或者】
        2.激活组6控制无效。并且发射台开启激活组6使发射台倒伏后,用激活组1启动发射,倒下的发射台立即起竖。
        【分析原因】
        控制器上的3处Replicate,分别对应控制器重置、控制分组重置和激活组重置。点开时会使“副控制器”继承主控制器的信号,与主控制器保持一致。
        但我这里vizzy控制逻辑有点儿反着来。一级油桶从属于副控制器,导致输出的控制指令,与主控制器状态冲突。
        【解决方案】
        反正我现在还没有很好解决。不过有个思路:
        画流程图万能之选。搞清楚整个控制流程,应该就能找到解决办法(比如更改自己程序的控制逻辑)。
        【总结】
        没啥好说的,就是“老老实实的,别玩儿花活儿!”




        IP属地:河北来自Android客户端4楼2024-08-30 20:51
        回复
          佬funk怎么用 刚入土vizzy


          IP属地:广东来自iPhone客户端5楼2024-08-31 02:47
          收起回复
            Funk的用法,建议从哔哩哔哩搜一下,那边有做讲解的,不过不多。
            说起来用法挺丰富的,有点儿像在Excel表格里面填函数。
            不过我目前只会两种基础用法:
            1.跨部件调用变量。
            普通变量调用方法:部件名.FlightProgram.变量名。和某些部件input那里写变量调用的方法一模一样。
            2.调用部件的一些底层参数。
            格式大致上是:部件名.部件类型.参数代码。
            玩球,留的图找不到了。有个网站专门公布了那群参数代码。用简火2的老名字应该能百度出来。


            IP属地:河北来自Android客户端6楼2024-08-31 03:04
            回复