CN115983047B - 一种适用于多图形接口的跨平台的仿真系统 - Google Patents
一种适用于多图形接口的跨平台的仿真系统 Download PDFInfo
- Publication number
- CN115983047B CN115983047B CN202310240069.0A CN202310240069A CN115983047B CN 115983047 B CN115983047 B CN 115983047B CN 202310240069 A CN202310240069 A CN 202310240069A CN 115983047 B CN115983047 B CN 115983047B
- Authority
- CN
- China
- Prior art keywords
- module
- information
- rendering
- task
- thread
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及计算机仿真技术领域,特别是指一种适用于多图形接口的跨平台的仿真系统,所述仿真系统包括系统核心模块、系统逻辑模块和系统渲染模块;所述系统核心模块,用于为所述系统逻辑模块和所述系统渲染模块提供系统功能,所述系统功能至少包括数学计算、提供基础数据结构、内存管理、线程调度及任务分发;所述系统逻辑模块,用于自动导入数据并加载,执行所述仿真系统的行为逻辑,并生成场景资源信息;所述系统渲染模块,用于基于所述场景资源信息进行渲染。采用本发明,可以建立一个引擎层从而为复杂仿真应用开发提供更为强大的工具支持。
Description
技术领域
本发明涉及计算机仿真技术领域,特别是指一种适用于多图形接口的跨平台的仿真系统。
背景技术
随着计算机技技术的飞速发展,计算机仿真被大量运用到各类领域,尤其是在通过仿真系统来模拟真实环境,要进行实时的三维模拟则对仿真环境提出了更高的要求。
目前图像引擎发展日渐蓬勃,如何合理利用计算机硬件资源,实现一种高效的、可扩展性强的仿真系统成为了目前较为急迫的需求。因此,建立一个引擎层从而为复杂仿真应用开发提供更为强大的工具支持,帮助应用层更快为快速的开发以及充分利用GPU和CPU的资源,提高系统的运行效率,具有及其重要的实际应用需求。
发明内容
本发明实施例提供了一种适用于多图形接口的跨平台的仿真系统。所述技术方案如下:
一方面,提供了一种适用于多图形接口的跨平台的仿真系统,所述仿真系统包括系统核心模块、系统逻辑模块和系统渲染模块;
所述系统核心模块,用于为所述系统逻辑模块和所述系统渲染模块提供系统功能,所述系统功能至少包括数学计算、提供基础数据结构、内存管理、线程调度及任务分发;
所述系统逻辑模块,用于自动导入数据并加载,执行所述仿真系统的行为逻辑,并生成场景资源信息;
所述系统渲染模块,用于基于所述场景资源信息进行渲染。
可选地,所述系统核心模块包括内存管理模块、多线程模块和任务系统模块;
所述内存管理模块,用于采用RAII和内存池技术进行内存分配和利用,其中包括:基于自建类对指针进行封装,并完善所述指针的内部逻辑结构,以实现当所述指针指向的数据离开作用域时自动释放所述指针;
所述多线程模块,用于并行执行逻辑线程和渲染线程,所述逻辑线程先于所述渲染线程第一预设数目帧,所述渲染线程先于GPU第二预设数目帧;
所述任务系统模块,用于基于有向无环图进行任务分发。
可选地,所述内存管理模块,还用于:
初始化内存池,所述内存池包括链表和可用地址数组,所述链表包括至少一个Chunk页表,所述可用地址数组包括多个可用地址;
每当从所述内存池申请第一空间时,从所述可用地址数组的末尾获取可用地址,作为所述第一空间的可用地址;
每当向所述内存池归还第二空间时,将所述第二空间的可用地址添加到所述可用地址数组的末尾;
当所述可用地址数组不存在可用地址时申请新的Chunk页表,并将所述新的Chunk页表对应的多个可用地址添加到所述可用地址数组。
可选地,所述多线程模块,用于:
在所述逻辑线程中采集指令帧,将所述指令帧中起始标识与结束标识之间的指令作为渲染指令,提交所述渲染指令;
在所述渲染线程中录制所述渲染指令作为录制指令,提交所述录制指令,其中,通过GPU Fence确定GPU落后帧数,若所述GPU落后帧数大于设定值,则所述渲染线程进入等待状态,直至所述GPU落后帧数达到设定值时恢复执行。
可选地,所述任务系统模块,用于:
构建任务节点,并维护所述任务节点与已建立任务节点之间的依赖关系,其中,所述依赖关系包括前驱与后继;
当所述任务节点无前驱任务节点时,根据所述任务节点的优先级,进入高优先级队列或低优先级队列,并排队等待空闲线程,以构建所述任务节点的任务线程;
在所述任务线程执行完毕后,销毁所述任务节点,并通知所述任务节点的后继任务节点。
可选地,所述系统核心模块还包括日志模块、数学计算模块和基础数据结构模块;
所述日志模块用于记录系统运行日志信息;
所述数学计算模块用于提供数学计算函数;
所述基础数据结构模块用于提供基础数据结构。
可选地,所述系统逻辑模块包括自动化资源管理模块,所述自动化资源管理模块包括反射模块、序列化模块与资源管理器模块;
所述自动化资源管理模块,用于:
在所述反射模块中,收集静态初始化阶段各个对象的反射信息,将指定的反射信息填充到类型数据中并进行静态管理;在使用阶段通过variant类擦除类型信息以进行数据的保存和传递,并通过policy类进行variant的操作解释;
在所述序列化模块中,在自动序列化的过程中,遍历目标对象的属性,递归解析所述目标对象,获取所述目标对象的属性的键值并写入第一json文本信息,其中,所述目标对象具有所述反射模块标记为可序列化的属性;在自动反序列化的过程中,基于所述反射模块获取第二json文本信息的名称信息,并根据所述名称信息查找数据化的数据信息,递归解析对象数据,以进行数据恢复;
在所述资源管理器模块中,基于所述反射模块和所述序列化模块进行资源管理以及资源间引用的保持。
可选地,所述自动化资源管理模块,还用于:
在所述反射模块中:
基于Utopia的方案收集所需反射的对象的源代码信息并进行词法和语法的分析,得到所述所需反射的对象各个属性的源代码子信息;
根据RTTR的反射信息编写规则及所述源代码子信息,生成所述所需反射的对象的反射信息。
可选地,所述系统逻辑模块还包括场景模块;
所述场景模块包括实体和组件,所述实体用于表示场景对象,所述组件用于描述所述实体的功能;
所述反射模块,还用于根据静态期注册的类型对所述场景对象进行编辑。
可选地,所述系统渲染模块包括RenderGraph模块、ShaderLab模块和RHI模块;
所述ShaderLab模块,用于获取渲染管线的状态信息,组织顶点输入信息的布局,及绑定材质信息、物体信息、帧信息的结构,以构建任一ShaderLab方案及对应的shaderpass信息;
所述RenderGraph模块,用于基于所述场景资源信息和所述shader pass信息生成有向无环图的节点数据,通过有向无环图生成渲染操作信息;
所述RHI模块,用于基于所述渲染操作信息调用图形API,生成仿真场景渲染结果。
本发明实施例提供的技术方案带来的有益效果至少包括:
本发明实施例中,仿真系统包括系统核心模块、系统逻辑模块和系统渲染模块;系统核心模块用于为系统逻辑模块和系统渲染模块提供系统功能,系统功能至少包括数学计算、提供基础数据结构、内存管理、线程调度及任务分发;系统逻辑模块,用于自动导入数据并加载,执行仿真系统的行为逻辑,并生成场景资源信息;系统渲染模块,用于基于场景资源信息进行渲染。本发明建立了一个引擎层从而为复杂仿真应用开发提供更为强大的工具支持,帮助应用层更快为快速的开发以及充分利用GPU和CPU的资源,提高系统的运行效率,具有及其重要的实际应用需求。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种仿真系统示意图;
图2是本发明实施例提供的一种模块关系图;
图3是本发明实施例提供的一种内存管理模块设计示意图;
图4是本发明实施例提供的一种逻辑线程、渲染线程与GPU的运行逻辑示意图;
图5是本发明实施例提供的一种任务分发系统设计示意图;
图6是本发明实施例提供的一种场景物体运行逻辑示意图;
图7是本发明实施例提供的一种仿真系统的使用流程图。
具体实施方式
为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
本发明实施例提供了一种适用于多图形接口的跨平台的仿真系统,如图1所示的仿真系统示意图,该仿真系统可以包括系统核心模块、系统逻辑模块和系统渲染模块。其中:
系统核心模块,可以用于为系统逻辑模块和系统渲染模块提供系统功能,该系统功能至少可以包括数学计算、提供基础数据结构、内存管理、线程调度及任务分发;
系统逻辑模块,可以用于自动导入数据并加载,执行仿真系统的行为逻辑,并生成场景资源信息;
系统渲染模块,可以用于基于场景资源信息进行渲染。
可选地,系统核心模块可以包括内存管理模块、多线程模块和任务系统模块。进一步可选地,系统核心模块还可以包括日志模块、数学计算模块和基础数据结构模块,日志模块可以用于记录系统运行日志信息,数学计算模块可以用于提供数学计算函数,基础数据结构模块可以用于提供基础数据结构。
一种可行的实施方式中,系统核心模块作为支撑库提供最为核心且基本的系统功能,组成包括:日志模块、数学计算模块、内存管理模块、基础数据结构、多线程模块、任务系统模块。其中日志模块在主线程中进行系统运行日志的输出;数学计算模块与基础数据模块提供最基本的数学计算函数与基本的数据结构如环形队列等;内存管理模块通过采用RAII和内存池化技术,为整个系统提供内存分配和利用,同时也杜绝了内存泄露的问题;多线程模块采用了错帧的方式,实现了线程之间的平衡负载;对于任务系统模块设计了任务分发系统,在设计结构上能够更加高效的利用CPU的多核计算资源。
可选地,系统逻辑模块包括自动化资源管理模块,自动化资源管理模块包括反射模块、序列化模块与资源管理器模块。进一步可选地,系统逻辑模块还包括场景模块。
一种可行的实施方式中,系统逻辑模块的目的是实现数据的自动导入、加载,以及支撑仿真系统的行为逻辑。组成包括:反射模块、序列化模块、资源管理器模块、场景模块。其中反射模块以RTTT库作为基础,实现了一种反侵入式的反射方案,能够在运行时动态获取对象属性与方法;序列化模块能够将场景资源保存到本地和加载到内存来保存场景编辑的结果,减少场景构建过程中的重复劳作;资源管理器在本系统中负责系统中的资源管理以及资源间引用的保持,与反射模块与序列化模块共同组成自动化资源管理模块,共同实现快捷的实现场景数据的存储和加载;场景模块采用组件化进行相应的设计,并对其中的物体运行逻辑通过反射扩展类的方法将C++作为逻辑脚本。
可选地,系统渲染模块包括RenderGraph模块、ShaderLab模块和RHI模块。
一种可行的实施方式中,系统渲染模块的目的是实现图形层的抽象,更友好的渲染逻辑管理,以及渲染资源的自动化绑定,提供更强大的渲染功能支撑。组成包括:RHI模块、ShaderLab模块、RenderGraph模块。其中RHI模块实现了一种用于提供统一的抽象使得调用具体的图形API方案;ShaderLab模块能够使得程序不使用硬编码的方式对资源进行绑定,能够更好的管理在构建shader pass过程中的一系列信息;RenderGraph模块能够简化资源管理以及渲染管线的配置,支持更高性能的独立渲染模块,以及可视化的渲染管线用于快速定位与调试。
上述各个模块之间的关系如图2所示。
下面将对内存管理模块、多线程模块和任务系统模块进行介绍。
内存管理模块,可以用于采用RAII和内存池技术进行内存分配和利用,其中包括:基于自建类对指针进行封装,并完善指针的内部逻辑结构,以实现当指针指向的数据离开作用域时自动释放指针。
一种可行的实施方式中,在仿真系统中的内存模块管理上,全面采用了RAII和内存池化技术,从而从根本上杜绝内存泄漏问题。对于所有的指针,都使用类进行封装,并完善其析构逻辑,从而实现指针指向数据离开作用域时的自动释放。对于需要大规模构建和释放的对象,如纹理、任务节点等,为了降低创建和销毁对象产生的开销,同时考虑到对象访问地址的连续性,构建了一个动态的内存池,其实现如图3所示的内存管理模块设计示意图。
可选地,内存管理模块,还用于:
初始化内存池,内存池包括链表和可用地址数组,链表包括至少一个Chunk页表,可用地址数组包括多个可用地址;
每当从内存池申请第一空间时,从可用地址数组的末尾获取可用地址,作为第一空间的可用地址;
每当向内存池归还第二空间时,将第二空间的可用地址添加到可用地址数组的末尾;
当可用地址数组不存在可用地址时申请新的Chunk页表,并将新的Chunk页表对应的多个可用地址添加到可用地址数组。
一种可行的实施方式中,实现的内存池是一个模板类型的池,可用于多种类型数据的复用,其核心数据结构由一个Chunk组成的链表和一个可用元素数组构成,本系统设定的默认页表大小为1024个元素。其中内存池初始化时会申请一个Chunk页表,将整个页表作为一个buffer申请内存,并将每个元素地址记录到可用地址数组等待取用。每当系统从内存池申请一块空间都会从数组的末尾取出一个地址,同样的,每当系统归还空间时都会将地址返还到可用地址数组的尾部。同时内存池提供了池的扩展能力,当可用地址用光时能够申请一个新的页表添加到链表尾部,从而得到新的可用地址空间。当可用地址远远超出页表大小时能够移动页表内元素数据,进而减少页表数量,防止出现峰值情况下申请过多空间又释放后导致内存无效占用过多的问题。
可选地,多线程模块,可以用于并行执行逻辑线程和渲染线程,逻辑线程先于渲染线程第一预设数目帧,渲染线程先于GPU第二预设数目帧。
一种可行的实施方式中,多线程框架设计的核心是通过多线程并行提高GPU和CPU的利用率,进而提升程序运行性能。设计了指令错帧的方式将渲染逻辑从主线程中抽离出来,增大渲染指令粒度来降低线程间由于同步等待带来的性能开销;同时设计了线程池并行子任务,进一步降低主线程与渲染线程的执行压力,从而实现更好的负载平衡。
在系统中采用多线程的设计方案,逻辑线程和渲染线程并行执行,其中逻辑线程(主线程)负责对世界场景的模拟以及仿真任务的分发,渲染线程根据逻辑线程模拟得到的结果生成渲染指令,逻辑线程相较于渲染线程会快1-2帧,渲染线程相较GPU也会快1-2帧。
可选地,多线程模块可以用于:
在逻辑线程中采集指令帧,将指令帧中起始标识与结束标识之间的指令作为渲染指令,提交渲染指令;
在渲染线程中录制所述渲染指令作为录制指令,提交录制指令,其中,通过GPUFence确定GPU落后帧数,若GPU落后帧数大于设定值,则渲染线程进入等待状态,直至GPU落后帧数达到设定值时恢复执行。
一种可行的实施方式中,系统中多线程通信的核心是无锁的环形队列,用于单生产者单消费者模型。设计了一个可扩展的环形队列模型,该队列是一个模板类型队列,以数组作为基本数据结构,采用双下标实现环形索引。该队列也提供了扩展能力,通过地址空间数据深拷贝移动的方式实现数组的容量扩展,同时设计中采用了灵活的自动扩展方式,在容量较小时扩展两倍,在数组容量达到一定规模时以1.5倍进行扩展。
本系统维护了一个无锁的环形队列用于指令错帧,并通过Begin(即起始标识)/End(即结束标识)对来指定帧内指令采集范围,若队列为空,会导致渲染线程自旋,而队列为满,则会使得主线程跳过场景逻辑更新与渲染指令传输。这种设计能够使得逻辑线程每次能够给渲染线程传递一个完整的帧渲染指令,这种大粒度的指令集合能够令逻辑和渲染线程更为专注的执行各自的工作而非将大量时间花费在细粒度指令的同步上。
然而,由于系统的逻辑线程采集完毕整个帧的渲染指令才会推送到环形队列中等待渲染线程读取,为了防止出现错帧下的读写冲突问题,需要保存完整的渲染指令与渲染数据,采用匿名函数通过深拷贝捕获的方式保存渲染指令和渲染数据代理。
对于渲染线程与GPU的错帧则是渲染线程不断向GPU提交渲染指令,这里通过一个fence来判断渲染线程执行速度相对于GPU的领先程度,若GPU落后帧数大于设定值,则渲染线程会进入等待状态。逻辑线程、渲染线程与GPU的运行逻辑如图4所示。
在线程池的设计上,仍以环形队列作为基本消息传递的数据结构,以Lambda作为任务形式,不过由于需要有多线程竞争任务,为线程池加锁从而保证队列中任务的正确流出。线程在队列为空时等待队列中产生任务并挂起,每当有任务被载入队列时会有一个线程被唤醒来执行任务,同时该线程池支持任务数据返回与返回值的自动推导。
纯粹的线程池由于相对于任务分配系统更为简单的结构,在系统中用于无依赖任务的分配。
可选地,任务系统模块,可以用于基于有向无环图进行任务分发。
一种可行的实施方式中,为了进一步提升系统的并行能力,设计了一个基于有向无环图的任务分发系统Task Graph,该系统能够将一系列带有依赖的任务组织成有向无环图,通过线程池消费无关的任务,从而更高效的利用CPU多核的计算资源。
可选地,任务系统模块,用于:
构建任务节点,并维护任务节点与已建立任务节点之间的依赖关系,其中,依赖关系包括前驱与后继;
当任务节点无前驱任务节点时,根据任务节点的优先级,进入高优先级队列或低优先级队列,并排队等待空闲线程,以构建任务节点的任务线程;
在任务线程执行完毕后,销毁该任务节点,并通知任务节点的后继任务节点。
一种可行的实施方式中,如图5所示,任务分发系统主要由内存池、任务内存分配器、线程池、任务节点这几部分组成。该任务分发系统支持:
1)任务注册后的按依赖自动执行与自动销毁;
2)支持任意类型、大小的任务;
3)支持非相关任务的并行执行;
4)支持线程间同步。
在任务分发系统的设计上,其核心是任务节点与任务图的设计,其类图主要成员如图5所示。可以看到,节点拥有一个前驱列表和一个后继列表用于维护节点间的依赖,每当一个新的节点入图会调用函数为之分配内存空间并根据输入依赖建立依赖关系。没有前驱的节点会根据其设定的优先级自动入队并等待空闲线程执行,当任务执行完毕后会自动销毁并通知后继任务,使得后继任务依赖数量减一并决策是否入队。为了统一管理多样的任务,系统建立了统一基类以及继承该类的模板类,同时通过一个内存封装器在内存分配上额外做了对齐操作。
任务分发系统维护了一个原子递增的下标用于标记任务作为索引,并建立了两个哈希表用于更好的管理系统中的任务节点,其中前者为类哈希到任务节点组的映射,用于管理相同类型的任务类型,后者为下标到任务节点的映射,用于快速索引到对应节点。此外系统中构建一个了线程池,线程池中维护若干个线程,同时分配一个高优先级队列和一个低优先级队列,这两个队列均为环形队列,其中高优先级队列相比低优先级队列优先执行。当队列中存在任务节点时,会唤醒线程池中的工作线程执行任务。
总体来说,该系统的行为逻辑如下:
1)构建任务,从对齐的内存池中获取一块空间并构造;
2)任务节点入图,将任务指针注册到任务分配系统,组成有向无环图;
3)当任务前驱数量为零时进入环形队列,先进先出;
4)唤醒一个线程,线程抢占任务,任务执行完毕后自行销毁并通知后继任务。
下面将对自动化资源管理模块进行介绍。
自动化资源管理模块包括反射模块、序列化模块与资源管理器模块。为了避免复杂系统下手动的资源索引、绑定、代码编辑等繁琐操作,利用USRefl文本预编译器与RTTR反射库,提出一个自动化的资源管理方案,降低开发过程中繁琐操作带来的心智开销。其核心为反射、序列化以及资源管理器。该方案相比于UE4的UHT加基于宏的侵入式反射方案,具有更强的封装性与代码整洁性。
可选地,自动化资源管理模块,用于:
在反射模块中,收集静态初始化阶段各个对象的反射信息,将指定的反射信息填充到类型数据中并进行静态管理;在使用阶段通过variant类擦除类型信息以进行数据的保存和传递,并通过policy类进行variant的操作解释;
在序列化模块中,在自动序列化的过程中,遍历目标对象的属性,递归解析目标对象,获取目标对象的属性的键值并写入第一json文本信息,其中,目标对象具有反射模块标记为可序列化的属性;在自动反序列化的过程中,基于反射模块获取第二json文本信息的名称信息,并根据名称信息查找数据化的数据信息,递归解析对象数据,以进行数据恢复;
在资源管理器模块中,基于反射模块和序列化模块进行资源管理以及资源间引用的保持。
一种可行的实施方式中,反射在定义上指程序在运行时动态获取对象属性与方法的一种机制,使得程序能够在运行时获取对象的类型信息,从而提供了运行时修改或重构对象的能力,根据名字创建对象的能力等。然而当前使用的C++20标准仍未提供语言层面的反射能力,因此采用RTTR库作为反射模块的基础。
该库采用的是一种非侵入式的反射方案,通过RTTR_REGISTRATION宏作为全局静态函数,执行静态初始化阶段的反射信息收集,在信息收集阶段将指定的反射信息如构造函数、方法、属性等填充到类型数据中并进行静态管理,在类型构造时利用模板记录真正的类型抽象成wrapper提供数据访问能力,并用wrapper基类提供统一的数据接口。在使用阶段通过variant类擦除类型信息用于数据的统一保存和传递,并通过policy类进行variant的操作解释,从而实现反射数据的存储、传递与取出。
然而仅依赖该库仍然需要为每个需要反射的对象手动的添加反射注册信息,尤其是当需要反射的对象不断增加与增大,该过程会变得十分的繁琐。因此提出使用文本分析的方式来自动的添加反射信息。因此,在一些可选方案中,自动化资源管理模块,还用于:
在反射模块中:
基于Utopia的方案收集所需反射的对象的源代码信息并进行词法和语法的分析,得到所述所需反射的对象各个属性的源代码子信息;
根据RTTR的反射信息编写规则及源代码子信息,生成所需反射的对象的反射信息。
一种可行的实施方式中,由于解析文本需要进行词法和语法的分析,采用了ANTLR4库作为文本编译器。根据设定的词法和语法规则,ANTLR4能够生成一个词法解析器、一个语法解析器、一个Visitor和一个Listener帮助解析文本和遍历解析树。在词法和语法规则的设计上,采用了Utopia的方案收集C++源代码的信息,并将诸如命名空间、类信息、方法信息、成员信息、元信息等源代码子信息收集起来。在得到了这些源代码子信息后,按照RTTR的反射信息编写规则自动生成一份编译后的反射信息。这样在开发过程中只需要关注类本身以及需要序列化的对象,而不需要为每个类书写一份反射注册信息。
序列化在资源管理中也是必不可少的一部分,作为一个复杂系统,需要将场景资源保存到本地和加载到内存来保存场景编辑的结果,减少场景构建过程中的重复劳作。采用json文件作为序列化的文件形式,并采用rapidjson这一轻量的序列化库实现json的存取,同样为了避免为每个类编写序列化和反序列化函数的重复劳作,采用反射的方式实现系列化与反序列化的自动化。
对于自动序列化,本系统提供了完善的基本类型、容器、对象嵌套,根据反射遍历对象中所有被标记为可序列化的属性,递归的解析对象,直到解析到基本类型如整数、浮点数、字符串等,并将键值对写入json。对于自动反序列化,首先将json文本信息写入DOM,然后根据反射得到的名字查找序列化的数据信息,再递归的解析对象数据,从而实现数据的恢复。得益于反射根据名字创建对象的能力和虚基表的内存偏移查询能力,本系统支持在引擎层中序列化与反序列化应用层中定义的对象。
资源管理器在本系统中负责系统中的资源管理以及资源间引用的保持,在反射与序列化模块的支持下,目前可以快捷的实现场景数据的存储与加载。当前资源管理器由若干个内存池和若干个哈希表组成,分别用于内存中资源的分配和索引,其中索引通过GUID来实现。对于资源类型,目前设计了纹理、材质、着色器、几何网格体、场景这五种类型。对于资源间的引用保持,在扫描资产文件夹的同时为原始资源文件创建.meta文件从而为资源文件创建GUID用于资源的唯一索引,为资源的快速绑定与查询提供基础。
可选地,系统逻辑模块还包括场景模块;
场景模块包括实体和组件,实体用于表示场景对象,组件用于描述实体的功能;
反射模块,还用于根据静态期注册的类型对场景对象进行编辑。
一种可行的实施方式中,在场景模块的设计上,采用的是组件化设计,整体设计为E-C结构,场景中的物体被分为实体(Entity)和组件(Component)两种,其中实体表示场景中的对象,如智能体、光源等,其中仅包含名字、GUID等基础属性与若干组件。组件表示对象中的具体属性,用于描述实体的功能,如变换组件、几何组件、几何渲染组件等,其中变换组件表示物体的空间偏移、旋转与缩放,几何组件用于表示绑定的几何模型信息,几何渲染组件用于表示绑定的用于渲染的材质信息。目前在场景中,本系统默认提供了一个主相机与一个平行光源用于场景信息的采集与场景照明,场景中的其他对象则由用户通过编辑器反射创建。
对于场景物体的运行逻辑,通过反射扩展类的方法将C++作为逻辑脚本,相对于Lua、mono等运行在虚拟机上的脚本语言具有更快的执行速度,其整体结构如图6所示。
在设计上,场景管理器管理着场景中的所有实体的基类指针,并通过RAII自动化管理对象生命周期。场景中对象的操作有两种方式,分别是从.scene,即场景文件读取信息并反序列化到实体列表,以及在编辑器中通过编辑器反射增加和删除实体,由于对象操作涉及到了引擎层不可见的应用层扩展类,这两种操作方式都需要依赖反射查找类型来完成。在实现基类时,系统提供了对象的通用组件如变换组件等,并提供了开始运行(BeginPlay)和每帧更新(Tick)这两个虚函数用于多态调用,从而实现引擎层对应用层扩展类的逻辑调用。
编辑器反射,顾名思义就是利用反射模块的功能,在编辑器中根据静态期注册的类型来编辑场景对象,来达到良好的用户交互体验。
在UI的选择上,本系统采用的是ImGui,该库是一个轻量级的立即模式GUI框架,该模式下的控件没有自己的对象,也不需要保存任何的状态,这种控件即函数的模式适用于显示区域需要实时刷新的应用,相较于传统的保留模式GUI框架如Qt、MFC更为灵活,更适合于小团队的快速开发。
编辑器内共有五个窗口,分别为场景演示窗口、资产管理窗口、性能分析窗口、场景层次窗口、实体细节窗口。其中场景演示窗口本质是一个实时刷新的纹理,绑定了一块GPU内存资源;资产管理窗口显示的是以资产文件为根目录的资产文件树状结构;性能分析窗口用于查看当前运行帧率,以及逻辑线程与渲染线程的运行开销;场景层次窗口用于查看场景中物体的层次结构关系,实体细节窗口显示场景层次窗口中选中的对象的具体属性与组件信息,在图中可以通过拖拽的方式改变场景中物体的组件数据,mTransform表示物体的几何变换,mesh表示物体绑定的几何网格体信息,material表示物体绑定的材质信息,这里的材质信息中又可以绑定着色器信息并支持了shaderlab反射。
在该编辑器下,目前可以控制场景主相机运动,通过编辑器选择物体、增删查改物体、控制场景物体在场景中的变换、修改物体属性、存储和读取场景信息,查看和修改物体绑定的资产信息、开始和结束场景物体逻辑等,满足了一个上层应用开发所需要的要求。
可选地,系统渲染模块包括RenderGraph模块、ShaderLab模块和RHI模块。
ShaderLab模块,用于获取渲染管线的状态信息,组织顶点输入信息的布局,及绑定材质信息、物体信息、帧信息的结构,以构建任一ShaderLab方案及对应的shader pass信息。
一种可行的实施方式中,图形资源的绑定是一件相当繁琐的工作,在许多系统中中仍然采用硬编码的方式绑定资源,带来了物体改动上的不便。在构建一个shader pass的过程中,需要确定渲染管线的状态,如剔除方式、渲染模式、深度测试等,还需要组织顶点输入信息的布局,以及材质信息、物体信息、帧信息等结构的绑定。为了更好的管理这一系列的信息绑定,本系统设计了一套ShaderLab方案。其中每个ShaderLab包括Properties、Category与Kernel三个属性。
1) Properties表示可在编辑器中绑定的属性,如纹理、材质属性等;
2) Category等同于Unity中的SubShader,不过在通常情况下不会存在多个Category;
3) Kernel约同于Unity中的Pass,表示一个shader pass中需要完成的工作,将会被翻译成PSO用于渲染。
Kernel中有若干属性,其中Tags用于描述Kernel的一些文本属性,如Name表示该着色器的名字,Type表示使用的GPU引擎类型,分为图形、计算和拷贝引擎,Zwrite等字段表示PSO中的渲染管线状态,HLSLPROGRAM和ENDHLSL作为文本起始标记来获取着色编译器需要得到的着色器文本字段,同时支持了着色器文本的头文件引用。在ShaderLab的实现方案上,与自动化反射类似的,采用的依然是基于ANTLR4的Parser方案。首先根据拟定好的ShaderLab格式,用正则表达式设定其词法和语法规则,然后通过ANTLR4自动生成基于该规则的文本解析器的基础函数,接下来重载这些基础函数,以访问者模式遍历解析树,填充ShaderLab结构体。
对于ShaderLab中编辑器属性的绑定,根据解析得到的属性排列自动根据内存分布结构计算内存中的偏移量,并进行填充统一打包送到GPU端进行解析,从而得到一个自定义的属性解析结果。
在ShaderLab的功能支持下,系统能够在解析.shader文件时编译并填充多个PSO,指定使用的GPU引擎,同时为编辑器面板提供材质参数,为通过编辑器快速绑定材质数据提供了有力支撑,进而实现材质信息绑定的全流程自动化。
RenderGraph模块,用于基于场景资源信息和shader pass信息生成有向无环图的节点数据,通过有向无环图生成渲染操作信息。
一种可行的实施方式中,整个RenderGraph模块的设计是一个有向无环图,节点分为资源节点和shader pass节点,所有节点数据均以注册的方式写入图中,此外还设计了一个资源节点管理器用于辅助管理每个资源的引用和生命周期,用于更好的内存管理。该模块总体而言分为三个阶段,分别是资源设定、编译以及执行。
在资源设定阶段,会注册所有的GPU资源和shader pass节点,并设定shader pass关于资源的输入输出,设定其相互间的依赖关系;
在编译阶段,通过资源节点管理器记录资源节点和shader pass节点的读写关系,并记录资源节点中的资源的创建和释放时机,同时剔除并没有用到的资源节点和shaderpass节点;
在执行阶段,根据编译好的有向无环图执行着色逻辑,并将无依赖关系的shaderpass并行化,结合现代API的并行录制能够实现一个更为高效的渲染执行流程。
RHI模块,用于基于渲染操作信息调用图形API,生成仿真场景渲染结果。
一种可行的实施方式中,RHI的全称是硬件渲染接口(Render HardwareInterface),用于提供统一的抽象使得调用具体的图形API。以D3D12这一现代图形API为蓝本,结合Vulkan的相关概念对照,针对基础对象抽象出一个RHI层用于跨图形接口,为渲染层提供更简单的设备资源调用。
当前抽象出的概念介绍如下:
1)Device作为虚拟适配器用于对应图形接口资源的创建;
2)CommandBuffer用于录制GPU需要执行的一组命令,该对象从渲染指令池中获取用于并行的指令录制;
3)CommandContext用于记录一个对应引擎的上下文(指现代GPU中的图形引擎、计算引擎和拷贝引擎),由于采用了渲染线程到GPU执行的错帧,上下文中设计了一个指令队列、一个帧资源的环形队列以及一个用于帧同步的障碍点(Fence);
4)Context用于整合整个图形接口层的信息,如设备、交换链、命令缓冲池、指令上下文等,作为整个图形接口层的上下文;
5)Fence用于在命令队列插入障碍点实现同步;
6)PipelineState记录渲染管线信息用于一次渲染;
7)Resource用于GPU资源的存储,本质上是一块内存,被划分为缓冲和纹理两种,对于纹理根据常用的使用方式额外提供普通纹理、渲染目标、深度纹理、带有深度的渲染目标这几种;
8)ResourceView作为描述符从而正确的解释当前分配于GPU的内存资源;
9)DescriptorHeap用于描述符的存储;
10)Shader用于shader文件的解析;
11)SwapChain用于屏幕缓冲的交换从而更好的输出渲染出来的信息。
有了这层抽象,在渲染层就可以通过描述符描述需要创建的资源信息,并为未来扩展API做到真正的跨图形接口预留足够的可扩展性。
该仿真系统的使用流程如图7所示。
本发明实现的仿真系统主要是提供一个引擎层供仿真平台的二次开发,表现形式为一个编辑器,而具体的二次开发任务需要在引擎层的上层而非编辑器上进行实现。
1.控制面板可以创建内置物体如立方体、平面、球体,对于二次开发创建的类(二次开发创建的类需继承Entity类),也可以在此处创建,开始和结束控制场景中物体的运行。
2.场景渲染窗口渲染当前帧的场景,按住鼠标右键 WSAD 移动相机。
3.资源管理器管理 Assets 文件夹中的所有资源,所有资源均可拖拽,可以和细节面板中的对应资源类型绑定,其中材质资源可以直接创建。
4.性能分析器可以看到当前逻辑线程和渲染线程的计算开销,以及当前帧率,当前线程的运行速度可以满足复杂场景的仿真。
5.场景结构表示当前场景中的所有对象,可以通过 Menu 或右键增删对象,双击对象可以进行重命名,查询功能仅支持完全匹配,支持的对象仅为继承自 Entity 的二次开发创建的类型。
6.细节面板为对象信息的反射,允许进行编辑和绑定,鼠标右键可以保存场景或材质。
当被拖拽的资源被拖拽到可被应用的地点时,将会有黄色高亮矩形提示,说明可以释放完成资源绑定,当然类型不匹配的资源会绑定失败。
此外,对于二次开发来说,本发明提供的开发模式十分的便捷。引入对应的头文件即可在设计的组件化的模式上进行二次开发。
本发明实施例中,仿真系统包括系统核心模块、系统逻辑模块和系统渲染模块;系统核心模块用于为系统逻辑模块和系统渲染模块提供系统功能,系统功能至少包括数学计算、提供基础数据结构、内存管理、线程调度及任务分发;系统逻辑模块,用于自动导入数据并加载,执行仿真系统的行为逻辑,并生成场景资源信息;系统渲染模块,用于基于场景资源信息进行渲染。本发明建立了一个引擎层从而为复杂仿真应用开发提供更为强大的工具支持,帮助应用层更快为快速的开发以及充分利用GPU和CPU的资源,提高系统的运行效率,具有及其重要的实际应用需求。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种适用于多图形接口的跨平台的仿真系统,其特征在于,所述仿真系统包括系统核心模块、系统逻辑模块和系统渲染模块;
所述系统核心模块,用于为所述系统逻辑模块和所述系统渲染模块提供系统功能,所述系统功能至少包括数学计算、提供基础数据结构、内存管理、线程调度及任务分发;
所述系统逻辑模块,用于自动导入数据并加载,执行所述仿真系统的行为逻辑,并生成场景资源信息;
所述系统渲染模块,用于基于所述场景资源信息进行渲染;
其中,所述系统核心模块包括内存管理模块、多线程模块和任务系统模块;
所述内存管理模块,用于采用RAII和内存池技术进行内存分配和利用,其中包括:基于自建类对指针进行封装,并完善所述指针的内部逻辑结构,以实现当所述指针指向的数据离开作用域时自动释放所述指针;
所述多线程模块,用于并行执行逻辑线程和渲染线程,所述逻辑线程先于所述渲染线程第一预设数目帧,所述渲染线程先于GPU第二预设数目帧;
所述任务系统模块,用于基于有向无环图进行任务分发;
其中,所述系统逻辑模块包括自动化资源管理模块,所述自动化资源管理模块包括反射模块、序列化模块与资源管理器模块;
所述自动化资源管理模块,用于:
在所述反射模块中,收集静态初始化阶段各个对象的反射信息,将指定的反射信息填充到类型数据中并进行静态管理;在使用阶段通过variant类擦除类型信息以进行数据的保存和传递,并通过policy类进行variant的操作解释;
在所述序列化模块中,在自动序列化的过程中,遍历目标对象的属性,递归解析所述目标对象,获取所述目标对象的属性的键值并写入第一json文本信息,其中,所述目标对象具有所述反射模块标记为可序列化的属性;在自动反序列化的过程中,基于所述反射模块获取第二json文本信息的名称信息,并根据所述名称信息查找数据化的数据信息,递归解析对象数据,以进行数据恢复;
在所述资源管理器模块中,基于所述反射模块和所述序列化模块进行资源管理以及资源间引用的保持;
其中,所述自动化资源管理模块,还用于:
在所述反射模块中:
基于Utopia的方案收集所需反射的对象的源代码信息并进行词法和语法的分析,得到所述所需反射的对象各个属性的源代码子信息;
根据RTTR的反射信息编写规则及所述源代码子信息,生成所述所需反射的对象的反射信息;
其中,所述系统渲染模块包括RenderGraph模块、ShaderLab模块和RHI模块;
所述ShaderLab模块,用于获取渲染管线的状态信息,组织顶点输入信息的布局,及绑定材质信息、物体信息、帧信息的结构,以构建任一ShaderLab方案及对应的shader pass信息;
所述RenderGraph模块,用于基于所述场景资源信息和所述shader pass信息生成有向无环图的节点数据,通过有向无环图生成渲染操作信息;
所述RHI模块,用于基于所述渲染操作信息调用图形API,生成仿真场景渲染结果。
2.根据权利要求1所述的仿真系统,其特征在于,所述内存管理模块,还用于:
初始化内存池,所述内存池包括链表和可用地址数组,所述链表包括至少一个Chunk页表,所述可用地址数组包括多个可用地址;
每当从所述内存池申请第一空间时,从所述可用地址数组的末尾获取可用地址,作为所述第一空间的可用地址;
每当向所述内存池归还第二空间时,将所述第二空间的可用地址添加到所述可用地址数组的末尾;
当所述可用地址数组不存在可用地址时申请新的Chunk页表,并将所述新的Chunk页表对应的多个可用地址添加到所述可用地址数组。
3.根据权利要求1所述的仿真系统,其特征在于,所述多线程模块,用于:
在所述逻辑线程中采集指令帧,将所述指令帧中起始标识与结束标识之间的指令作为渲染指令,提交所述渲染指令;
在所述渲染线程中录制所述渲染指令作为录制指令,提交所述录制指令,其中,通过GPU Fence确定GPU落后帧数,若所述GPU落后帧数大于设定值,则所述渲染线程进入等待状态,直至所述GPU落后帧数达到设定值时恢复执行。
4.根据权利要求1所述的仿真系统,其特征在于,所述任务系统模块,用于:
构建任务节点,并维护所述任务节点与已建立任务节点之间的依赖关系,其中,所述依赖关系包括前驱与后继;
当所述任务节点无前驱任务节点时,根据所述任务节点的优先级,进入高优先级队列或低优先级队列,并排队等待空闲线程,以构建所述任务节点的任务线程;
在所述任务线程执行完毕后,销毁所述任务节点,并通知所述任务节点的后继任务节点。
5.根据权利要求1所述的仿真系统,其特征在于,所述系统核心模块还包括日志模块、数学计算模块和基础数据结构模块;
所述日志模块用于记录系统运行日志信息;
所述数学计算模块用于提供数学计算函数;
所述基础数据结构模块用于提供基础数据结构。
6.根据权利要求1所述的仿真系统,其特征在于,所述系统逻辑模块还包括场景模块;
所述场景模块包括实体和组件,所述实体用于表示场景对象,所述组件用于描述所述实体的功能;
所述反射模块,还用于根据静态期注册的类型对所述场景对象进行编辑。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310240069.0A CN115983047B (zh) | 2023-03-14 | 2023-03-14 | 一种适用于多图形接口的跨平台的仿真系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310240069.0A CN115983047B (zh) | 2023-03-14 | 2023-03-14 | 一种适用于多图形接口的跨平台的仿真系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115983047A CN115983047A (zh) | 2023-04-18 |
CN115983047B true CN115983047B (zh) | 2023-05-26 |
Family
ID=85968323
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310240069.0A Active CN115983047B (zh) | 2023-03-14 | 2023-03-14 | 一种适用于多图形接口的跨平台的仿真系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115983047B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117634369B (zh) * | 2023-12-13 | 2024-09-20 | 摩尔线程智能科技(北京)有限责任公司 | 仿真方法、模型、电子设备、存储介质 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105413176A (zh) * | 2015-11-10 | 2016-03-23 | 内蒙古工业大学 | 一种应用于游戏的3d引擎系统 |
US10430921B1 (en) * | 2019-02-19 | 2019-10-01 | Umajin Inc. | Multi-user application system environment engine |
CN111369656B (zh) * | 2020-03-04 | 2021-08-27 | 杭州群核信息技术有限公司 | 一种基于WebGL可编辑大场景渐进式实时渲染方法 |
CN112001993A (zh) * | 2020-07-14 | 2020-11-27 | 深圳市规划国土房产信息中心(深圳市空间地理信息中心) | 一种面向大场景的多gpu城市仿真系统 |
CN112070871B (zh) * | 2020-09-02 | 2024-01-19 | 山东天兑信息科技有限公司 | 一种跨平台三维可视化引擎构建系统、方法、终端及储存介质 |
CN113515396B (zh) * | 2021-07-09 | 2024-01-30 | 北京字节跳动网络技术有限公司 | 图形渲染方法、装置、电子设备与存储介质 |
-
2023
- 2023-03-14 CN CN202310240069.0A patent/CN115983047B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN115983047A (zh) | 2023-04-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Mey et al. | Score-P: A unified performance measurement system for petascale applications | |
US8694757B2 (en) | Tracing command execution in a parallel processing system | |
Plasmeijer et al. | Task-oriented programming in a pure functional language | |
US20120151495A1 (en) | Sharing data among concurrent tasks | |
BRPI0719730A2 (pt) | Programação e execução orientada por gráfico de produtor. | |
Kafura et al. | ACT++ 2.0: A class library for concurrent programming in C++ using Actors | |
CN115983047B (zh) | 一种适用于多图形接口的跨平台的仿真系统 | |
Rautek et al. | ViSlang: A system for interpreted domain-specific languages for scientific visualization | |
Liu | Simulus: easy breezy simulation in python | |
Wu et al. | Big data programming models | |
Rasch et al. | dOCAL: high-level distributed programming with OpenCL and CUDA | |
Carro et al. | Some paradigms for visualizing parallel execution of logic programs | |
Breitbart | CuPP-a framework for easy CUDA integration | |
CN108647134B (zh) | 一种面向多核架构的任务监测、跟踪及识别方法 | |
Sampson | Process-oriented patterns for concurrent software engineering | |
Mosteo | RxAda: An ada implementation of the reactivex API | |
Lee et al. | Geosheet: A distributed visualization tool for geometric algorithms | |
Fornaia et al. | An ao system for oo-gpu programming | |
Tanwar | Hands-On Parallel Programming with C# 8 and. NET Core 3: Build solid enterprise software using task parallelism and multithreading | |
Aldinucci et al. | Accelerating sequential programs using FastFlow and self-offloading | |
Bispo Vieira et al. | Detecting non-sibling dependencies in openmp task-based applications | |
Frolov et al. | Modern problems of software integration in computer graphics applications and ways to solve them | |
Zhang et al. | SPMP: A JavaScript Support for Shared Persistent Memory on Node. js | |
Smith et al. | Computational audiovisual composition using lua | |
Ramgir | Java: High-Performance Apps with Java 9: Boost your application’s performance with the new features of Java 9 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |