一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于Lua语言的编程框架实现方法及系统与流程

2022-07-14 00:40:56 来源:中国专利 TAG:

一种基于lua语言的编程框架实现方法及系统
技术领域
1.本发明涉及应用开发技术领域,特别地涉及一种基于lua语言的编程框架实现方法及系统。


背景技术:

2.从某种意义上来说,编程框架指的是实现了某个应用领域通用完备功能的底层服务并提供了业务编写逻辑。编程人员可以使用这些框架在一个通用功能已经实现的基础上开始具体的应用开发,由编程框架完成一些基础工作,编程人员只需要集中精力按照一定的要求及规则完成应用的业务逻辑设计,在很大程度上为编程开发工作提供了便利并且使用框架编写的业务逻辑更加简洁易读。
3.在游戏开发领域,游戏开发人员使用的游戏开发工具例如cocos2d、cocos3d、libgdx、unity等提供的编程框架可以使游戏开发人员灵活地运用各种组件、工具、插件等完成游戏的开发工作。在众多的开发工具中,由于功能全面、强大、开发学习难度小、可跨平台等原因,unity被越来越多地游戏开发人员所使用。
4.虽然unity功能强大,但其也存在很多缺陷。例如众所周知的资源加载慢的问题,其原因之一是由于unity引擎内部的逻辑导致大部分的资源加载都要在主线程执行,即使有些加载工作可以在加载线程执行,但是该过程很多工作还是需要由主线程完成,因而主线程的压力并没有减少,不但加载慢、效率低,还会经常性地阻塞主线程。又例如,编辑器在游戏运行时的全部处理操作都在同一个线程,加之资源管理和逻辑上的缺陷,导致编辑器运行效率非常低,并且经此开发出来的游戏安装在用户终端上运行时,也会导致用户终端卡顿、发热,用户体验不佳。


技术实现要素:

