任务执行方法、装置、电子设备和存储介质
文献发布时间:2023-06-19 11:52:33
技术领域
本发明涉及计算机技术领域,特别是涉及一种任务执行方法、一种任务执行装置、电子设备和存储介质。
背景技术
对于软件开发的项目,例如在游戏的开发中,通过游戏引擎(如unity)主导着游戏的画面质量以及开发方式。然而,对于某些版本的游戏引擎开发的游戏,由于游戏引擎本身的特性,没有直接的多线程接口(IJob),一直使用单线程框架;对于上述版本之后的某些迭代版本游戏引擎,虽然增加了多线程接口,但是无法直接利用现有已开发完成的游戏,需要对代码进行大量的重构才能发挥多线程优势,但对代码进行大量重构,不仅成本高昂,且会给已上线或者成熟的游戏带来大量的不确定性风险,因此导致市面上游戏引擎开发的游戏至今仍采用单线程架构。
但是,采用单线程框架处理的引擎,无法发挥计算机多核的计算优势,在遇到密集无次序要求的任务,以及复杂有次序要求的任务时,计算时间会大大超出预期,从而导致加载等待时间长、游戏流畅度上存在卡顿等问题,极大地影响了用户体验。
发明内容
鉴于上述问题,提出了本发明实施例以便提供一种克服上述问题或者至少部分地解决上述问题的一种任务执行方法和相应的一种任务执行装置、电子设备、存储介质。
为了解决上述问题,本发明实施例公开了一种任务执行方法,所述方法包括:
确认任务池中的任务的任务类别;
依据所述任务的任务类别,确定所述任务对应的工作线程;
将属于不同所述工作线程且能并列执行的任务组成为任务组;
确认所述任务组之间的第一依赖关系;
依据所述第一依赖关系,执行所述任务组,其中,所述任务组中的所述任务为通过调用对应的所述工作线程并列执行的任务。
可选地,所述依据所述第一依赖关系,执行所述任务组,包括:
依据所述第一依赖关系,确定所述任务组的执行次序;
按照所述任务组的执行次序,依次执行所述任务组。
可选地,所述依次执行所述任务组,包括:
执行所述任务组的所述任务时,加载所述任务组的所述任务对应的资源包;
在所述任务执行完成后,释放所述资源包。
可选地,所述在所述任务执行完成后,释放所述资源包,包括:
在所述任务执行完成后,返回所述任务执行的结果;
在返回所述任务执行的结果后,释放所述资源包。
可选地,在所述加载所述任务组的所述任务对应的资源包之前,所述方法还包括:
对所述任务组的所述任务对应的待加载的资源包进行逻辑处理;其中,所述逻辑处理至少包括以下之一:文件名检查、资源路径检查、资源版本检查、错误处理。
可选地,在所述加载所述任务组的所述任务的对应的资源包之前,还包括:
获取资源包与其他资源包之间的第二依赖关系;
依据所述第二依赖关系加载所述资源包依赖的所述其他资源包。
可选地,所述在所述任务执行完成后,所述释放所述资源包,包括:
确定所述资源包或所述其他资源包,是否被其他待加载的资源包依赖;
若是,在加载结束后,缓存所述资源包或所述其他资源包;
若否,释放所述资源包或所述其他资源包。
本发明实施例公开了一种任务执行装置,所述装置包括:
类别确认模块,用于确认任务池中的任务的任务类别;
线程确定模块,用于依据所述任务的任务类别,确定所述任务对应的工作线程;
任务组成模块,用于将属于不同所述工作线程且能并列执行的任务组成为任务组;
关系确定模块,用于确认所述任务组之间的第一依赖关系;
任务执行模块,用于依据所述第一依赖关系,执行所述任务组,其中,所述任务组中的所述任务为通过调用对应的所述工作线程并列执行的任务。
可选地,所述任务执行模块,包括:
次序确定子模块,用于依据所述第一依赖关系,确定所述任务组的执行次序;
执行子模块,用于按照所述任务组的执行次序,依次执行所述任务组。
可选地,所述执行子模块,包括:
资源加载单元,用于执行所述任务组的所述任务时,加载所述任务组的所述任务对应的资源包;
资源释放单元,用于在所述任务执行完成后,释放所述资源包。
可选地,所述资源释放单元,包括:
结果返回子单元,用于在所述任务执行完成后,返回所述任务执行的结果;
第一资源释放子单元,用于在返回所述任务执行的结果后,释放所述资源包。
可选地,在所述资源加载单元之前,还包括:
资源处理单元,用于对所述任务组的所述任务对应的待加载的资源包进行逻辑处理;其中,所述逻辑处理至少包括以下之一:文件名检查、资源路径检查、资源版本检查、错误处理。
可选地,在所述资源加载单元之前,所述装置还包括:
关系确定单元,用于获取资源包与其他资源包之间的第二依赖关系;
资源确认单元,用于依据所述第二依赖关系加载所述资源包依赖的所述其他资源包。
可选地,所述资源释放单元,包括:
依赖确定子单元,用于确定所述资源包或所述其他资源包,是否被其他待加载的资源包依赖;若是,则调用资源缓存子单元,若否,则调用第二资源释放子单元;
所述资源缓存子单元,用于在加载结束后,缓存所述资源包或所述其他资源包;
所述第二资源释放子单元,用于释放所述资源包或所述其他资源包。
本发明实施例公开了一种电子设备,包括处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上所述的任务执行方法的步骤。
本发明实施例公开了一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上所述的任务执行方法的步骤。
本发明实施例包括以下优点:
在本发明实施例中,通过多线程框架将任务池中的任务依据类别确定对应的工作线程,同时将属于不同工作线程且能并列执行的任务组成为任务组,根据任务组之间的依赖关系,确定出任务组的执行次序,然后通过多线程框架中的多个工作线程分别执行任务组中的任务。本发明实施例中,多个工作线程可以发挥出计算机多核的计算优势,对于密集无次序要求的任务并行处理,不同类别的任务分配到不同的工作线程中,实现工作的并行化,加快任务处理速度,根据任务组之间的依赖关系,确定出任务组的执行次序,可以快速解决复杂有次序要求的任务,优化任务执行的时间,缩短加载等待时间,提升游戏流畅度,给予客户优良的游戏体验。
适用于游戏引擎各个版本开发的游戏,在无需花费高成本对代码进行大量重构的前提下,解决对于使用某些版本的游戏引擎开发的游戏,使用单线程框架无法通过多线程发挥多核的计算优势的问题,让该版本之后的迭代版本能够直接利用现有已开发完成的游戏,且不会给已上线或者成熟的游戏带来不确定性的风险。
附图说明
图1是本发明的一种任务执行方法实施例的步骤流程图;
图2是本发明的一种多线程框架的整体结构示意图;
图3是本发明的一种任务系统的结构示意图;
图4是本发明的另一种任务执行方法实施例的步骤流程图;
图5是本发明的一种资源管理框架的结构示意图;
图6是本发明的一种任务执行装置实施例的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
目前,对于某些版本(如Unity 2018以前的版本)游戏引擎开发的游戏,由于游戏引擎本身的特性,没有直接的多线程接口(IJob),依旧使用单线程框架。对于该版本之后的迭代版本,虽然增加了多线程接口,但是对于已经成型的游戏或者在已经在开发过程中的游戏,如果要移植到之前的版本,则需要对游戏项目进行重构,不仅成本高昂,且会给已上线或者成熟的游戏带来大量的不确定性风险。因此,对于单线程游戏引擎开发的游戏,缺乏一个好的线程框架,以解决使用单线程框架遇到在计算机多核时代无法发挥多核的计算优势、加载体验上等待时间长、游戏流畅度上存在卡顿、逻辑计算中花费时间超长等问题。
对于游戏引擎的资源加载方面,首先需要根据资源包提供的接口解析资源的引用关系,然后依次根据资源信息处理,然后构造其资源路径进行线性加载,在使用完后,在游戏逻辑中同步释放。而以上资源加载方式将会给引用关系复杂的、计算存储位置等的中间过程造成巨大的逻辑运算量,其次对于同时加载巨大资源量的资源时容易出现内存超过系统内存阈值的情况,从而给游戏带来以下缺陷:计算等待时间超过预期或者超过用户可接受范围、内存超过系统阈值造成的稳定性等问题。
为了解决上述问题,本发明提供了一种任务执行方法,具有高效性:使得硬件中的多核红利得以应用,不同类别的任务分配到不同的独立工作线程中,实现工作的并行化,不再需要单线程的线性执行,极大地提高了游戏本身的吞吐,从而获得表现上、加载上、体验上的提升。易重构:在已经开发完成或者已经开发了部分功能的产品中,可以保留现有结构只需添加少许代码即可完成多线程化。稳定性:在增加池缓存的机制上,有效地控制了内存的峰值,同时控制了线程的数量等,在计算机单元中,保证了内存阈值以及线程数量造成的闪退问题不会出现。
参照图1,示出了本发明的一种任务执行方法实施例的步骤流程图,本发明实施例具体可以包括如下步骤:
步骤101,确认任务池中的任务的任务类别。
其中,本发明实施例提供了一种多线程框架,可以调用多工作线程共同执行任务,多线程框架包括任务池,任务池包括若干不同类别的任务,例如MAIN型任务和SUB型任务。本发明实施例通过多线程框架处理游戏的任务,在进入游戏场景中,会根据用户的操作产生各种加载游戏资源的请求,根据各种加载游戏资源的请求提交各种类别的任务,并将提交的各类任务汇集到多线程框架的任务池中。
具体地,在执行任务之前,需要确定出任务池中所有任务的任务类别,例如将包含游戏引擎原生应用程序接口(API)的任务确定为MAIN型任务,其他任务确定为SUB型任务。
步骤102,依据所述任务的任务类别,确定所述任务对应的工作线程。
其中,多线程框架中包括若干工作线程,不同的类别的任务由对应不同的工作线程执行,例如工作线程包括主工作线程和其他工作线程,那么任务类别为Main型任务对应主工作线程,为Sub型任务对应其他工作线程。
具体地,确定出任务池中所有任务的任务类别后,依据任务的任务类别,确定不同类别任务对应的工作线程。
参照图2,示出了本发明的一种多线程框架的整体结构示意图,如图可知,图中任务池(Works)中包含若干任务(Work1,Work2……),通过本发明的多线程架,确定出任务池中任务的类别,以及确认出任务对应的主工作线程(Main Thread)或其他工作线程(WorkerThread),在执行任务时,通过将任务根据任务类别分配给具体对应的工作线程执行,此外,还可以通过多线程框架对工作线程中任务的完成状况进行监控。
步骤103,将属于不同所述工作线程且能并列执行的任务组成为任务组。
具体地,在将不同的类别的任务对应的工作线程后,将能够同时执行,并且同时属于不同的类别的任务组成为任务组,得到多个任务组,每个任务组包含不同类别,且能够并列执行的任务。
在本发明一示例中,所述步骤103包括:获取所述任务之间的引用关系,依据所述任务之间的引用关系确定出能并列执行的任务。
其中,任务与任务之间存在引用关系,a任务引用b任务,那么a任务执行时就需要加载b任务执行完后产生的资源包,通常根据任务之间的引用关系可以确定任务之间的先后执行次序。
具体地,获取任务池中任务之间的引用关系,对于能并列执行的任务可以通过任务之间的引用关系(任务执行时需要加载的资源包)确定,例如:存在三个工作线程分别为A工作线程、B工作线程以及C工作线程,在加载一个小场景的过程中,需要执行a1、a2、a3、b1、b2、b3、c1、c2、c3任务。其中,a1、a2、a3任务只能在A工作线程执行,b1、b2、b3任务只能在B工作线程执行,c1、c2、c3任务只能在C工作线程执行。执行任务过程中,对于a1、b1、c1任务并不需要引用其他任务(即执行任务时不需要加载其他任务执行完后产生的资源包),执行时直接加载现有的资源包即可,那么确定a1、b1、c1任务为能并列执行的任务,将a1、b1、c1任务组成一个属于不同所述工作线程且能并列执行的第一任务组;当a2任务引用a1任务、或同时引用a1、b1任务、或同时引用a1、b1、c1任务时(即执行a2任务时需要加载其a1任务、或a1、b1任务执行完后产生的资源包、或a1、b1、c1任务执行完生成的资源包),那么a2任务只能在a1任务,或a1、b1任务执行完后执行,即在第一任务组执行完后执行,同理,在b2、c2任务也引用c1、c2、c3任务中至少一个的情况下,将a2,b2、c2任务确定为能并列执行的任务,将a2,b2、c2任务组成属于不同所述工作线程且能并列执行的第二任务组,如此类推,可确定所有能并列执行的任务。
步骤104,确认所述任务组之间的第一依赖关系。
其中,任务组与任务组之间存在依赖关系,例如,第二任务组依赖第一任务组,那么必须在第一任务组中的任务全部执行完才能执行第二任务组中的任务。
具体地,在将不同述工作线程且能并列执行的任务组成为任务组后,根据任务组中的任务与其它任务组中的任务之间的引用关系,确定出任务组与任务组之间的第一依赖关系,例如存在三个工作线程分别为A工作线程、B工作线程以及C工作线程,第一任务组包括a1、b1、c1任务,第二任务组包括a2,b2、c2任务,第三任务组a3、b3、c3任务,其中,a1、a2、a3任务、b1、b2、b3任务和c1、c2、c3任务分别在A工作线程、B工作线程以及C工作线程执行;当第二任务组中的a2,b2、c2任务均至少引用第一任务组中a1、b1、c1任务中的一个(即执行第二任务组中的a2,b2、c2任务时,至少需要加载a1、b1、c1任务执行完后产生的资源包之一),此时,确定为第二任务组依赖第一任务组,需要在第一任务组中的任务全部执行完才能执行第二任务组中的任务。
当第二任务组中的a2,b2、c2任务均至少引用第一任务组中a1、b1、c1任务中的一个,且第三任务组中的a3、b3、c3任务均至少引用第一任务组中a1、b1、c1任务中的一个,确定为第三任务组和第二任务组均依赖第一任务组。
当存在第二任务组中的a2,b2、c2任务均至少引用第一任务组中a1、b1、c1任务中的一个,第三任务组中的a3、b3、c3任务均至少引用第一任务组中a1、b1、c1任务中的一个,且第三任务组中的a3、b3、c3任务均至少引用第二任务组中a2,b2、c2任务中的一个,确定为第三任务组依赖第二任务组,第二任务组依赖第一任务组。
参照图3,示出了本发明的一种任务系统的结构示意图,如图可知,在任务系统(Tasks(Jobs)System)中确定不同类别任务(Tasks(Jobs))对应的工作线程,任务(GameObject、LoadAssetAsyn、RectTransform……)的为Main类(Main-UnityEngine),在主线程(Unity Render UI Engine Etc.)执行;任务(Data Compute、Data Combine、DataProcess、Logic……)为Sub类(Sub-Logic Data),在其他线程(Data Process Etc.)执行,并将属于不同工作线程(不同类别)且能并列执行的任务(Tasks)组成为任务组(Group 1,Group 2……),如任务组1(Group 1:GameObject、Data Compute、Logic……),任务组2(Group 2:LoadAssetAsyn、Data Combine、Logic……)等,然后确定任务组与任务组之间的依赖关系。
步骤105,依据所述第一依赖关系,执行所述任务组,其中,所述任务组中的所述任务为通过调用对应的所述工作线程并列执行的任务。
具体地,根据任务组与任务组之间的第一依赖关系,依次执行任务组,例如A任务组依赖B任务组,那么是先执行完B任务组后再执行A任务组,且在执行A、B任务组时,通过调用多线程框架中的工作线程并列执行任务组中的不同类别的任务。
当存在第二任务组和第三任务组同时依赖第一任务组的情况,在执行完第一任务组后,从第二任务组和第三任务组随机选取一个在先执行。
对于多核(多个CPU)计算的计算机,使用单线程框架时,线性处理任务,仅采用单核(单CPU)就能满足单线程框架的使用条件,致使剩余的多核(多个CPU)无法发挥性能,在本发明实施例中,通过调用多线程框架中的工作线程并列执行任务组中的不同类别的任务,可以发挥出计算机中的多核(多个CPU)的计算优势,缩短计算时间。
在本发明一示例中,通过本发明的多线程框架,可以监测任务组中任务的并列执行进程,以便对执行的任务进行管理。
本发明实施例中,通过多线程框架将任务池中的任务依据类别确定给应的工作线程,同时将属于不同工作线程且能并列执行的任务组成为任务组,根据任务组之间的依赖关系,确定出任务组的执行次序,然后通过多线程框架中的多个工作线程分别执行任务组中的任务。本发明实施例中,多个工作线程可以发挥出计算机多核的计算优势,对于密集无次序要求的任务并行处理,不同类别的任务分配到不同的工作线程中,实现工作的并行化,加快任务处理速度,根据任务组之间的依赖关系,确定出任务组的执行次序,可以快速解决复杂有次序要求的任务,优化任务执行的时间,缩短加载等待时间,提升游戏流畅度,给予客户优良的游戏体验。
本实施例中的多线程框架以及任务执行方法,还适用于游戏引擎各个版本开发的游戏,在无需花费高成本对代码进行大量重构的前提下,解决对于使用某些版本的游戏引擎开发的游戏,仅使用单线程框架无法通过多线程发挥多核的计算优势的问题,让迭代版本能够直接利用现有已开发完成的游戏,且不会给已上线或者成熟的游戏带来不确定性的风险。
参照图4,示出了本发明的另一种任务执行方法实施例的步骤流程图,本发明实施例具体可以包括如下步骤:
步骤401,确认任务池中的任务的任务类别。
步骤402,依据所述任务的任务类别,确定所述任务对应的工作线程。
步骤403,将属于不同所述工作线程且能并列执行的任务组成为任务组。
步骤404,确认所述任务组之间的第一依赖关系。
步骤405,依据所述第一依赖关系,确定所述任务组的执行次序。
具体地,根据任务组与任务组之间的第一依赖关系,确定出任务组的执行次序,按照任务组的执行次序,依次执行任务组,例如A任务组依赖B任务组,那么确定先执行完B任务组后再执行A任务组。
步骤406,按照所述任务组的执行次序,依次执行所述任务组,其中,所述任务组中的所述任务为通过调用对应的所述工作线程并列执行的任务。
在本发明一实施例中,所述步骤406包括:执行所述任务组的所述任务时,加载所述任务组的所述任务对应的资源包。
其中,游戏引擎开发的游戏中,动态资源管理使用其提供的资源包(AssetBundle)进行管理,本发明实施例中加载的资源包的数量由设备内存决定。
具体地,在通过调用多线程框架中的工作线程并列执行任务组中的不同类别的任务,需要调用任务对应的资源包进行加载,通过任务管理系统采用异步IO进行管理,在加载资源包的同时能够进行一些其他的运算操作,实现多个资源包同时加载,实现通过多工作线程并列执行任务组中的任务。
在本发明实施例中,在工作线程并列执行任务组中的任务时,资源包的数量由设备内存决定,通过异步IO进行管理资源包,在加载资源包的同时能够进行一些其他的运算操作,实现多个资源包同时加载,避免了线性加载资源包的方式,并使得同时加资源包的数量达到最优,并且同时控制了系统在加载时的内存峰值,进而控制了线程的数量等,保证了内存阈值以及线程数量造成的闪退问题不会出现。
在本发明一实施例中,在所述加载所述任务组的所述任务的对应的资源包之前,还包括:获取资源包与其他资源包之间的第二依赖关系;依据所述第二依赖关系加载所述资源包依赖的所述其他资源包。
其中,在加载待加载资源包之前,需要加载完待加载资源包依赖的资源。
具体地,在加载任务组的任务对应的资源包之前,需要通过游戏引擎原生解引用机制得到资源包与资源包之间的第二依赖关系,并根据第二依赖关系确定出待加载的资源包依赖的其他资源包,并加载待加载的资源包依赖的其他资源包。
另外,资源包与其他资源包之间的第二依赖关系与任务之间的引用关系相对应,例如,a任务执行时,需要加载第一资源包,而第一资源包又依赖第二资源包,所以a任务执行时需要先加载第二资源包后再加载第一资源包,此时,若第一资源包现有,而第二资源包需要b任务执行完成后产生,那么a任务引用b任务,a任务执行前需要先执行b任务,a任务在第一任务组内,b任务在第二任务组内,那么第一任务组必须在第二任务组中的任务全部执行完后再执行,若第一任务组和第二任务组之间不存在与其他的任务组,那么第一任务组依赖第二任务组,即确定出第一任务组与第二任务组的第一依赖关系。
在本发明一实施例中,在所述加载所述任务组的所述任务对应的资源包之前,所述方法还包括:对所述任务组的所述任务对应的待加载的资源包进行逻辑处理;其中,所述逻辑处理至少包括以下之一:文件名检查、资源路径检查、资源版本检查、错误处理。
具体地,在加载任务组的任务对应的资源包之前,还需要确定通过游戏引擎提供的系统接口进行资源包确认,在确认后。对资源包进行逻辑处理,逻辑处理至少包括文件名检查、资源路径检查、资源版本检查、资源本地检查、资源位置填充(网络或本地)、错误处理等,在逻辑处理完后,向资源请求池提交加载请求,以进行下一步资源包加载操作。
在本发明一实施例中,所述步骤406包括:在所述任务执行完成后,释放所述资源包。
在本发明一实施例中,所述释放所述资源包,包括:确定所述资源包或所述其他资源包,是否被其他待加载的资源包依赖;若是,在加载结束后,缓存所述资源包或所述其他资源包;若否,释放所述资源包或所述其他资源包。
其中,多线程框架还包括资源池,用于缓存加载以及待加载的资源包。
具体地,在加载完资源包或其他资源包后,先判断资源包或其他资源包,是否被其他待加载的资源包依赖,若是,则表明该资源包或其他资源包还需要被再次加载,通过缓存机制将资源包缓存在资源池,以便下次加载时可以快速访问到该资源包或其他资源包。
在本发明实施例中,在加载完资源包或其他资源包后,确定出被其他待加载的资源包依赖的资源包或其他资源包,并通过缓存机制将资源包或其他资源包缓存资源池,以便下次加载时可以快速访问到该资源包或其他资源包,缩短任务执行时间,避免计算等待时间超过预期或者超过用户可接受范围。
在本发明一实施例中,所述在所述任务执行完成后,释放所述资源包,包括:在所述任务执行完成后,返回所述任务执行的结果;在返回所述任务执行的结果后,释放所述资源包。
其中,在相关技术中,在加载完资源包后,通过系统提供异步释放的接口对加载完的资源包进行释放,在释放完资源包后,任务执行完成,然后向用户返回任务执行结果,导致在资源包释放的过程中,加载等待时间过长,浪费用户的时间,给用户带来不好的体验。
具体地,本发明实施例在加载完资源包后,对资源包进行异步释放处理,即在任务执行完成后,立即返回任务执行的结果给用户,将资源包延后释放处理。
在本发明实施例中,对资源包进行异步释放处理,先返回任务执行的结果给用户,将资源包延后释放处理,使得资源包的释放不会耗费用户的时间,提升用户的游戏体验。
参照图5,示出了本发明的一种任务执行方法实施例的步骤流程图,如图可知,在通过多工作线程并列执行任务组中的任务时,资源管理系统(Asset Manage System)通过异步IO管理,加载任务对应的资源包:
在并列执行任务组中的任务时,多线程框架(Multi-Thread System)会接收到资源管理系统返回的异步加载指令(Alync Opration),然后多线程框架开始通过资源包加载接口进行资源包加载(Load Asset),并向资源管理系统输入任务对应的资源包名称(AssetName),资源管理系统根据资源包名称确定出资源包之间的依赖关系(引用关系),从而确定需要加载的资源,并通过多线程框架对待加载等资源包进行逻辑处理(例如0-文件名的正确映、1-资源本地检查、2-资源位置填充(网络或本地)、3-资源读取请求、4-错误处理等),然后向资源请求池(RequestAssetPool)在增加加载请求(Requests),通过请求池(RequestPool)中的RequestLoadWorker调用加载请求,通过资源加载处理程序(LoadAsset Hander)进行资源加载(Loaded Asset)。
在加载完资源包后,多线程框架开始卸载(Unload)资源包,并输入需要卸载的资源包对应的资源包名称(Asset Name)进入资源管理系统,确认需要卸载的资源包(unload()),增加资源包释放请求,通过多线程框架对待释放的资源包进行逻辑处理(如0-获取需要释放的资源、1-资源引用计数处理、2-延迟释放技术、3-错误处理等),然后通过资源卸载处理程序释放资源包。
本发明实施例中,在工作线程并列执行任务组中的任务时,资源包的数量由设备内存决定,通过异步IO进行管理资源包,在加载资源包的同时能够进行一些其他的运算操作,实现多个资源包同时加载,避免了线性加载资源包的方式,并使得同时加资源包的数量达到最优,并且同时控制了系统在加载时的内存峰值,进而控制了线程的数量等,保证了内存阈值以及线程数量造成的闪退问题不会出现。
在加载完资源包或其他资源包后,确定出被其他待加载的资源包依赖的资源包或其他资源包,并通过缓存机制将资源包或其他资源包缓存资源池,以便下次加载时可以快速访问到该资源包或其他资源包,缩短任务执行时间,避免计算等待时间超过预期或者超过用户可接受范围。
对资源包进行异步释放处理,先返回任务执行的结果给用户,将资源包延后释放处理,使得资源包的释放不会耗费用户的时间,提升用户的游戏体验。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作并不一定是本发明实施例所必须的。
参照图6,示出了本发明的一种任务执行装置实施例的结构框图,本发明实施例具体可以包括如下模块:
类别确认模块601,用于确认任务池中的任务的任务类别;
线程确定模块602,用于依据所述任务的任务类别,确定所述任务对应的工作线程;
任务组成模块603,用于将属于不同所述工作线程且能并列执行的任务组成为任务组;
关系确定模块604,用于确认所述任务组之间的第一依赖关系;
任务执行模块605,用于依据所述第一依赖关系,执行所述任务组,其中,所述任务组中的所述任务为通过调用对应的所述工作线程并列执行的任务。
本发明一实施例中,所述任务执行模块605,包括:
次序确定子模块,用于依据所述第一依赖关系,确定所述任务组的执行次序;
执行子模块,用于按照所述任务组的执行次序,依次执行所述任务组。
本发明一实施例中,所述执行子模块,包括:
资源加载单元,用于执行所述任务组的所述任务时,加载所述任务组的所述任务对应的资源包;
资源释放单元,用于在所述任务执行完成后,释放所述资源包。
本发明一实施例中,所述资源释放单元,包括:
结果返回子单元,用于在所述任务执行完成后,返回所述任务执行的结果;
第一资源释放子单元,用于在返回所述任务执行的结果后,释放所述资源包。
本发明一实施例中,在所述资源加载单元之前,所述方法还包括:
资源处理单元,用于对所述任务组的所述任务对应的待加载的资源包进行逻辑处理;其中,所述逻辑处理至少包括以下一种:文件名检查、资源路径检查、资源版本检查、错误处理。
本发明一实施例中,在所述资源加载单元之前,还包括:
关系确定单元,用于获取资源包与其他资源包之间的第二依赖关系;
资源确认单元,用于依据所述第二依赖关系加载所述资源包依赖的所述其他资源包。
本发明一实施例中,所述资源释放单元,包括:
依赖确定子单元,用于确定所述资源包或所述其他资源包,是否被其他待加载的资源包依赖;若是,则调用资源缓存子单元,若否,则调用第二资源释放子单元;
所述资源缓存子单元,用于在加载结束后,缓存所述资源包或所述其他资源包;
所述第二资源释放子单元,用于释放所述资源包或所述其他资源包。
本发明实施例中,通过多线程框架将任务池中的任务依据类别确定给应的工作线程,同时将属于不同工作线程且能并列执行的任务组成为任务组,根据任务组之间的依赖关系,确定出任务组的执行次序,然后通过多线程框架中的多个工作线程分别执行任务组中的任务。本发明实施例中,多个工作线程可以发挥出计算机多核的计算优势,对于密集无次序要求的任务并行处理,不同类别的任务分配到不同的工作线程中,实现工作的并行化,加快任务处理速度,根据任务组之间的依赖关系,确定出任务组的执行次序,可以快速解决复杂有次序要求的任务,优化任务执行的时间,缩短加载等待时间,提升游戏流畅度,给予客户优良的游戏体验。
对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本发明实施例公开了一种电子设备,包括处理器、存储器及存储在所述存储器上并能够在所述处理器上运行的计算机程序,所述计算机程序被所述处理器执行时实现如上任务执行方法实施例所述的步骤。
本发明实施例公开了一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现如上任务执行方法实施例所述的步骤。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
本领域内的技术人员应明白,本发明实施例的实施例可提供为方法、装置、或计算机程序产品。因此,本发明实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明实施例是参照根据本发明实施例的方法、终端设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理终端设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理终端设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理终端设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理终端设备上,使得在计算机或其他可编程终端设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程终端设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明实施例的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明实施例范围的所有变更和修改。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者终端设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者终端设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者终端设备中还存在另外的相同要素。
以上对本发明所提供的一种任务执行方法、一种任务执行装置、电子设备和存储介质,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
- 模型训练任务调度执行方法、装置、电子设备及存储介质
- 训练任务的执行方法、装置、电子设备及存储介质