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

可视化场景内存处理方法与流程

2022-05-18 15:58:05 来源:中国专利 TAG:

1.本发明涉及可视化场景构建技术领域,具体涉及一种可视化场景内存处理方法。


背景技术:

2.在广告商品时可以采用3d的可视化场景进行展示,更加的直观。基于threejs的可视化场景开发时,创建的任何材质纹理、模型、贴图都会占用内存。特别是需要动态增加、修改模型和纹理的情况,每次改动之后都需要增加新的纹理资源到内存,这些资源会在设备机器内存中累积,占用量过大的时候可能会导致程序卡顿或者直接崩溃。为此,需要一种内存处理方法保证可视化场景的顺利展示。
3.公开于该背景技术部分的信息仅仅旨在加深对本发明总体背景技术的理解,而不应当被视为承认或以任何形式暗示该信息构成本领域技术人员所公知的现有技术。


技术实现要素:

4.本发明提供一种可视化场景内存处理方法,以解决现有的可视化场景占用内存大,容易导致卡顿的技术问题。
5.为解决上述技术问题,本发明采用如下技术方案:设计一种可视化场景内存处理方法,设置内存池,该内存池中保存了可视化场景当前位置的纹理对象,在所述可视化场景行走至下一位置时,加载该下一位置增加的纹理对象同时清除减少的纹理对象。
6.进一步的,所述内存池设置缓存量的个数以不影响计算机执行为限。
7.进一步的,首先遍历可视化场景中全部的全景点位置计算出当前可视化场景中在视口内和不在视口内的全景点位置,判断内存池中是否包括在视口内的场景的纹理对象,若不存在就加载该点的纹理对象并添加到内存池中。
8.进一步的,所述可视化场景行走至下一位置时,遍历不在视口内的全景点位置,清除内存池中不在视口内的位置点的纹理对象。
9.进一步的,视口内全景点位置包括可移动点和不可移动点,加载的是可移动点的纹理对象。
10.进一步的,使用自动寻路的方法计算出可移动全景点位置,自动增删所述内存池中的纹理对象,其步骤如下:以当前相机点作为第一全景点向可视化场景中的其他全景点发射射线,寻找到距离最近的第二全景点,以第二全景点为起点向场景中除了第一全景点以外的其他全景点发射射线,再次寻找到距离最近的第三全景点,重复上述动作直到遍历完场景内的所有全景点或者射线拾取不到距离最短的点为止,得到一条可移动点路径,向内存池加载路径中有而内存池中没有的纹理对象并删除路径中没有而内存池中有的纹理对象。
11.进一步的,在所述可视化场景行走至下一位置时得到一条新的路径数据,与前一位置内存池里保存的数据对比,加载内存池中没有的纹理对象并删除内存池中多余的纹理
对象。
12.与现有技术相比,本发明的主要有益技术效果在于:本发明提供一个可视化场景中的内存池,预先将模型纹理缓存,解决模型纹理加载速度问题,使用完成后清除不需要的纹理,解决模型纹理内存占用问题,设置一个默认大小,超出范围后按先进先出原则去清理。在业务复杂的情况下利用射线计算出可移动的全景点场景,每次移动、旋转、缩放动作完成之后都会执行内存的处理方法,自动进行该场景下纹理的缓存和释放,及时缓存和释放不需要的纹理,提高模型纹理加载速度,减少浏览器内存占用。
附图说明
13.图1为本发明可视化场景内存处理方法实施例1的流程图。
14.图2为本发明可视化场景内存处理方法实施例2的流程图。
15.图3为本发明可视化场景内存处理方法实施例3的流程图。
具体实施方式
16.下面结合附图和实施例来说明本发明的具体实施方式,但以下实施例只是用来详细说明本发明,并不以任何方式限制本发明的范围。
17.以下实施例中所涉及或依赖的程序均为本技术领域的常规程序或简单程序,本领域技术人员均能根据具体应用场景做出常规选择或者适应性调整。
18.实施例一:一种可视化场景内存处理方法,参见图1,基于threejs的可视化场景行走时需要频繁更新当前场景的纹理,设置内存池针对场景的纹理做内存占用的清除。内存池是一个数组cubemaps[],保存了当前场景的纹理对象和行走过后留下的纹理对象,它的缓存数量可以设置,如果设置为3个缓存量,那么内存池中只会存在3个纹理对象,保持换存量使其不积累以不影响程序运行避免造成卡顿等问题。
[0019]
在可视化场景中行走时,首先会从内存池中获取纹理对象,如果存在,那么不用再去加载新的纹理,直接使用内存池中的纹理对象。如果不存在,那么需要加载新的纹理,并且清除最先缓存的纹理对象。
[0020]
行走时内存池中已经缓存了纹理,如:内存池cubemaps = [a,b,c],且它的缓存个数设置为3,[a,b,c]表示从位置a走到了位置b,又从b走到了c,已经缓存了3个场景纹理对象,如果此时要从c回到b,行走方法在cubemaps中找到了b,就不需要再次生成b的纹理,直接使用b的纹理执行行走方法即可。
[0021]
行走时内存池中没有缓存纹理,如:内存池cubemaps = [a,b,c],下一步从c走到d,此时内存池中没有d的纹理,内存机制会首先清除a的纹理,它是最先缓存的,调用threejs纹理对象的dispose()方法对a的纹理进行清除,a.dispose(),这个方法不光在场景内部把纹理对象清除了,也从机器的内存中主动清除了纹理对象a。然后加载d的纹理对象,加载成功之后把d放到a的位置,cubemaps变成了[d,b,c],执行移动。如果再走到e,那么内存池会清理b的内存,并把b换成e,cubesmaps换成为[d,e,c],先缓存的先清理,后缓存的后清理。
[0022]
实施例二:根据相机朝向、自动寻路得到的位置,自动增删内存池中的纹理对象。
每次移动、旋转、缩放动作完成之后会执行内存的处理方法。
[0023]
在相机可视化窗口内计算出可移动全景点,自动增删纹理:首先遍历全部的全景点位置计算出当前可视化场景中在视口内的全景点位置和不在视口内的全景点位置,得到的视口内全景点位置包括了可移动和不可移动的全景点。然后遍历这部分全景点,利用射线计算出可移动的点,判断内存池中是否存在该点,存在就不添加到内存池,不存在就加载该点的纹理对象并添加到内存池中。移动、旋转、缩放完成之后还需要遍历不在视口内的全景点位置,如果不在视口内的位置点的纹理对象存在内存池中,就清除它。
[0024]
具体的,场景内所有的全景点为allcubemaps,是一个数组[],初始化场景的时候从模型中获得,allcubemaps = [a,b,c,d,e,f,g],a-g是三维向量;在视口内的全景点inviewportcubemaps,也是一个数组,默认没有数据inviewportcubemaps = [];不在视口内的全景点outviewportcubemaps ,默认是空数组outviewportcubemaps = [];内存池cubesmaps,数组,默认也是空数组,cubesmaps = [];可视化场景初始化的时候inviewportcubemaps ,outviewportcubemaps ,cubesmaps 会被赋值。
[0025]
1.遍历allcubemaps[a,b,c,d,e,f,g],判断a-g的位置是否在视口内有两个方法:方法一:把三维向量转换为标准设备坐标系坐标m,new three.vector2(x,y),标准设备坐标系坐标的x和y值在-1~1之间,判断x和y的绝对值,math.abs(m.x)或者math.abs(m.y)其中有一个值大于1,那么这个点就是屏幕的视口之外。
[0026]
方法二:利用相机矩阵转换三维向量成为一个归一化的三维向量m,new three.vector3(x,y,z),判断m的x、y、z的绝对值,有一个大于1的那么这个点就是屏幕视口外的点。
[0027]
执行方法一或方法二之后得到在视口内的全景点数组inviewportcubemaps[a,b,c,d]和不在视口内的全景点数组outviewportcubemaps[e,f,g]。
[0028]
2.遍历inviewportcubemaps,把a,b,c,d的值转换为标准设备坐标系坐标,利用射线从相机向a,b,c,d转换过后的标准设备坐标系坐标发射射线,判断返回的模型中从相机到a,b,c,d的指示模型之间存不存在墙体,如果中间存在墙体,那么该位置不可移动,如果中间不存在墙体(即只有家具和位置指示模型),那么这个点就是可移动点。得到可移动点之后判断它是否存在内存池cubesmaps中,不存在就加载该点的纹理并添加到内存池中,存在就不添加。本实施例中a,b,c,d都不存在内存池中,所以cubesmaps = [a,b,c,d]。
[0029]
3.遍历outviewportcubemaps [e,f,g],判断e、f、g是否存在cubemaps中,存在就执行纹理对象的dispose()方法从机器内存中清除它占用的内存,同时从cubesmaps中删除。
[0030]
实施例三:使用自动寻路的方法计算出可移动全景点位置,自动增删纹理:以当前相机点a向场景中的其他全景点发射射线,寻找到可移动点中与当前相机位置距离最近的点b,保存b。下一步以b为起点向其场景中除了a以外的其他全景点发射射线,再次寻找到以b点为起点找到的最短距离可移动点c,和b一起保存。之后一直重复这个动作直到遍历完场景内的所有全景点或者射线拾取不到距离最短的点为止,完成之后得到一条可移动点路径。这个方法只需要在场景初始化和移动结束的时候执行就可以,它比基于可视化窗口计算的内存纹理处理方法更灵活,可以寻找到屏幕之外的可移动点。每次移动结束得到一条路径数据,与内存池里保存的数据作对比,内存池中有,路径中也有,就是当次路径和上次
路径都经过了这个位置,不处理它的纹理对象。内存池里有,路径中没有,那么需要dispose()方法从机器内存中删除该纹理,同时从内存池中移除;内存池里没有,路径中有,加载该点的纹理对象,并添加到内存池中。
[0031]
具体的,场景内所有的全景点为allcubemaps,是一个数组[],初始化场景的时候从模型中获得,allcubemaps = [a,b,c,d,e,f,g],a-g是三维向量;trackcubemaps=[],寻找到的路径。内存池cubemaps = [];默认相机位置是在a的位置。
[0032]
1.a分别向b,c,d,e,f,g发射射线,根据射线返回的物体判断,a到b、c、d中间是没有墙体的,也就是a可以移动到b、c、d,再判断射线到b、c、d的距离属性distance,求出和a最短距离点为b,保存到trackcubemaps中,trackcubemaps = [b]。
[0033]
2.b分别向c,d,e,f,g发射射线,重复第一步的条件判断,得到与b最短距离点为f,保存到trackcubemaps中,trackcubemaps = [b,f];每次发射射线都要把已经发射过射线的点排除,下一步就是f向c,d,e,g发射射线了,排除了a,b。本步骤的结束条件是把场景点遍历完,或者在某个位置射线到其他位置中间有墙壁,就不可移动,结束遍历,此时trackcubemaps = [ b, f, d, g ]。
[0034]
3.trackcubemaps = [ b, f, d, g ] 和 cubemaps = [] 对比,同时存在trackcubemaps和cubemaps中的做处理;trackcubemaps中有,cubemaps中没有的,向cubemaps中添加纹理对象;trackcubemaps中没有,cubemaps中有的,dispose清除机器内存占用并从cubemaps中移除。
[0035]
比如:(1)trackcubemaps=[b,f,d,g],cubemaps=[];加载b, f, d, g的纹理对象到内存池中。
[0036]
(2)trackcubemaps=[b,f,d,g],cubemaps=[b,f,d];添加g的纹理对象到内存池中。
[0037]
(3)trackcubemaps=[b,f,d],cubemaps=[b,f,d,g];清除g的内存,把g从cubemaps中移除。
[0038]
上面结合附图和实施例对本发明作了详细的说明,但是,所属技术领域的技术人员能够理解,在不脱离本发明宗旨的前提下,还可以对上述实施例中的各个具体参数进行变更,或对相关方法步骤进行等同替代,从而形成多个具体的实施例,均为本发明的常见变化范围,在此不再一一详述。
再多了解一些

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

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

相关文献