5.针对现有技术中存在的技术问题,本发明提出了一种基于lua语言的编程框架实现方法及系统,用于提高应用开发效率、提高开发出的游戏的用户体验。
6.为了解决上述技术问题,根据本发明的一个方面,本发明提出了一种基于lua语言的编程框架实现方法,包括以下步骤:
7.在主线程顺序执行经编辑器输入的基于lua语言编写的编程代码时识别当前编程代码中的观察者模式方法;
8.响应于识别到观察者模式方法,根据指示符确定观察者和被观察者;
9.在所述观察者和所述被观察者之间建立订阅关系;
10.响应于所述订阅关系,所述观察者监听所述被观察者,并在被观察者发送事件时接收所述事件;以及
11.响应于对应所述被观察者的编程代码执行完毕产生事件,并向观察者发送所述事件。
12.根据本发明的一个方面,本发明提出了一种基于lua语言的编程框架实现系统,其
包括主线程模块、角色确定模块、订阅模块和被观察者模块,其中,所述主线程模块经配置以在主线程顺序运行经编辑器输入的基于lua语言编写的编程代码,监听被观察者,并接收被观察者发送的事件;所述角色确定模块与所述主线程模块相连接,经配置以根据编程代码中提供的观察者模式方法中的指示符确定观察者和被观察者;所述订阅模块分别与所述身份确定模块和主线程模块相连接,经配置以在所述观察者和所述被观察者之间建立或解除订阅关系;所述被观察者模块与所述身份确定模块相连接,经配置以运行对应所述被观察者的编程代码,在运行完毕产生事件并向观察者发送所述事件。
13.基于上述方法实现的编程框架在运行编程代码时由异步操作替换了原有的协程,实现了多线程,既减少了对被观察者所在主线程的阻塞,也没有任何的性能消耗,从而有效地提高了编辑器的运行效率;基于本发明提供的编程框架开发的游戏在用户设备上运行时,不产生或产生极少的不可回收的垃圾,内存占用小、开销小,耗时低,因此不会卡顿、设备发热的现象,提高了用户体验。
附图说明
14.下面,将结合附图对本发明的优选实施方式进行进一步详细的说明,其中:
15.图1是根据本发明的一个实施例提供的一种基于lua语言的编程框架实现方法流程图;
16.图2是根据本发明的一个实施例的基于lua语言的编程框架实现系统的原理框图;
17.图3是根据本发明的一个实施例的线程模块原理框图;
18.图4是根据本发明另一个实施例的主线程模块原理框图;
19.图5是根据本发明又一个实施例的主线程模块和被观察者模块的原理框图;
20.图6是根据本发明的一个实施例的订阅模块原理框图;
21.图7是根据本发明的另一个实施例基于lua语言的编程框架实现系统的原理框图;
22.图8a是基于现有unity官方开发工具开发的游戏a的性能测试数据显示图;以及
23.图8b是基于本发明提供的编程框架的开发工具开发的游戏b的性能测试数据显示图。
具体实施方式
24.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
25.在以下的详细描述中,可以参看作为本技术一部分用来说明本技术的特定实施例的各个说明书附图。在附图中,相似的附图标记在不同图式中描述大体上类似的组件。本技术的各个特定实施例在以下进行了足够详细的描述,使得具备本领域相关知识和技术的普通技术人员能够实施本技术的技术方案。应当理解,还可以利用其它实施例或者对本技术的实施例进行结构、逻辑或者电性的改变。
26.本发明实现的编程框架支持编程人员在开发工具的编辑器内采用观察者模式方法编写的程序。其中,编程人员在编辑器内采用lua语言编写程序代码,通过使用特定的指
示符定义观察者和被观察者,所述编程框架在识别到这些指标符后,根据预置的指标符含义进行相应的处理,从而可以达到异步操作、多线程处理等目的。
27.图1是根据本发明一个实施例提供的一种基于lua语言的编程框架实现方法流程图,所述方法包括以下步骤:
28.步骤s1,创建主线程,并等待编程人员对经编辑器输入的编程代码的运行指令。
29.步骤s2,在得到编程人员的运行指令后,在主线程顺序执行经编辑器输入的基于lua语言编写的编程代码。在一个实施例中,所述运行的编程代码为一段或多段用于完成某个或某些个功能的脚本。由于lua语言具有量级小、性能高和不限制编程范式等优点,本发明中的脚本采用lua语言编写。编程人员可以在编写完一个脚本后运行其脚本,也可以在编辑器中顺序编写完成多个用于不同功能的脚本时再运行全部脚本。本发明通过创建的主线程顺序执行所述脚本。
30.步骤s3,判断当前编程代码中是否提供了观察者模式方法,如果当前编程代码中提供了观察者模式方法,则执行步骤s4。如果没有,则在步骤s10判断主线程是否结束,如果主线程没有结束,则返回步骤s2,继续执行经编辑器输入的编程代码,如果主线程结束,即已运行完当前的全部编码代码,则结束。
31.步骤s4,根据方法中的指示符确定观察者和被观察者。
32.步骤s5,在所述观察者和所述被观察者之间建立订阅关系。当观察者和所述被观察者之间建立起订阅关系后,在步骤s7,观察者监听所述被观察者,监听其是否发送事件。
33.步骤s6,执行所述被观察者。
34.步骤s61,判断所述被观察者是否执行完成,如果没有,则返回步骤s6,如果已经执行完毕,则在步骤s62产生事件,并向观察者发送所述事件。
35.步骤s8,判断观察者是否接收到所述被观察者发送的事件。在一个实施例中,可以将主线程作为观察者,当主线程与一个或多个被观察者建立起订阅关系后,监听被观察者,当监听到有被观察者发送事件时接收所述事件。因而,在步骤s8判断是否接收到所述被观察者发送的事件,如果接收到,则在步骤s9解除主线程与所述被观察者的订阅关系,并返回步骤s2。如果没有接收到所述被观察者发送的事件,则在步骤s7持续监听所述被观察者。
36.在主线程执行脚本代码的过程中可能会存在多个被观察者,因而,在一个实施例中,主线程维持有观察者与被观察者的对应列表,并且在每个被观察者执行完毕时产生的事件中标识有被观察者及对应的观察者,从而当主线程监听到一个事件时,根据所述事件中的观察者标识符和被观察者标识符确定对应的被观察者及该事件应发送给哪个观察者。
37.在前述步骤s6中,根据需要,所述的被观察者可以在一个新创建的线程中执行,也可以在主线程执行。所述的被观察者可以是任意一种形式,例如,网络请求、定时、延时、获取某种数据、获取某个事件、要进行的各种数据处理等。
38.例如,编程人员在编辑器中编写的代码如下表1所示,并运行所述代码。
39.表1
[0040][0041]
在主线程执行以上编程代码时,通过第一行“game.observablewww.get”识别到当前编程代码中提供了观察者模式方法。其中,单词“observable”作为观察者模式方法指示符,根据其前面的单词“game”确定当前主线程为观察者,根据其后面的“www.get”确定get请求的网络操作为被观察者,请求的具体内容为“http://google.co.jp/”。在本实施例中,编程人员在编程代码中采用“subscribe”作为订阅的指令或标识符,用以建立主线程与get请求的网络操作之间的订阅关系,并且,本实施例利用unity的actiont和func《》定义了事件的声明过程,从而声明了在get请求成功时返回x,在get请求失败时返回ex这两个事件。由于action支持所有的数据类型,因而不存在协程不能返回参数的问题,从而使事件成为观察者与被观察者沟通的载体。
[0042]
通常情况下,unity中的用来处理http协议相关的网络操作(如httpget或httppost)需要使用www和coroutine(协程)来完成。所述www为http封装的一个对象,coroutine(协程)可以被认为是一个返回值是ienumerator的函数,其目的是在主线程中开启另外一段逻辑处理,但与多线程不同的是,协程是在主线程里面执行的。具体地,通过startcoroutine方法来启动一个协程,startcoroutine是monobehaviour的一个方法,该方法可以启动一个协程,每个协程都有一个入口函数,协程必须是一个ienumerator作为返回值的方法(入口函数),协程使用yield关键字来中断。从而可见,协程返回值类型必须是ienumerator,而不能是其他的任何值,并且因为yield return语句不能被try-catch结构包围,因而协程不能处理异常。在完成诸如网络操作时,需要协程在主线程中完成,各种操作耦合紧密,从而导致了巨大单体ienumerators。而本发明解决了此问题,本发明提供的前述观察者模式可以异步实现所述的被观察者,操作更加安全、高效。以前述的代码实例为例,通过本发明实现的框架,可以在另一个线程中异步实现请求内容为“http://google.co.jp/”的get请求这样一个网络操作。网络操作执行完毕时生成一个事件,当操作成功时,所述事件返回值为x,当作失败时,所述事件返回值为ex。主线程在接收到事件及其返回值时,确定所述当要的网络操作完成,而后解除主线程与作为被观察者的所述网络操作之间的订阅关系。因而,在发明实现的框架在运行编程代码时通过异步操作替换了协程,既减少了对被观察者所在的主线程的阻塞,对主线程中的各种操作进行了解耦,也没有任何的性能消耗,从而有效地提高了编辑器的运行效率。
[0043]
从上述实施例可以看出,由于本发明实现的编程框架可以实现异步操作,因而也能够通过多线程来访问游戏对象、处理游戏数据。例如表2所示。表2中包括了两个观察者模式方法,其中第1-3为一个实现多线程操作的方法,其中的start()表明一个被观察者为一个需要在异步线程执行的方法,作用是把需要异步执行的方法放到异步线程,从而实现多
线程操作。第4-7方法中的被观察者为一个实现定时周期为3秒的定时器。第一个观察者模式方法中的任何function函数方法都可以通过start()放到异步线程执行,也就是在一个主线程之外的新线程中执行,第二个观察者模式方法中的定时器在另一个独立于主线程的新线程中执行。在这里,将主线程之外的线程统称为第二线程,本实施例中包括两个第二线程,分别用于实现游戏代码所有业务逻辑的函数方法和定时周期为3秒的定时器都可以放到第二线程,跟主线程同时异步执行。另外,可以根据订阅标识符建立观察者和被观察者之间的订阅关系,也可以不需要所述的订阅标识符,在被观察者需要向观察者反馈事件时,即可以建立观察者和被观察者之间的订阅关系。
[0044]
表2
[0045][0046]
从上述实施例中可见,本发明实现的编程框架实现了一种新的链式编程结构(实现不同功能的脚本代码之间采用分号连接,多个脚本代码自上而下形成了一种链式编程结构),这种新的链式编程结构在自上而下的执行过程中,可以采用多线程处理方式,通过异步操作,在同一个时间段内完成多个功能,与单线程方式相比,既减小了系统性能消耗,也成倍地缩短了编辑器的运行时间,有效地提高了开发效率。
[0047]
为了尽可能地减少性能消耗,在被观察者执行完,主线程接收到被观察者执行完毕发送的事件后,需要及时解除主线程与被观察者之间的订阅关系。解除主线程与被观察者之间的订阅关系的方式可以有多种,例如,在所述观察者模式方法中包括了取消订阅标识符时,如表2中第3行和第7行中的代码“:addto(this)”,在向主线程发送完响应于对应所述被观察者的编程代码执行完毕产生的事件后,在当前脚本结束的同时解除主线程与所述被观察者的订阅关系,即主线程与所述被观察者的订阅关系与当前脚本同时结束。在另一种方式中,在主线程顺序执行经编辑器输入的编程代码时,当执行完所述观察者模式方法对应的编程代码后,根据顺序执行的编程代码中的解除与被观察者订阅关系的指令解除主线程与所述被观察者的订阅关系。如下表3所示:
[0048]
表3
[0049][0050]
前述第1-6行的代码为在编辑器中输入的一段代码,主线程在执行该段代码时,通过第1行识别到的观察者模式方法,确定相应的被观察者,在本实施例中,所述的被观察者为一系列的数据处理,如第1行的输入、第二行的过滤奇数、第三行在所有数字组成的字符串后面拼接一句字符串

