1.本技术涉及分帧计算的计算机技术,尤其涉及一种内存管理方法、装置、设备、计算机程序及存储介质。
背景技术:
2.目前,游戏或视频互动应用等涉及帧计算的交互式渲染应用或服务在进行内存管理时,通常是通过线性内存分配器,在内存块列表中为每一帧的计算程序线性地进行内存分配,在一帧计算结束之后重置内存块列表的分配起点,继续进行下一帧的内存分配。然而,相关技术的内存分配方法在应用于多帧并行计算时,由于一帧计算结束时其他帧可能仍在运行计算中,此时进行分配起点重置并继续分配内存会破坏其他帧的运行内存环境,因此,相关技术的内存分配方法无法支持多帧并行计算,从而降低了程序运行的效率,并且提高了内存管理的不稳定性的风险。
技术实现要素:
3.本技术实施例提供一种内存管理方法、装置、设备、计算机程序及存储介质,能够提高内存管理的稳定性与程序运行的效率。
4.本技术实施例的技术方案是这样实现的:
5.本技术实施例提供一种内存管理方法,包括:
6.根据当前帧的帧计算任务发起的内存请求,从预设的m个帧内存分配器中,确定所述当前帧对应的当前帧内存分配器;所述m个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数;
7.通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块;所述m个内存块列表与所述m个帧内存分配器一一对应;所述m个内存块列表之间的地址空间不重合;
8.从所述目标内存块中获取内存资源,分配至所述帧计算任务。
9.本技术实施例提供一种内存管理装置,包括:
10.分配器确定模块,用于根据当前帧的帧计算任务发起的内存请求,从预设的m个帧内存分配器中,确定所述当前帧对应的当前帧内存分配器;所述m 个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数;
11.内存获取模块,用于通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块;所述m个内存块列表与所述 m个帧内存分配器一一对应;所述m个内存块列表之间的地址空间不重合;
12.内存分配模块,用于从所述目标内存块中获取内存资源,分配至所述帧计算任务。
13.上述装置中,所述m个帧内存分配器中的每个帧内存分配器包括:与至少一种帧状态对应的至少一种子内存分配器;所述内存获取模块,还用于根据所述当前帧的当前帧状态,从所述当前帧内存分配器对应的至少一种子内存分配器中确定出目标子内存分配器;
所述当前帧状态属于所述至少一种帧状态;所述当前帧状态表征所述帧计算任务的业务类型;通过所述目标子内存分配器,从所述预设内存池中获取所述目标内存块。
14.上述装置中,所述至少一种子内存分配器中的每种子内存分配器包含线程数量的子分配器;每个子分配器与所述帧计算任务的每个线程一一对应;所述线程数量为所述帧计算任务包含线程的数量;所述内存分配模块,还用于通过所述目标子内存分配器中的每个子分配器,从所述目标内存块中同步获取所述帧计算任务中每个线程对应的内存资源,并对应分配至所述每个线程,完成对所述帧计算任务的内存分配。
15.上述装置中,所述内存获取模块,还用于通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块之前,通过所述当前帧内存分配器,确定所述当前帧的当前帧状态与所述内存请求所申请的内存生命周期是否匹配;在所述帧状态与所述内存生命周期不匹配的情况下,不执行内存分配,进行错误提示。
16.上述装置中,所述m个内存块列表的地址空间为虚拟地址空间;所述内存获取模块,还用于根据所述内存请求所申请的内存资源量,确定所述当前帧对应的内存块列表中的空闲内存块是否满足所述内存资源量;在不满足的情况下,通过所述预设内存池向电子设备的操作系统申请虚拟内存,根据申请的虚拟内存,在所述当前帧对应的内存块列表中添加空闲内存块;在满足的情况下,将所述空闲内存块作为所述目标内存块;所述内存分配模块,还用于将所述目标内存块中的虚拟地址提交至所述操作系统,以使所述操作系统根据所述虚拟地址,分配物理地址的内存资源至所述帧计算任务。
17.上述装置中,所述内存分配模块,还用于所述从所述目标内存块中获取内存资源,分配至所述帧计算任务之后,在接收到当前帧状态结束指令的情况下,通过所述当前帧内存分配器更新所述当前帧状态,并通知所述目标子内存分配器进行内存分配信息重置;通过所述目标子内存分配器,对所述当前帧对应的内存块列表进行内存分配信息的重置,并对所述帧计算任务对应的已分配虚拟地址进行地址失效处理;在所述当前帧状态表征完成完整一帧计算的情况下,将地址失效处理后的虚拟地址归还至所述预设内存池。
18.本技术实施例提供一种电子设备,包括:
19.存储器,用于存储可执行指令;
20.处理器,用于执行所述存储器中存储的可执行指令时,实现本技术实施例提供的内存管理方法。
21.本技术实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本技术实施例提供的内存管理方法。
22.本技术实施例提供一种计算机程序产品,包括计算机程序或指令,其特征在于,所述计算机程序或指令被处理器执行时,实现本技术实施例提供的内存管理方法。
23.本技术实施例具有以下有益效果:
24.在多帧并行计算场景下,通过以帧为单位的帧内存分配器为每一帧进行内存分配,实现了在当前帧的帧计算任务对上一帧已经失效的内存地址发生错误访问时,操作系统可以及时发现问题,并快速报错与定位,从而提高了内存管理的稳定性。并且,通过独立的帧内存分配器在地址空间不重合的内存块列表中进行内存分配,保证了多帧并行计算场景下,为不同帧分配的内存地址不重合,且为不同帧提供了独立的分配起点,减少了一帧在进行分配起点重置与内存重新分配时对其他帧的运行内存环境的影响,实现了对多帧并行
计算的支持,提高了程序运行的效率。
附图说明
25.图1是目前的相关技术进行线性内存分配的内存管理结构示意图;
26.图2是目前的相关技术进行内存分配的流程示意图;
27.图3a是本技术实施例提供的内存管理帧计算系统架构的一个可选的结构示意图;
28.图3b是本技术实施例提供的帧计算内存管理系统架构的一个可选的结构示意图;
29.图4是本技术实施例提供的电子设备的一个可选的结构示意图;
30.图5是本技术实施例提供的内存管理方法的一个可选的流程示意图;
31.图6是本技术实施例提供的内存管理方法的一个可选的流程示意图;
32.图7是本技术实施例提供的多帧多线程并行帧计算模式的一个可选的过程示意图;
33.图8是本技术实施例提供的内存管理方法的一个可选的流程示意图;
34.图9是本技术实施例提供的内存管理方法的一个可选的流程示意图;
35.图10是本技术实施例提供的电子设备中包含的内存管理装置的一个可选的结构示意图;
36.图11是本技术实施例提供的内存管理方法的一个可选的流程示意图;
37.图12是本技术实施例提供的内存管理方法的一个可选的流程示意图;
38.图13是本技术实施例提供的电子设备中包含的内存管理装置的一个可选的结构示意图;
39.图14是本技术实施例提供的内存管理方法应用于实际游戏场景的一个可选的流程示意图;
40.图15是本技术实施例提供的内存管理方法应用于实际游戏场景的一个可选的流程示意图。
具体实施方式
41.为了使本技术的目的、技术方案和优点更加清楚,下面将结合附图对本技术作进一步地详细描述,所描述的实施例不应视为对本技术的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本技术保护的范围。
42.在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
43.在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本技术实施例能够以除了在这里图示或描述的以外的顺序实施。
44.本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括a、
b、c中的至少一种,可以表示包括从a、b和c构成的集合中选择的任意一个或多个元素。
45.除非另有定义,本文所使用的所有的技术和科学术语与属于本技术的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本技术实施例的目的,不是旨在限制本技术。
46.对本技术实施例进行进一步详细说明之前,对本技术实施例中涉及的名词和术语进行说明,本技术实施例中涉及的名词和术语适用于如下的解释。
47.1)帧:游戏运行时一次页面刷新的一幅影像画面。
48.2)游戏帧(game):一帧中处理玩家交互、计算游戏逻辑的部分。
49.3)渲染帧(render):一帧中将游戏物体渲染到屏幕上的部分。
50.4)帧状态:标记帧处于何种计算状态中,即游戏帧或渲染帧中。
51.5)内存分配器:分配并管理从操作系统中申请的内存的设施。
52.6)帧内存分配器:每帧分配内存,并在帧结束时统一回收,下一帧重新分配的内存分配器。
53.7)增强现实(augmented reality,ar),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,是一种将真实世界信息和虚拟世界信息“无缝”集成的新技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。
54.8)虚拟现实技术(virtual reality,vr)涵盖计算机、电子信息、仿真技术,其基本实现方式是计算机模拟虚拟环境从而给人以环境沉浸感。虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统,它利用现实生活中的数据,通过计算机技术产生的电子信号,将其与各种输出设备结合使其转化为模拟环境,使用户沉浸到该环境中。模拟环境中可以包括真实物体的影像,也可以包括通过三维模型表现出来的虚拟对象。
55.9)元宇宙(metaverse)是整合多种新技术而产生的新型虚实相融的互联网应用和社会形态,它基于扩展现实技术提供沉浸式体验,基于数字孪生技术生成现实世界的镜像,基于区块链技术搭建经济体系,将虚拟世界与现实世界在经济系统、社交系统、身份系统上密切融合,并且允许每个用户进行内容生产和世界编辑。
56.10)云游戏(cloud gaming)又可称为游戏点播(gaming on demand),是一种以云计算技术为基础的在线游戏技术。云游戏技术使图形处理与数据运算能力相对有限的轻端设备(thin client)能运行高品质游戏。在云游戏场景下,游戏并不在玩家游戏终端,而是在云端服务器中运行,并由云端服务器将游戏场景渲染为视频音频流,通过网络传输给玩家游戏终端。玩家游戏终端无需拥有强大的图形运算与数据处理能力,仅需拥有基本的流媒体播放能力与获取玩家输入指令并发送给云端服务器的能力即可。
57.目前,相关技术的帧内存分配器的分配系统结构如图1所示,分配器管理一个内存块列表,线性分配给申请对象。分配器在内存分配后,将分配指针向后偏移相应的内存大小,当内存块列表容量不足时,向操作系统动态申请新的内存块。在一帧计算结束时,分配器将分配指针重置到列表头内存块的起点,下一帧继续分配。相关技术的分配流程如图2所示。
58.图2中,内存分配器在接收到用于计算当前帧的内存分配申请时,根据分配指针当前所在的位置确定分配起点,检查分配起点所在内存块的剩余内存是否满足申请的内存大小。在剩余内存满足申请的内存大小的情况下,在分配起点地址处分配内存,并向后偏移分
配起点;在剩余内存不满足申请的内存大小的情况下,检查分配起点所在内存块后是否链有内存块,若是,进行内存分配,并则将分配起点偏移到下一块内存块起点;否则,向操作系统申请内存块链接到分配起点所在内存块的尾部,再进行内存分配与分配起点偏移。在接收到帧结束指令的情况下,释放当前分配的内存资源,将分配起点重置为内存块链表头起点。
59.可以看出,相关技术由分配器管理全局唯一的内存块列表,所有线程共享内存,每次分配操作都需要加锁,降低了多线程运行效率,进而降低了帧计算的效率。并且,由分配器管理全局唯一的分配起点,一帧结束时重置分配起点。而在多帧并行计算时,一帧结束时可能有其它帧仍在运行计算中,分配起点重置并继续分配内存会破坏其它帧的运行内存环境。因此,相关技术的方案无法支持多帧并行计算,需要等待一帧完整计算结束后方能计算下一帧,不能充分利用现代处理器的并行计算能力,从而降低了帧计算的效率。进一步的,相关技术中,上一帧分配的内存地址在下一帧仍然有效,如果下一帧错误访问上一帧申请的内存,尽管内存中内容可能无效,但不会出现访问冲突的系统错误,难以发现开发错误,从而降低了程序稳定性。
60.本技术实施例提供一种内存管理方法、装置、设备、计算机程序及存储介质,能够提高帧计算的效率与程序稳定性。下面说明本技术实施例提供的电子设备的示例性应用,本技术实施例提供的电子设备可以实施为智能手机、智能手表、笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)、智能语音交互设备、智能家电和车载终端等各种类型的终端或用户终端,也可以实施为服务器。下面,将说明电子设备实施为服务器时示例性应用。
61.参见图3a,图3a是本技术实施例提供的帧计算系统100的一个可选的架构示意图,终端400通过网络300连接服务器200,网络300可以是广域网或者局域网,又或者是二者的组合。
62.终端400上运行有涉及帧计算的应用410,如游戏应用、视频交互类应用等,以游戏应用为例,终端400在游戏应用410的运行过程中,通过游戏引擎进行游戏画面刷新时,可以根据当前帧的帧数据,如用户操作数据以及游戏画面渲染数据生成帧计算任务,并将帧计算任务提交至服务器200,利用服务器2 00的计算资源执行帧计算。
63.服务器200用于根据当前帧对应的帧计算任务,从预设的m个帧内存分配器中,确定当前帧对应的当前帧内存分配器;m个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数;通过当前帧内存分配器,从预设内存池的m个内存块列表中,获取当前帧对应的目标内存块;m个内存块列表与m个帧内存分配器一一对应;m个内存块列表之间的地址空间不重合;从目标内存块中获取内存资源分配至帧计算任务。
64.服务器200,还用于利用内存资源,执行帧计算任务,得到帧计算结果。将帧计算结果通过网络300发送至终端400,在终端400的应用410的界面上进行显示。在一些实施例中,帧计算结果可以是根据用户操作数据生成的游戏画面响应,并在终端400的游戏应用410中进行相应的帧画面显示刷新。
65.在一些实施例中,在电子设备实施为服务器时,可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统。在一些实施例中,本技术实施例可以借助ar、vr等技术实现,终端400上运行的应用410可以是ar或vr的应用或客户端;在一些
实施例中,本技术实施例可以借助云技术来实现;终端400上运行的应用410可以是基于云技术的云游戏应用;相应地,服务器200还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、cdn、以及大数据和人工智能平台等基础云计算服务的云服务器。在电子设备实施为终端时,可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表、智能语音交互设备、智能家电、智慧交通和车载终端等,但并不局限于此。
66.本技术实施例还可以通过区块链技术来实现,参见图3b,图3b是本技术实施例提供的帧计算系统100的架构示意图。图3b中,帧计算服务器可以是游戏应用对应的后台服务器,可以通过多个帧计算服务器(图3b中示例性示出帧计算服务器601和602)对终端400上的游戏应用提交的帧数据进行计算。
67.在一些实施例中,帧计算服务器和终端可以加入区块链网络500而成为其中的一个节点。区块链网络500的类型是灵活多样的,例如可以为公有链、私有链或联盟链中的任意一种。示例性地,帧计算服务器601映射为区块链网络 500中的共识节点500-1,帧计算服务器602映射为共识节点500-2。帧计算服务器601和帧计算服务器602可以通过执行智能合约的方式对终端400发送的帧数据进行帧计算,并分别将帧计算结果发送至区块链网络500中进行共识。当共识通过时,将帧计算结果发送至终端400,以使终端400上的游戏应用41 0根据帧计算结果进行游戏画面的刷新。可见,通过区块链网络中的多个节点对帧计算结果进行共识确认,通过共识机制避免了受到个别服务器错误计算的影响,进一步提高了帧计算的准确性。
68.参见图4,图4是本技术实施例提供的服务器200的结构示意图,图4所示的服务器200包括:至少一个处理器210、存储器250、至少一个网络接口2 20和用户接口230。服务器200中的各个组件通过总线系统240耦合在一起。可理解,总线系统240用于实现这些组件之间的连接通信。总线系统240除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图4中将各种总线都标为总线系统240。
69.处理器210可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(dsp,digital signal processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
70.用户接口230包括使得能够呈现媒体内容的一个或多个输出装置231,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口230还包括一个或多个输入装置232,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
71.存储器250可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器250可选地包括在物理位置上远离处理器210的一个或多个存储设备。
72.存储器250包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(rom,read only me mory),易失性存储器可以是随机存取存储器(ram,random access memor y)。本技术实施例描述的存储器250旨在包括任意适合类型的存储器。
73.在一些实施例中,存储器250能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
74.操作系统251,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
75.网络通信模块252,用于经由一个或多个(有线或无线)网络接口220到达其他计算设备,示例性的网络接口220包括:蓝牙、无线相容性认证(wi-fi)、和通用串行总线(usb,universal serial bus)等;
76.呈现模块253,用于经由一个或多个与用户接口230相关联的输出装置23 1(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
77.输入处理模块254,用于对一个或多个来自一个或多个输入装置232之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
78.在一些实施例中,本技术实施例提供的内存管理装置可以采用软件方式实现,图4示出了存储在存储器250中的内存管理装置255,其可以是程序和插件等形式的软件,包括以下软件模块:分配器确定模块2551、内存获取模块2 552和内存分配模块2553,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。
79.将在下文中说明各个模块的功能。
80.在另一些实施例中,本技术实施例提供的装置可以采用硬件方式实现,作为示例,本技术实施例提供的装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本技术实施例提供的内存管理方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(asic,application specif ic integrated circuit)、dsp、可编程逻辑器件(pld,programmable logic de vice)、复杂可编程逻辑器件(cpld,complex programmable logic device)、现场可编程门阵列(fpga,field-programmable gate array)或其他电子元件。
81.在一些实施例中,终端或服务器可以通过运行计算机程序来实现本技术实施例提供的内存管理方法。举例来说,计算机程序可以是操作系统中的原生程序或软件模块;可以是本地(native)应用程序(app,application),即需要在操作系统中安装才能运行的程序,如社交应用app或者消息分享app;也可以是小程序,即只需要下载到浏览器环境中就可以运行的程序;还可以是能够嵌入至任意app中的小程序或者网页客户端程序。总而言之,上述计算机程序可以是任意形式的应用程序、模块或插件。
82.将结合本技术实施例提供的电子设备的示例性应用和实施,说明本技术实施例提供的内存管理方法。
83.参见图5,图5是本技术实施例提供的内存管理方法的一个可选的流程示意图,将结合图5示出的步骤进行说明。
84.s101、根据当前帧对应的帧计算任务,从预设的m个帧内存分配器中,确定当前帧对应的当前帧内存分配器;m个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数。
85.本技术实施例提供的内存管理方法可以应用于为涉及帧计算的应用程序或服务提供内存分配的场景,示例性地,为游戏类应用、vr应用、ar应用,或者视频制作类、视频互
动类、视频编辑类等应用,或者元宇宙应用场景下的产品或服务提供帧计算的内存分配管理的场景,具体的根据实际情况进行选择,本技术实施例不作限定。
86.本技术实施例中,电子设备上运行有涉及帧计算的应用程序或服务,在上述应用或服务执行帧计算时,示例性地,游戏在运行过程中进行页面刷新时,需要根据当前帧对应的帧计算任务,向电子设备申请相应的内存资源来进行帧计算。
87.本技术实施例中,帧计算任务可以是计算当前帧的完整一帧数据所对应的计算任务,也可以将当前帧的计算过程划分为多个帧计算任务来执行,如通过不同计算业务的帧计算任务完成对当前帧的计算。示例性地,对于游戏场景,可以将完整一帧的帧计算划分为计算一帧中的交互逻辑部分,以及计算一帧中的图像渲染部分,并分别通过执行对应的帧计算任务来完成对完整一帧的计算。具体的根据实际情况进行选择,本技术实施例不作限定。
88.本技术实施例中,电子设备上预先部署有预设的m个内存分配器。其中, m个帧内存分配器为以帧为单位,每个内存分配器对应为一帧的帧计算提供内存分配。这样,在多帧并行计算的情况下,由于为不同帧提供了独立的内存分配器,在下一帧的帧计算任务错误地访问上一帧已经失效的内存时,可以及时发现并进行问题定位,从而解决了帧间地址重复带来的内存错误访问难以查错的问题。在实际开发中,对往帧内存的错误访问往往在下一帧就会发生,访问 m帧前的失效内存概率极低,本技术实施例通过以帧为单位的m个帧内存分配器,能够实现对地址错误访问的快速定位,使得在开发过程中能及时发现帧内存访问错误,避免游戏测试或上线时难以纠察的错误,提高了开发效率和质量,从而提高了内存管理的稳定性。
89.由于内存地址空间有限,本技术实施例将m个帧内存分配器循环使用,从而保证了m帧间的内存地址分配不重复。
90.本技术实施例中,m为大于或等于2的正整数。在一些实施例中,m可以取值为6,也可以取值为其他值,具体的根据实际情况进行选择,本技术实施例不作限定。
91.s102、通过当前帧内存分配器,从预设内存池的m个内存块列表中,获取当前帧对应的目标内存块;m个内存块列表与m个帧内存分配器一一对应;m 个内存块列表之间的地址空间不重合。
92.本技术实施例中,电子设备上部署有预设内存池,预设内存池中的内存资源以m个内存块列表的形式维护,其中,m个内存块列表与m个内存分配器一一对应,且每个内存块列表所包含的内存地址空间与其他内存块列表中的地址空间均不重合。
93.本技术实施例中,对于当前帧的内存请求,电子设备通过当前帧对应的帧内存分配器,在预设内存池中,确定与当前帧内存分配器对应的独立地址空间的内存块列表,作为当前帧对应的内存块列表。进而,从当前帧对应的内存块列表中,获取可分配的内存块资源,作为当前帧对应的目标内存块。
94.可以看出,通过与每个帧内存分配器对应的、独立地址空间的内存块列表,可以有效分隔不同的帧内存分配器对应的内存地址空间,防止内存地址重复分配,并且,通过独立的帧内存分配器在独立地址空间的内存块列表中进行内存分配,为多帧并行计算时的每一帧提供了独立的分配起点,避免了一帧结束时的分配起点重置与内存重新分配对其他帧的运行内存环境的影响,实现了对多帧并行计算的支持。
95.s103、从目标内存块中获取内存资源分配至帧计算任务。
96.本技术实施例中,电子设备根据当前帧的帧计算任务所申请的内存资源的大小,从目标内存块中获取相应大小的内存资源分配至帧计算任务,从而完成对当前帧的内存分配。
97.本技术实施例中,电子设备可以以与当前帧的内存分配同样的执行过程,实现对应用中每一帧的帧计算任务的内存分配。此处不再赘述。
98.可以理解的是,在多帧并行计算场景下,通过以帧为单位的帧内存分配器为每一帧进行内存分配,实现了在当前帧的帧计算任务对上一帧已经失效的内存地址发生错误访问时,操作系统可以及时发现问题,并快速报错与定位,从而提高了内存管理的稳定性。并且,通过独立的帧内存分配器在独立地址空间的内存块列表中进行内存分配,保证了多帧并行计算场景下,为不同帧分配的内存地址不重合,且为不同帧提供了独立的分配起点,减少了一帧在进行分配起点重置与内存重新分配时对其他帧的运行内存环境的影响,实现了对多帧并行计算的支持,提高了程序运行的效率。
99.在一些实施例中,基于图5,如图6所示,s102之前,还可以执行s001-s 002,将结合各步骤进行说明。
100.s001、通过当前帧内存分配器,确定当前帧的当前帧状态与内存请求所申请的内存生命周期是否匹配。
101.本技术实施例中,当前帧状态表征帧计算任务的业务类型。电子设备在执行帧计算时,可以根据帧计算的不同阶段所对应的业务类型,定义一帧在不同计算阶段的帧状态。
102.在一些实施例中,以游戏场景为例,游戏应用运行过程中,在进行每帧游戏画面的刷新时,帧计算任务通常涉及:根据用户在游戏界面上的操作计算游戏逻辑响应,以及对响应结果对应的画面进行渲染两种帧计算的业务类型。这样,可以将帧计算任务中处理玩家交互、计算游戏逻辑的部分所对应的帧状态定义为游戏(game)帧;将游戏物体渲染到屏幕上的部分所对应的帧状态定义为渲染(render)帧。当然,也可以根据其他划分方式对帧计算业务进行划分,具体的根据实际情况进行选择,本技术实施例不作限定。
103.本技术实施例中,电子设备可以根据帧状态,预先定义每种帧状态对应的内存的生命周期的类型。示例性地,对于上述将完整一帧的游戏交互帧划分为的游戏帧与渲染帧的情况,完整一帧的游戏交互帧的内存生命周期可以包括:游戏帧对应的内存生命周期、渲染帧对应的内存生命周期,以及游戏交互帧也即全帧对应的内存生命周期。相应地,对于以其他方式定义的帧状态,也可以以类似的方法定义对应的内存生命周期,具体的根据实际情况进行选择,本技术实施例不作限定。
104.本技术实施例中,电子设备可以通过解析当前帧的内存请求,获取到当前帧的帧状态以及所要申请的内存生命周期。电子设备通过当前帧对应的帧内存分配器,确定当前帧的帧状态与内存生命周期是否匹配。
105.示例性地,帧计算任务执行帧计算的时序可以如图7所示,第1帧游戏交互帧的帧计算任务在t0时刻执行帧状态为游戏帧的帧计算,在t1时刻执行中帧状态为渲染帧的帧计算,并行地,第2帧帧计算任务在t1时刻执行帧状态为游戏帧的帧计算,在t2时刻执行帧状态为渲染帧的帧计算。在则在t0时刻申请的游戏帧的内存生命周期在t1时刻失效,t2时刻访问它是非法行为,确定为帧状态与内存生命周期不匹配。同样地,在t1时刻申请的第1帧
渲染帧的内存生命周期在t2时刻失效,t3时刻访问它是非法行为,确定为帧状态与内存生命周期不匹配。在t0时刻申请的第1帧全帧的内存生命周期在t2时刻失效,t3时刻访问它是非法行为,确定为帧状态与内存生命周期不匹配。
106.s002、在帧状态与内存生命周期不匹配的情况下,不执行内存分配,进行错误提示。
107.本技术实施例中,在帧状态与内存生命周期不匹配的情况下,说明该内存请求非法地申请了与其帧状态不匹配的内存占用周期,电子设备不执行内存分配,进行报错提示。
108.需要说明的是,本技术实施例中,在当前帧的帧状态与内存生命周期相匹配的情况下,电子设备可以执行s102中的方法,根据当前帧内存分配器,从m 个内存块列表中,获取当前帧对应的目标内存块。
109.可以理解的是,通过对生命周期的细分,可以更早地回收帧计算任务占用的内存资源,减小不必要的内存占用,使得内存分配更加合理,从而提高了内存利用效率,减少了程序的内存资源占用。
110.在一些实施例中,m个帧内存分配器中的每个帧内存分配器包括:与至少一种帧状态对应的至少一种子内存分配器。基于图5,如图8所示,s102可以通过执行s1021-s1022来实现,将结合各步骤进行说明。
111.s1021、根据当前帧的当前帧状态,从当前帧内存分配器对应的至少一种子内存分配器中确定出目标子内存分配器;当前帧状态属于至少一种帧状态;当前帧状态表征帧计算任务的业务类型。
112.本技术实施例中,基于上述划分的帧状态,可以在每个帧内存分配器中,为至少一种帧状态中的每种帧状态设置独立的子内存分配器,来实施内存的分配。这样,电子设备可以根据当前帧的当前帧状态,从当前帧内存分配器对应的至少一种子内存分配器中,确定当前帧状态对应的子内存分配器,作为目标子内存分配器。
113.示例性地,至少一种帧状态可以包括上述的游戏帧、渲染帧与全帧,则至少一种子内存分配器可以包括:游戏帧子内存分配器、渲染帧子内存分配器以及全帧子内存分配器。在当前帧状态为游戏帧的情况下,电子设备确定当前帧内存分配器中的游戏帧子内存分配器为目标子内存分配器,其他同理。
114.s1022、通过目标子内存分配器,从预设内存池中获取目标内存块。
115.本技术实施例中,电子设备通过当前帧内存分配器中的目标子内存分配器,从当前帧内存分配器对应的内存块列表中,获取可分配的内存块资源,作为目标内存块。
116.在一些实施例中,基于上述根据帧状态对帧计算任务的划分,电子设备可以在多帧多线程的并行模式来实现帧计算。以游戏场景的帧状态包括游戏帧、渲染帧与全帧为例,参考图7,电子设备可以通过并行运行的独立的线程,即图7中示出的game主线程与render主线程,分别执行对游戏(game)帧与渲染(render)帧的计算。在同一时刻,电子设备上可以通过两个并行的线程,执行对第i帧渲染帧与第i+1帧的游戏帧的帧计算。示例性地,同在t1时刻,在game主线程中执行对第2帧游戏帧的帧计算,同时,在并行的render主线程中执行对第1帧渲染帧的帧计算。这样可以增加处理器的利用率,提升游戏运行的效率。
117.需要说明的是,图7中示出的game主线程与render主线程是一种示例性的帧计算中线程划分的情况,实际应用中可以根据不同需求来进行线程的划分,具体的根据实际情
况进行选择,本技术实施例不作限定。
118.在一些实施例中,对应于多线程的并行模式,上述的每种内存子分配器可以包含线程数量的子分配器,其中,线程数量为帧计算任务包含线程的数量,示例性地,线程数量可以是电子设备支持的最大线程数,也可以是帧计算任务中当前所使用线程数量,或者根据实际情况进行设置。并且,线程数量的子分配器中,每个子分配器与帧计算任务的每个线程一一对应。基于图8,如图9 所示,图8中的s1022可以通过执行s201来实现,如下:
119.s201、通过目标子内存分配器中的每个子分配器,从目标内存块中同步获取帧计算任务中每个线程对应的内存资源,并对应分配至每个线程,完成对帧计算任务的内存分配。
120.本技术实施例中,由于每种子内存分配器对应于每种帧内存分配器,且每种子内存分配器对应于一种帧状态,也即一种内存生命周期,每种子内存分配器中包含的线程数量的子分配器与帧计算任务包含的线程一一对应,可理解,每种子内存分配器中的每个子分配器都是帧独立、生命周期独立、以及线程独立的内存分配器。对于当前帧,电子设备通过目标子内存分配器中的每个子分配器,从目标内存块中同步获取当前帧的帧计算任务中每个线程对应的内存资源,并通过每个线程对应的子分配器,将对应的内存资源分配至每个线程,从而完成对帧计算任务的内存分配。
121.本技术实施例中,每个内存块列表中的每个内存块为固定大小的内存块,电子设备可以通过目标子内存分配器,从当前帧对应的内存块列表中获取固定大小的目标内存块,进而通过线程数量的子分配器,根据各个线程所需的不同内存资源数量,在目标内存块中为帧计算任务中的各个线程进行内存的分配。
122.在一些实施例中,子分配器可以是线性内存分配器,也可以是其他类型的内存分配器,具体的根据实际情况进行选择,本技术实施例不作限定。
123.可以理解的是,由于子分配器是帧独立、生命周期独立、以及线程独立的内存分配器,通过线程数量的子分配器进行内存分配可以进行线程独立的内存分配,以实现高效无锁的线程安全,从而提高了程序运行的效率。
124.在一些实施例中,如图10所示,m个帧内存分配器可以是循环使用的6 个帧内存分配器(示例性示出了帧内存分配器f0-f5)。其中,6个帧内存分配器用于为每一帧帧计算进行内存分配,以保证6帧间分配的内存地址不重复。每个帧内存分配器持有其独立id,如f0-f5,并记录对应帧的帧状态。预设内存池中包含与帧内存分配器f0-f5对应的6个内存块列表。图10中,6个帧内存分配器共享一个静态的线程独立的子内存分配器矩阵,子内存分配器矩阵中对应于每个帧内存分配器,都对应有每种生命周期对应的子内存分配器,每种子内存分配器中包含线程数量的子分配器。图10中示出了包含游戏(game) 帧子内存分配器、渲染(render)帧子内存分配器和全帧子内存分配器的子内存分配器矩阵。在为当前帧的帧计算任务分配内存时,电子设备确定当前帧对应的当前帧内存分配器的id,进而根据当前帧内存分配器的id(如f2)和帧计算任务申请的内存生命周期,从子内存分配器矩阵获取对应的目标子内存分配器(如game子内存分配器),进而根据目标子内存分配器中线程数量的子分配器访问预设内存池,在当前帧内存分配器对应的内存块列表中获取内存块资源进行内存分配。
125.在一些实施例中,作为帧内存分配器实现线程安全分配的内部机制,实际的内存
分配由帧内存分配器内部对应于各个线程的子分配器执行,以保证各线程之间的内存分配无冲突。帧计算任务在申请内存时只需向当前帧对应的帧内存分配器发起申请,而不需要知道帧内存分配器中的线程安全实现细节。
126.可以看出,图10所示的内存分配装置在应用于多帧多线程的并行帧计算模式时,由于每个帧内存分配器对应的内存地址空间不重合,从而使得帧内存分配器对m帧之内的所分配的地址不可能重复。以图7中的帧计算模式为例,图 7中的第1帧游戏帧计算结束之后,第2帧游戏帧才会运行,此时第1帧游戏帧对应的帧内存分配器在计算结束后已经进行了内存分配信息重置,并对第1 帧游戏帧对应的地址空间做了失效处理,一旦在第2帧错误地使用了第1帧分配的地址,操作系统会立即抛出异常。渲染帧同理。
127.可以理解的是,通过本技术实施例的方法,可以保证在多帧多线程并行计算场景下内存地址分配不冲突,从而可以充分利用多线程的算力资源,并可以及时发现内存访问错误,从而提高了内存管理的稳定性和程序运行的效率。
128.在一些实施例中,预设内存池中各内存块列表的地址空间为虚拟地址空间,也即各个内存块列表维护和管理的内存地址为虚拟地址。基于图5或图8,s10 2以及s1022中的从预设内存池中获取目标内存块可以如图11所示,通过执行 s301-s303来实现,将结合各步骤进行说明。
129.s301、根据内存请求所申请的内存资源量,确定当前帧对应的内存块列表中的空闲内存块是否满足内存资源量。
130.本技术实施例中,电子设备从预设内存池中获取目标内存块之前,需要先确定当前帧内存管理器对应的内存块列表,也即当前帧对应的内存块列表中,空闲内存块是否满足当前帧的帧计算任务所申请的内存资源量。
131.s302、在不满足的情况下,通过预设内存池向电子设备的操作系统申请虚拟内存,根据申请的虚拟内存,在当前帧对应的内存块列表中添加空闲内存块。
132.本技术实施例中,在当前帧对应的内存块列表中的空闲内存块不能满足当前帧所申请的内存块资源数量的情况下,电子设备通过预设内存池,向操作系统申请在当前帧对应的内存块列表中增加新的虚拟地址空间,根据操作系统新分配的虚拟地址空间,在当前帧对应的内存块列表中添加对应的空闲内存块。
133.需要说明的是,由于每个内存块列表中的内存块为固定大小,电子设备在申请新增内存块时,其申请的也是固定大小的新增内存块。
134.s303、在满足的情况下,将空闲内存块作为目标内存块。
135.本技术实施例中,在当前帧对应的内存块列表中的空闲内存块可以满足当前帧所申请的内存资源量的情况下,电子设备直接将空闲内存块作为目标内存块,进而可以利用空闲内存块中的虚拟地址,对内存资源量所对应的内存资源进行分配。
136.在一些实施例中,基于s301-s303,如图11所示,s103可以通过执行s30 4来实现,如下:
137.s304、将目标内存块中的虚拟地址提交至操作系统,以使操作系统根据虚拟地址,分配物理地址的内存资源至帧计算任务。
138.本技术实施例中,电子设备可以通过子分配器,将目标内存块中各个线程所需的内存资源的虚拟地址提交至电子设备的操作系统。电子设备的操作系统即可根据虚拟地
址,对应分配物理地址的内存资源至各个线程,从而完成对整个帧计算任务的的内存分配。
139.可以理解的是,由于内存分配是虚拟地址空间,因此不同帧之间可以共用实际的物理内存。通过预设内存池管理虚拟内存地址,可以在虚拟内存地址被分配后,只占用分配后实际使用的内存空间,大幅减小分配器的内存浪费,同时可以通过系统方法调用使内存地址立即失效,从而提高了内存分配的效率和稳定性。
140.在一些实施例中,基于图5或图8,如图12所示,s103之后,也即电子设备完成内存分配之后,还可以通过执行s104-s106,实现帧计算任务结束之后的内存资源回收过程,将结合图12示出的步骤进行说明。
141.s104、在接收到当前帧状态结束指令的情况下,通过当前帧内存分配器更新当前帧状态,并通知目标子内存分配器进行内存分配信息重置。
142.本技术实施例中,由于当前帧状态表征了帧计算任务的业务类型,并且在内存分配阶段,电子设备是根据当前帧的当前帧状态,为当前帧的帧计算任务进行内存分配的;在帧计算任务计算完成的情况下,触发当前帧状态结束指令,表征对当前帧状态,如渲染帧、游戏帧对应的帧数据已计算完成。电子设备在接收到当前帧状态结束指令的情况下,启动对当前帧状态对应的已分配内存资源的回收过程。
143.本技术实施例中,在接收到当前帧状态结束指令的情况下,电子设备可以通过当前帧内存分配器,将当前帧状态更新为结束状态。这里,结束状态表征当前帧状态对应的计算业务执行结束。示例性地,在当前帧状态为游戏帧时,在当前帧状态更新为游戏帧结束状态,在当前帧状态为渲染帧时,将当前帧状态更新为渲染帧结束状态。
144.本技术实施例中,电子设备通过当前帧内存分配器,通知目标子内存分配器中线程数量的子分配器进行内存分配信息重置。这里,目标子内存分配器也即内存分配过程中,为当前帧状态对应的帧计算任务分配内存的子内存分配器。电子设备可以记录内存分配过程中所调用的目标子内存分配器,以在帧状态计算结束时通知相应的目标子内存分配器执行内存回收过程。
145.在一些实施例中,基于图10,如图13所示,m个帧内存分配器中的每个帧内存分配器实例维护两个子分配器列表。其中,game子分配器列表记录了为游戏帧(game stage)的帧计算任务分配内存的目标子内存分配器,在游戏帧计算结束后,电子设备可以通知game子分配器列表中的目标子内存分配器进行内存分配信息的重置。render子分配器列表记录了为渲染帧(render stag e)和全帧的帧计算任务分配内存的目标子内存分配器,在渲染帧结束也即全帧结束时,电子设备通知render子分配器列表的目标子内存分配器进行内存分配信息的重置。
146.这里,需要说明的是,由于全帧对应内存生命周期和渲染帧对应的内存生命周期是同时失效的,因此,电子设备可以通过由render子分配器列表负责全帧与渲染帧对应的两种内存生命周期的子分配器的内存失效管理。
147.s105、通过目标子内存分配器,对当前帧对应的内存块列表进行内存分配信息的重置,并对帧计算任务对应的已分配虚拟地址进行地址失效处理。
148.本技术实施例中,电子设备可以在当前帧对应的内存块列表中对内存分配信息进行重置。这里,内存分配信息可以包括但不限于已分配内存大小、分配起点等分配信息,具体的根据实际情况进行选择,本技术实施例不作限定。
149.本技术实施例中,由于当前帧的帧计算任务对应的已分配内存资源为虚拟内存地址,电子设备可以通过目标子内存分配器,对当前帧的帧计算任务对应的已分配虚拟地址进行失效处理,但保留地址空间。这样既避免了内存浪费,又避免其他帧对已失效地址的错误访问。
150.在一些实施例中,在windows操作系统上,电子设备可以使用mem_de commit参数调用virtaulfree方法,使虚拟内存地址失效但保留地址空间;在 linux/macos/android/ios操作系统上,电子设备可以调用mprotect方法使得保护地址页为不可访问模式,并使用madv_dontneed调用madvise方法告知操作系统该段虚拟内存不再使用,使虚拟内存地址失效但保留地址空间。具体失效处理的方法可以根据实际情况进行选择,本技术实施例不作限定。
151.s106、在当前帧状态表征完成完整一帧计算的情况下,将地址失效处理后的虚拟地址归还至预设内存池。
152.本技术实施例中,在当前帧内存分配器对当前帧状态进行更新之后,在当前帧状态表征完成完整一帧计算的情况下,示例性地,在当前帧状态为渲染帧结束或全帧结束,说明图7中一帧游戏交互帧的游戏帧和渲染帧都完成帧计算的情况下,也即当前帧计算已经完全结束,可以归还相应的内存资源了。电子设备通过目标子内存分配器,将地址失效处理后的虚拟地址归还至预设内存池,从而完成内存回收工作。
153.需要说明的是,在帧状态表征还未完成完整一帧计算的情况下,电子设备不会将地址失效处理后的内存资源立即归还至预设内存池。以上一帧状态为第 1帧的游戏帧为例,在第1帧的游戏帧计算结束后,冻结的内存不会立即归还给全局内存池,否则会被第1帧的渲染帧使用,从而无法发现渲染帧使用已过生命周期的游戏帧虚拟地址的错误。因此,本技术实施例中,在帧状态表征已完成完整一帧计算时,子内存分配器再归还当前帧占用的虚拟地址。
154.可以理解的是,本技术实施例中,在进行内存回收时,电子设备可以仅对生命周期小于一帧的帧计算,如游戏帧的帧计算所对应的虚拟内存地址作失效处理,这样即避免了内存浪费,又避免了内存的错误访问,从而提高了内存管理的稳定性。
155.下面,基于图13所示的内存管理装置,以交互式渲染游戏场景中,分帧计算的内存分配过程为例,将结合图14与图15,将说明本技术实施例在一个实际的应用场景中的示例性应用。
156.在一些实施例中,基于图14,本技术实施例提供一种游戏场景下帧计算的内存分配的方法,如下:
157.s401、帧计算任务获取当前帧数据。
158.s401中的帧计算任务为游戏应用中,刷新一帧对应的帧数据计算任务,帧计算任务向电子设备上的帧管理器请求获取所要计算的当前帧的帧数据,以启动对当前帧的帧计算。
159.s402、帧计算任务获取当前帧对应的帧内存分配器。
160.s402中,帧计算任务可以根据当前帧的序号,在m个帧内存分配器中,确定当前帧对应的帧内存分配器,以用来为当前帧执行内存分配。
161.s403、帧计算任务向帧内存分配器申请内存。
162.s403中,电子设备上帧内存分配器可以接受到帧计算任务发起的内存请求。内存请求中可以包含当前帧的帧状态,以及帧计算任务所要申请的内存生命周期。
163.s404、帧内存分配器检查内存生命周期是否符合帧状态。
164.s404中,帧内存分配器确认当前帧的帧状态,如游戏帧、渲染帧或全帧,与当前帧对应的内存生命周期是否符合。若符合,执行s405;否则,执行s41 2。
165.s405、帧内存分配器根据id和内存生命周期,获取子内存分配器。
166.s405中,若帧计算任务请求的内存生命周期合理,即在游戏帧时请求生命周期为game或全帧的内存,在渲染帧时请求生命周期为render或全帧的内存 (此时全帧生命周期与render生命周期等效),帧内存分配器根据自身的id和所请求的内存生命周期,从子内存分配器矩阵中获取对应的子内存分配器。
167.s406、子内存分配器判断最后一个虚拟内存块是否满足申请的大小,
168.s406中,子内存分配器根据帧内存分配器的id,在预设内存池中确定对应的目标内存块列表,进而判断目标内存块列表中,最后一个虚拟内存块的剩余内存是否满足当前帧的内存请求所申请的大小。若不满足,执行s408,否则,执行s407。
169.s407、子内存分配器分配线程申请的内存。
170.s407中,在最后一个虚拟内存块满足申请大小的情况下,子内存分配器将最后一个虚拟内存块作为目标内存块,将最后一个虚拟内存块中的虚拟地址提交至操作系统,由操作系统分配相应的物理内存给帧计算任务中的各个线程。
171.s408、子内存分配器向全局虚拟内存池申请虚拟内存块。
172.s408中,全局虚拟内存池相当于上述的预设内存池,用于维护虚拟地址,提供请求内存块和归还内存块两种功能调用接口。子内存分配器可以通过请求内存块的功能调用接口,向全局虚拟内存池进行虚拟地址内存块的申请。
173.s409、全局虚拟内存池判断目标内存列表是否有空闲内存块。
174.s409中,全局虚拟内存池在分配虚拟内存块时,首先检查当前帧对应的目标内存列表中的空闲内存块是否为空,若为空,也即目标内存列表没有空闲内存块的情况下,执行s411;否则,执行s410。
175.s410、全局虚拟内存池分配线程申请的内存。
176.s410中,在目标内存列表中包含空闲内存块的情况下,全局虚拟内存池将空闲内存块中的内存地址提交给操作系统,由操作系统分配物理内存给帧计算任务中的各个线程使用。
177.s411、全局虚拟内存池向操作系统申请虚拟内存。
178.s411中,在目标内存列表中没有空闲内存块的情况下,全局虚拟内存池向系统申请固定大小的虚拟内存,根据新申请到的虚拟内存,在目标内存列表中新增空闲内存块,进而从空闲内存块中分配线程申请的内存资源。
179.s412、帧内存分配器返回错误信息。
180.s412中,若内存生命周期与帧状态不相符,如线程在游戏帧的帧状态下,请求渲染帧对应的内存生命周期;或者,在渲染帧的帧状态下,请求游戏帧对应的生命周期,则不进行内存分配,并返回错误提示。
181.可以理解的是,本技术实施例中通过m个循环使用的帧独立的帧内存分配器,实现
了m帧间地址不复用,从而解决了帧间地址重复带来的内存错误访问难以查错的问题,实现了地址错误访问的快速定位,提高了内存管理的稳定性。并且,通过线程独立、帧独立以及生命周期独立的子内存分配器,从独立虚拟地址的内存空间中执行内存资源的分配,可以进行线程独立的内存分配,以实现高效无锁的线程安全,并使得各个线程分配的虚拟地址不重合,从而支持多线程的计算,提高了程序运行的效率。
182.在一些实施例中,基于图14,本技术实施例提供一种帧状态结束时的内存回收方法,如图15所示,如下:
183.s501、帧管理器结束当前帧的计算。
184.s502、通知帧内存分配器更新帧状态。
185.s501-s502中,当当前帧的帧计算任务计算结束时,由帧管理器通知当前帧内存分配器,将当前帧的帧状态更新为结束状态。
186.s503、帧内存分配器更新当前帧的帧状态。
187.s503中,帧内存分配器将当前帧的帧状态更新为结束状态。
188.s504、帧内存分配器通知结束状态对应的子分配器列表中所有子内存分配器执行重置操作。
189.s505、子内存分配器重置内存分配信息。
190.s506、冻结内存。
191.s505-s506中,子内存分配器重置已分配内存大小、分配起点等分配信息,并冻结对应的内存块地址使内存地址无法访问,但保留地址空间。
192.s507、子内存分配器确认上一帧状态是否为渲染帧。
193.s507中,子内存配器可以在合适的时候回收其映射的物理内存。对于当前帧状态为结束状态的当前帧,子内存分配器确认其上一帧状态的帧状态帧是否是渲染帧。若是,则说明游戏应用中的完整一帧已经计算结束,子内存分配器执行s508,进行内存块的归还;否则,不执行任何操作,直至判断为是时,也即上一帧状态为渲染帧时,再统一归还内存块。
194.s508、子内存分配器归还内存块。
195.s509、全局虚拟内存池将归还的内存块记录为空闲内存块。
196.s508-s509中,子内存分配器将冻结后的内存块全部归还给全局虚拟内存池。全局虚拟内存池在当前帧对应的内存块列表中,将归还的内存块记录为空闲内存块。
197.可以理解的是,通过内存回收流程,电子设备可以及时回收内存资源,从而提高了内存资源的利用率,进而提高了程序的运行效率和内存管理的稳定性。
198.下面继续说明本技术实施例提供的内存管理装置255的实施为软件模块的示例性结构,在一些实施例中,如图4所示,存储在存储器250的内存管理装置255中的软件模块可以包括:
199.分配器确定模块2551,用于根据当前帧的帧计算任务发起的内存请求,从预设的m个帧内存分配器中,确定所述当前帧对应的当前帧内存分配器;所述 m个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数;
200.内存获取模块2552,用于通过所述当前帧内存分配器,从预设内存池的m 个内存块列表中,获取所述当前帧对应的目标内存块;所述m个内存块列表与所述m个帧内存分配器一一对应;所述m个内存块列表之间的地址空间不重合;
201.内存分配模块2553,用于从所述目标内存块中获取内存资源,分配至所述帧计算任务。
202.在一些实施例中,所述m个帧内存分配器中的每个帧内存分配器包括:与至少一种帧状态对应的至少一种子内存分配器;所述内存获取模块2552,还用于根据所述当前帧的当前帧状态,从所述当前帧内存分配器对应的至少一种子内存分配器中确定出目标子内存分配器;所述当前帧状态属于所述至少一种帧状态;所述当前帧状态表征所述帧计算任务的业务类型;通过所述目标子内存分配器,从所述预设内存池中获取所述目标内存块。
203.在一些实施例中,所述至少一种子内存分配器中的每种子内存分配器包含线程数量的子分配器;所述线程数量为所述帧计算任务包含线程的数量;每个子分配器与所述帧计算任务的每个线程一一对应;所述内存分配模块2553,还用于通过所述目标子内存分配器中的每个子分配器,从所述目标内存块中同步获取所述帧计算任务中每个线程对应的内存资源,并对应分配至所述每个线程,完成对所述帧计算任务的内存分配。
204.在一些实施例中,所述内存获取模块2552,还用于通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块之前,通过所述当前帧内存分配器,确定所述当前帧的当前帧状态与所述内存请求所申请的内存生命周期是否匹配;在所述帧状态与所述内存生命周期不匹配的情况下,不执行内存分配,进行错误提示。
205.在一些实施例中,所述m个内存块列表的地址空间为虚拟地址空间;所述内存获取模块2552,还用于根据所述内存请求所申请的内存资源量,确定所述当前帧对应的内存块列表中的空闲内存块是否满足所述内存资源量;在不满足的情况下,通过所述预设内存池向电子设备的操作系统申请虚拟内存,根据申请的虚拟内存,在所述当前帧对应的内存块列表中添加空闲内存块;在满足的情况下,将所述空闲内存块作为所述目标内存块;所述内存分配模块2553,还用于将所述目标内存块中的虚拟地址提交至所述操作系统,以使所述操作系统根据所述虚拟地址,分配物理地址的内存资源至所述帧计算任务。
206.在一些实施例中,所述内存分配模块2553,还用于所述从所述目标内存块中获取内存资源,分配至所述帧计算任务之后,在接收到当前帧状态结束指令的情况下,通过所述当前帧内存分配器更新所述当前帧状态,并通知所述目标子内存分配器进行内存分配信息重置;通过所述目标子内存分配器,对所述当前帧对应的内存块列表进行内存分配信息的重置,并对所述帧计算任务对应的已分配虚拟地址进行地址失效处理;在所述当前帧状态表征完成完整一帧计算的情况下,将地址失效处理后的虚拟地址归还至所述预设内存池。
207.需要说明的是,以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本技术装置实施例中未披露的技术细节,请参照本技术方法实施例的描述而理解。
208.本技术实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本技术实施例提供的方法,例如,如图5、图6、图8、图9、图11、图12、图14以及图15中示出的方法。
209.在一些实施例中,计算机可读存储介质可以是fram、rom、prom、ep rom、eeprom、闪存、磁表面存储器、光盘、或cd-rom等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
210.在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,
按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
211.作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(ht ml,hyper text markup language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
212.作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
213.综上所述,在多帧并行计算场景下,通过以帧为单位的帧内存分配器为每一帧进行虚拟内存分配,实现了在当前帧的帧计算任务对上一帧已经失效的内存地址发生错误访问时,操作系统可以及时发现问题,并快速报错与定位,从而提高了内存管理的稳定性。并且,通过独立的帧内存分配器在独立地址空间的内存块列表中进行内存分配,保证了多帧并行计算场景下,为不同帧分配的内存地址不重合,且为不同帧提供了独立的分配起点,减少了一帧在进行分配起点重置与内存重新分配时对其他帧的运行内存环境的影响,实现了对多帧并行计算的支持,提高了程序运行的效率。并且,通过对生命周期的细分,可以更早地回收帧计算任务占用的内存资源,减小不必要的内存占用,使得内存分配更加合理,从而提高了内存利用效率,减少了程序的内存资源占用。并且,由于子分配器是帧独立、生命周期独立、以及线程独立的内存分配器,通过线程数量的子分配器进行内存分配可以进行线程独立的内存分配,以实现高效无锁的线程安全,从而提高了程序运行的效率。
214.以上所述,仅为本技术的实施例而已,并非用于限定本技术的保护范围。凡在本技术的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本技术的保护范围之内。
技术特征:
1.一种内存管理方法,其特征在于,包括:根据当前帧的帧计算任务发起的内存请求,从预设的m个帧内存分配器中,确定所述当前帧对应的当前帧内存分配器;所述m个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数;通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块;所述m个内存块列表与所述m个帧内存分配器一一对应;所述m个内存块列表之间的地址空间不重合;从所述目标内存块中获取内存资源,分配至所述帧计算任务。2.根据权利要求1所述的方法,其特征在于,所述m个帧内存分配器中的每个帧内存分配器包括:与至少一种帧状态对应的至少一种子内存分配器;所述通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块,包括:根据所述当前帧的当前帧状态,从所述当前帧内存分配器对应的至少一种子内存分配器中确定出目标子内存分配器;所述当前帧状态属于所述至少一种帧状态;所述当前帧状态表征所述帧计算任务的业务类型;通过所述目标子内存分配器,从所述预设内存池中获取所述目标内存块。3.根据权利要求2所述的方法,其特征在于,所述至少一种子内存分配器中的每种子内存分配器包含线程数量的子分配器;所述线程数量为所述帧计算任务包含线程的数量;每个子分配器与所述帧计算任务的每个线程一一对应;所述从所述目标内存块中获取内存资源,分配至所述帧计算任务,包括:通过所述目标子内存分配器中的每个子分配器,从所述目标内存块中同步获取所述帧计算任务中每个线程对应的内存资源,并对应分配至所述每个线程,完成对所述帧计算任务的内存分配。4.根据权利要求1-3任一项所述的方法,其特征在于,所述通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块之前,所述方法还包括:通过所述当前帧内存分配器,确定所述当前帧的当前帧状态与所述内存请求所申请的内存生命周期是否匹配;在所述帧状态与所述内存生命周期不匹配的情况下,不执行内存分配,进行错误提示。5.根据权利要求4所述的方法,其特征在于,所述m个内存块列表的地址空间为虚拟地址空间;所述获取所述当前帧对应的目标内存块,包括:根据所述内存请求所申请的内存资源量,确定所述当前帧对应的内存块列表中的空闲内存块是否满足所述内存资源量;在不满足的情况下,通过所述预设内存池向电子设备的操作系统申请虚拟内存,根据申请的虚拟内存,在所述当前帧对应的内存块列表中添加空闲内存块;在满足的情况下,将所述空闲内存块作为所述目标内存块;所述从所述目标内存块中获取内存资源,分配至所述帧计算任务,包括:将所述目标内存块中的虚拟地址提交至所述操作系统,以使所述操作系统根据所述虚拟地址,分配物理地址的内存资源至所述帧计算任务。6.根据权利要求5所述的方法,其特征在于,所述从所述目标内存块中获取内存资源,
分配至所述帧计算任务之后,所述方法还包括:在接收到当前帧状态结束指令的情况下,通过所述当前帧内存分配器更新所述当前帧状态,并通知所述目标子内存分配器进行内存分配信息重置;通过所述目标子内存分配器,对所述当前帧对应的内存块列表进行内存分配信息的重置,并对所述帧计算任务对应的已分配虚拟地址进行地址失效处理;在所述当前帧状态表征完成完整一帧计算的情况下,将地址失效处理后的虚拟地址归还至所述预设内存池。7.一种内存管理装置,其特征在于,包括:分配器确定模块,用于根据当前帧的帧计算任务发起的内存请求,从预设的m个帧内存分配器中,确定所述当前帧对应的当前帧内存分配器;所述m个帧内存分配器为以帧为单位循环使用的内存分配器;m为大于或等于2的正整数;内存获取模块,用于通过所述当前帧内存分配器,从预设内存池的m个内存块列表中,获取所述当前帧对应的目标内存块;所述m个内存块列表与所述m个帧内存分配器一一对应;所述m个内存块列表之间的地址空间不重合;内存分配模块,用于从所述目标内存块中获取内存资源,分配至所述帧计算任务。8.一种电子设备,其特征在于,包括:存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至6任一项所述的方法。9.一种计算机可读存储介质,其特征在于,存储有可执行指令,用于被处理器执行时,实现权利要求1至6任一项所述的方法。10.一种计算机程序产品,包括计算机程序或指令,其特征在于,所述计算机程序或指令被处理器执行时实现权利要求1至6任一项所述的方法。
技术总结
本申请提供了一种内存管理方法、装置、设备、计算机程序及存储介质。方法包括:根据当前帧对应的帧计算任务,从预设的M个帧内存分配器中,确定当前帧对应的当前帧内存分配器;M个帧内存分配器为以帧为单位循环使用的内存分配器;M为大于或等于2的正整数;通过当前帧内存分配器,从预设内存池的M个内存块列表中,获取当前帧对应的目标内存块;M个内存块列表与M个帧内存分配器一一对应;M个内存块列表之间的地址空间不重合;从目标内存块中获取内存资源分配至帧计算任务。通过本申请,能够提高程序运行的效率与内存管理的稳定性。序运行的效率与内存管理的稳定性。序运行的效率与内存管理的稳定性。
技术研发人员:孙凌峰 万园
受保护的技术使用者:腾讯科技(深圳)有限公司
技术研发日:2021.12.09
技术公布日:2022/3/8