whow do we appreciate’、第四行的插入“!”、第六行的打印。在确定了被观察者时,建立主线程与被观察者的订阅关系并确定返回的内容(在编辑器中打印经过前述处理后确定的内容)。根据第5行的代码所示,在代码中限定了该方法在主线程中执行,因而本实施例中的被观察者对应的数据处理在主线程中进行。当这些代码都执行完成后,主线程在顺序执行编程代码时,根据第7行的指令取消这些数据处理操作与主线程的订阅关系。
[0051]
通过及时地解除主线程与被观察者的订阅关系,使主线程不再需要监听被观察者,从而节省了对系统性能的消耗。
[0052]
在步骤s1中,在主线程中顺序执行经编辑器输入的编程代码时,根据编程代码中的事件驱动关系生成反应序列。例如,本发明中的被观察者通过事件通知观察者,观察者接收事件后做出反应,进行相应的逻辑处理,这一过程则为一个反应,将多个具有事件驱动关系的反应过程表示成一个链式结构,则构成反应序列。又例如,在使用ugui的组件进行ui编程时,将由事件驱动机制监听ui的点击事件、值更改等表示成一个反应序列。因而,本发明维护一个或多个反应序列。例如,可将运行每一帧游戏过程中的所有事件驱动关系表示成一个反应序列,因而本发明维护有多个反应序列,分别与游戏帧相对应。又例如,本发明可以按照事件驱动关系发生的时间或发生所在的线程得到一个反应序列。基于反应序列,本发明可以提供原unity中无法提供的功能,如单击、双击、连点、屏蔽快速点击等。如表4所示的代码。
[0053]
表4
[0054][0055]
从上述代码可见,在执行获取每一帧处理返回的数据这一被观察者时,并不是如unity常用的方式,将每一帧处理的数据全部返回,而是根据查询指令where()从当前这一帧的反应序列中查询where中的指定反应,并按照查询指令中的要求返回指定反应中的相关数据。当系统是按照游戏帧维护多个反应序列时,先是查找到与当前帧对应的反应序列,再按照查询指令中的指定反应,如表4中所示,where中的指定反应为“input.getmousebuttondown(0)”,在反应序列中找到该反应中的事件,按照查询指令中要求返回的参数从该反应对应的事件数据中读取对应的参数数据,如表4中所示,要求返回坐标x,则读取所述点击事件对应的坐标,并返回所述坐标。
[0056]
又例如,参见表5所示:
[0057]
表5
[0058][0059]
在当前脚本建立观察者,在本实施例中,将文本显示组件mtext作为观察者,将输入框组件minput作为被观察者,观察输入框中值的变化,通过where方法获取输入框的值并处理校验,delay延迟1秒后,通过事件发送给mtext文本显示组件进行显示。
[0060]
从上述实施例可见,本发明结合语言集成查询(linq),在需要的时候,结合由linq查询运算符构成的查询指令可以实现有针对性的获取数据。由于linq查询运算符可以从不同的数据源、在不同格式的结构化数据中检索数据,消除了编程语言和数据库之间的不匹配,因而可以直接返回linq查询结果,不需对结果进行格式转换,使用方便。
[0061]
图2是根据本发明一个实施例的基于lua语言的编程框架实现系统的原理框图,其
中,所述系统包括主线程模块1、角色确定模块2、订阅模块3和被观察者模块4,其中,所述主线程模块1在主线程顺序运行经编辑器输入的基于lua语言编写的编程代码,监听被观察者,并接收被观察者发送的事件。所述角色确定模块2与所述主线程模块1相连接,经配置以在主线程中运行的当前编程代码中提供了观察者模式方法时根据方法中的指示符确定观察者和被观察者。所述订阅模块3分别与主线程模块1、所述身份确定模块2和被观察者模块4相连接,在所述观察者和所述被观察者之间建立或解除订阅关系。所述被观察者模块4与所述身份确定模块2和主线程模块1相连接,用以运行对应所述被观察者的编程代码,在运行完毕产生事件并向主线程模块1中的观察者发送所述事件。
[0062]
图3是根据本发明一个实施例的主线程模块原理框图。在本实施例中,所述主线程模块1包括主线程单元11和监听单元12。所述主线程单元11用以创建主线程,并在主线程顺序执行经编辑器输入的基于lua语言编写的编程代码,在执行到当前编程代码中的观察者模式方法时发送通知给所述角色确定模块。所述监听单元12与所述订阅模块3和被观察者模块4相连接,在接收到订阅模块3发送的、在观察者(如所述的主线程)和被观察者之间建立起订阅关系的订阅通知时,监听并接收所述被观察者发送出的事件,在接收到来自于被观察者模块4发送的所述事件后通知所述主线程单元11。
[0063]
图4是根据本发明另一个实施例的主线程模块原理框图。在本实施例中,所述主线程模块1除了包括主线程单元11和监听单元12外,还包括执行方式识别单元13,其与所述主线程单元11相连接,用于从所述观察者模式方法中获取被观察者的执行方式,所述执行方式包括在主线程执行被观察者或者在第二线程中执行被观察者。当需要在主线程执行被观察者时,所述主线程模块1还包括被观察者单元14和第一事件单元15,所述被观察者单元14分别与所述主线程单元11和执行方式识别单元13连接,当执行方式识别单元13识别到需要在主线程执行被观察者时,发送通过给所述的所述被观察者单元14。所述被观察者单元14记录被观察者,并在主线程中运行对应所述被观察者的编程代码。在所述被观察者执行完成时,通知第一事件单元15生成第一事件。所述第一事件单元15与所述被观察者单元14相连接,当接收被观察者单元14的通知时,按照要求产生第一事件,并将所述第一事件发送给所述监听单元12。所述监听单元12接收所述第一事件,并返回给主线程执行单元11。
[0064]
图5是根据本发明又一个实施例的主线程模块和被观察者模块的原理框图。在本实施例中,所述主线程模块1包括主线程单元11、监听单元12和执行方式识别单元13,所述被观察者模块包括第二线程单元41和第二事件单元42。当执行方式识别单元13从所述观察者模式方法中获取到的被观察者的执行方式为在第二线程中执行被观察者时,发送通知给所述第二线程单元41。第二线程单元41接收到所述通知后,创建新的线程,在此称为第二线程,并在所述第二线程中执行被观察者。当执行被观察者执行完发送通知给第二事件单元42。所述第二事件单元42在第二线程运行完对应所述被观察者的编程代码时生成对应的第二事件并发送给主线程模块1中的监听单元12。其中,所述第二线程单元41可根据需要创建一个或多个第二线程,用于步异、多线程地执行编程人员经编辑器输入的编程代码。
[0065]
图6是根据本发明一个实施例的订阅模块原理框图。所述订阅模块3包括订阅关系建立单元31和订阅关系解除单元32,其中,所述订阅关系建立单元31与所述身份确定模块2相连接,在所述身份确定模块2确定了观察者和被观察者时,在所述观察者和所述被观察者之间建立订阅关系。所述订阅关系解除单元32分别与主线程模块1和被观察者模块4相连
接,经配置以根据来自所述被观察者模块4或所述主线程模块1的指令解除主线程和所述被观察者的建立订阅关系。其中,当主线程单元11如图4所示从监听单元12接收来第一事件单元15发送的第一事件后,或者如图5所示从监听单元12接收来第二事件单元15发送的第二事件后,发送解除指令给所述订阅关系解除单元32,所述解除指令中包含了观察者和被观察者的身份标识。所述订阅关系解除单元32根据所述解除指令将被观察者和主线程之间的订阅关系取消,并通知所述监听单元12。所述监听单元12接收到所述通知后,不再监听所述被观察者。
[0066]
图7是根据本发明一个实施例的基于lua语言的编程框架实现系统的原理框图,与图2相比,本实施例还包括反应序列生成模块5,其与所述主线程模块1和被观察者模块4相连接,用以在主线程或第二线程运行编程代码时根据编程代码中的事件驱动关系生成反应序列。当所述主线程模块1中的被观察者单元14或被观察者模块4中的第二线程在执行被观察者时,当被观察者编程代码中包括有查询指令时,通过在反应序列中查询指定反应,并按照要求返回所述指定反应中的相应数据给相应的主线程或第二线程,从而能够有针对性地获取相应的数据,既节省了系统消耗,也提高了数据处理效率。
[0067]
基于本发明实现的编程框架,编程人员在开发工具的编辑器进行游戏编程时,可以实现多线程、异步操作,既减少了对主线程的阻塞,也没有任何的性能消耗,从而有效地提高了编辑器的运行效率,因而提高了开发效率,大大缩短了游戏开发进程。
[0068]
图8a为基于现有unity官方开发工具开发的游戏a的性能测试数据显示图,图8b为基于本发明提供的编程框架的开发工具开发的游戏b的性能测试数据显示图。通过对比可知,基于unity官方提供的开发工具开发的游戏a在运行过程会产生很多不能回收的垃圾(如图中指出的多个gc(garbage collection)峰值),而运用本发明提供的编程框架的开发工具开发的游戏b在运行过程中当前几乎没有产生不能回收的垃圾。关于主线程占用的内存,相比于游戏a,游戏b对内存的占用大大减少,游戏a开销(overheads)巨大,而游戏b为零开销;对比每一帧的耗时,游戏a为14.6毫秒每帧,而游戏b则为0.37毫秒每帧。因而可见,运用本框架编可以有效地避免游戏在用户终端运行时的卡顿、发热等情况,从而为用户提供了良好的体验。
[0069]
上述实施例仅供说明本发明之用,而并非是对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明范围的情况下,还可以做出各种变化和变型,因此,所有等同的技术方案也应属于本发明公开的范畴。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献