预测模型可划分为哪些种类
依据方法本身的特性将预测技术划分为三种类型。
1、定性预测技术
基于人们对系统过去及目前状况的经验、判断和直观进行预测,其中以人的逻辑判断为主导,仅需提供系统发展的方向、状态、形势等定性结论。此方法适用于缺乏历史统计数据的目标系统。
2、时间序列分析
依据系统对象随时间变化的历史数据,仅考虑系统变量随时间的变化规律,对系统未来的表现进行定量预测。主要包括移动平均法、指数平滑法、趋势外推法等。此方法适用于运用简单统计数据预测研究对象随时间变化的趋势等。
3、因果关系预测
系统变量之间存在某种前因后果关系,找出影响某种结果的几个因素,建立因与果之间的数学模型,根据因素变量的变化预测结果变量的变化,既预测系统发展的方向又确定具体的数值变化规律。
扩展资料:
预测模型是在运用定量预测技术进行预测时,建立预测数学模型是最关键的工作。预测模型是指用于预测的,用数学语言或公式所描述的事物间的数量关系。它在一定程度上揭示了事物间的内在规律性,预测时将其作为计算预测值的直接依据。
因此,它对预测准确度有极大的影响。任何一种具体的预测技术都是以其特定的数学模型为特征。预测技术的种类繁多,各有相应的预测模型。
趋势外推预测技术是根据事物的历史和现实数据,寻求事物随时间推移而发展变化的规律,从而推测其未来状况的一种常用预测技术。
趋势外推预测技术的假设条件是:
(1)假设事物发展过程没有跳跃式变化,即事物的发展变化是渐进型的。
(2)假设所研究系统的结构、功能等基本保持不变,即假定根据过去资料建立的趋势外推模型能适合未来,能代表未来趋势变化的情况。
由以上两个假设条件可知,趋势外推预测技术是事物发展渐进过程的一种统计预测技术。简言之,就是运用一个数学模型,拟合一条趋势线,然后用这个模型外推预测未来时期事物的发展。
趋势外推预测技术主要利用描绘散点图的方法(图形识别)和差分法计算进行模型选择。
主要优点是:可以揭示事物发展的未来,并定量地评估其功能特性。
趋势外推预测技术比较适合中、长期新产品预测,要求有至少5年的数据资料。
组合预测技术是对同一个问题,采用多种预测技术。组合的主要目的是综合利用各种方法所提供的信息,尽可能地提高预测精度。组合预测有 2种基本形式,一是等权组合,即各预测技术的预测值按相同的权数组合成新的预测值;二是不等权组合,即赋予不同预测技术的预测值不同的权数。
这 2种形式的原理和运用方法完全相同,只是权数的取定有所区别。根据经验,采用不等权组合的组合预测技术结果较为准确。
回归预测技术是根据自变量和因变量之间的相关关系进行预测的。自变量的个数可以一个或多个,根据自变量的个数可分为一元回归预测和多元回归预测。同时根据自变量和因变量的相关关系,分为线性回归预测技术和非线性回归技术。
回归问题的学习等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且能很好地预测未知数据。
参考资料:百度百科——预测模型
参考资料:百度百科——定性预测
Unity开放世界大地图如何优化
大地形数据加载策略
大地形加载考虑到现有的内存机制,不可能一次性将其加入到内存中,这个问题是显而易见的,其实在游戏开发中经常遇到,比如我们常见的进度条,加载进度条的目的就是等待程序加载场景,进度条只是一个蒙板遮罩而已。大地形的加载,别无他法,只能用分块,这个是大方向,因此作为程序来说,要做的事情是如何分块?块的大小是多少?这些具体的问题我们要根据需求划分,比如飞行模拟器块大小可能就要大一些,因为俯瞰的视角比较大,场景漫游块可以小一些等等,下面我们就以游戏的经典之作——魔兽世界地形加载策略为例给读者先介绍一下它的实现原理,魔兽世界这款游戏实现的就是无缝地图的拼接,所以非常具有参考价值,先看下图所示:
魔兽世界是如何实现无限地图的?其实它也是很多的场景块拼接而成的,我们通过编辑器分析魔兽世界的地形块的大小划分,魔兽世界场景我们称为MapWorld是由一系列MapTile组成,这些MapTile的大小是1600/3≈ 533.33m,而每个MapTile又是由 16x16个MapChunk组成,由此可以计算出每个MapChunk≈33.33m。再就是每个MapChunk又由9x9+8x8个地形顶点高度,法线,若干贴图层(一般为4层)组成的地表纹理。魔兽世界地形的大小,在这里我们就不讨论了,但它划分块的思想我们是可以借鉴的。
继续分析魔兽世界的分块方法:它们是根据矩阵的方式进行划分的,在XZ平面上进行的,每个块都会包含一定的信息数据的,比如:在XZ(3,3)位置的MapTile,每个MapTile都包含了该tile内使用的贴图、模型实例等等。所谓模型实例也就是我们的道具,可以理解成相同模型在tile内不同摆放位置、大小、角度的信息,它们都是被保存在二进制文件中的,为了节省文件尺寸,模式实例是通过index模型方式保存的,同顶点索引类似,在每个MapTile里面还有贴图信息比如贴图的名字和UV信息等等。本篇课程的分块思维方式跟魔兽世界的类似,会在后面的章节中详细介绍,块分好了以后,下面就是实现原理了。
实现原理:在任何时刻,程序总是保存着玩家所在的及其周围的3x3个MapTile,随着玩家的移动,这些MapTile会被动态更新,新的MapTile被加载以替换被卸载的旧MapTile。为了提高调度效率,魔兽引入了Cache机制,Cache中保存着最多16个MapTile数据。需要加载新的MapTile时,首先会在Cache中查找;卸载的旧MapTile也不会被立刻删除,而是保存在Cache中以备再次调用。由于一段时间内玩家的活动范围通常不会有太大变化,这一Cache策略在应用中表现的非常出色,这是无缝地图的基本原理。地形的动态加载卸载我们会使用多线程去实现,我们会整两个线程:一个线程专门用于加载地形,另一个线程专门用于卸载或隐藏地形MapTile。让我们再来回忆一下游戏的经典之作,游戏场景效果如下所示:
实现机制:在任何节点,程序持续保留着玩家所处位置及其周边的3x3个MapTile,伴随玩家行动,这些MapTile将动态更新,新MapTile加载以替换卸载的旧MapTile。为提升调度效率,魔兽引入了缓存机制,缓存内存储最多16个MapTile数据。需加载新MapTile时,首要在缓存内检索;卸载的旧MapTile也不会立即删除,而是保留在缓存中以备后续调用。鉴于玩家活动范围在一段时间内通常变化不大,此缓存策略在实际应用中表现优异,即无缝地图的基本原理。地形的动态加载卸载将通过多线程实现,我们将设置两个线程:一个负责地形加载,另一个负责卸载或隐藏地形MapTile。让我们回顾一下游戏的经典之作,游戏场景效果如下所示:
本课程实现的方法处理块的加载显示问题有两大途径,一是采用对象池技术,预先加载分块地形,依据视距进行检测判断显示哪些地块及隐藏哪些地块,此过程中并不删除它们。这样仅需一个线程即可。二是采用多线程,设置一个线程专门用于移除卸载视线外的地块,以此提升效率,以下介绍使用多线程的加载方案。
多线程实现大地形加载方案
多线程在PC端游戏中应用广泛,例如可以设置一个线程专门进行资源加载,游戏服务器同样也会使用多线程,以下向读者介绍多线程实现方案,多线程处理问题就是把所有加载逻辑放入新的进程中,与主线程进行进程间通信,接收主线程的加载建议,进行按需加载,也会自主进行一些预先加载,放入分配的内存,与魔兽世界的处理方式相似,通过进程间内存共享机制,将加载的地形数据共享给主进程使用。主游戏进程,只需维护一个非常小的内存即可,大量内存数据都在另一个进程中处理。这样就可以优化大地形块的加载,实现方式如下所示:
首先主线程会先加载九块地形,主线程只负责维护这九块地形,无论角色如何移动,角色所在区域始终是九块地形,如上图所示,这九块可以直接由主线程加载到内存中,剩下的16块通过另一个线程将其放入缓存中,角色的位置位于已加载好的九块地形中间,即A所在的位置。随着角色移动,会有新的地形块加入,同时现有地形块会被替换出去,以此保持显示九块地形,被替换的地形不会立即卸载,会根据角色移动情况进行预判,等待主线程通知,按照一定规则进行卸载地块和加载地块。实际上这种实现方式就是我们通常所说的双缓存-多线程技术。实现效果如下所示:
地形分块加载完成后,接下来要考虑地形上的纹理贴图问题,地形的贴图资源也会占用大量内存,以下介绍如何加载海量贴图数据。
大地形海量图片的加载方案
大地形中的场景图片众多,地形中的贴图至少有四层,如此多的贴图在加载时需要考虑的因素,分块时也需要考虑这些因素,另外场景中使用的LightMap烘焙也需要考虑,为缓解内存压力,我们事先将不同块中的地形材质及建筑物材质进行打包,先介绍如何分块加载场景贴图?其实现方式如下所示:
该思路是将场景中的贴图根据划分的块打成不同的图集,当然也可以将两个块中的贴图打成一个图集,图集大小对于PC端来说,最大为4096,在移动端最大为2048。这也是为了避免内存频繁加载卸载导致大量内存碎片,不利于后续大内存分配。在打图集之前,我们需要做一些事情,即需要将地形块中的纹理贴图与我们的打包图集之间建立一一对应关系,方便对号入座。因为我们打包的图集与实际地形之间没有任何关系,要确立二者之间的对应关系,我们需要在它们之间再设置一张索引文件表格,它是连接图集与实际地形纹理的桥梁,通过我们建立的索引文件,我们可以找到实际地形中纹理与图集纹理之间的对应关系,我们建立的索引表格需要加载到内存中,而我们的图集是根据加载任务后期才加载到内存中的,这就要求我们的索引文件尽可能少,因为它们是常驻内存的,除了海量图片的加载,我们还需要处理密集建筑的加载。
-密集建筑的加载方案
密集的建筑加载,大家可以想象一下,如果把场景中所有的建筑一次性加载到内存中,内存瞬间就会占满,帧数瞬间下降,这也是为什么大家在游戏场景中移动时,遇到密集的建筑就会卡顿一下的原因。以前处理方式是使用LOD处理,被遮挡的物体使用简模,这样也会加大内存的负载效果,如果角色一直在建筑物之间来回穿梭,这样不同LOD模型就需要来回切换,对内存也是一个负担,效果不理想。这些问题对于程序员来说必须解决的问题,如何解决呢?很多人想到了合并大Mesh,这种方法并不可行,大网格并不适合做裁剪操作,试想一下,我们合并的网格,如果摄像机只看其一小部分,因为它们是一个整体,这样就需要把它们一起加载到内存中,而实际上我们并不需要这么多模型数据,在合并网格时,在这里也给读者一个建议,尽量将靠得很近的模型进行合并,避免上述问题发生。实际上最有效的解决方案还是划分块,这个划分块可以利用地形划分的思想进行,它与地形块紧密相关,每个地形块中的建筑物跟随地形块一起加载。如果块中的建筑非常密集,这种方法还不足以完全解决问题,还需要进一步处理,即加入OC遮挡算法结合LOD算法,这样就可以完全解决我们当前的问题了,这也是本篇课程
密集的楼宇堆积,不妨设想,若将场景中所有楼宇一次性填充至内存,内存将瞬间饱和,帧率急剧降低,这正是为何在游戏场景中穿梭至密集楼宇时,常会短暂卡顿。过往的处理手法是采用LOD技术,对被遮挡的物体使用简化模型,但这亦加剧了内存负担。若角色在建筑间频繁穿梭,不同LOD模型需频繁切换,对内存构成负担,效果不尽人意。这些问题对程序员而言,是亟待解决的难题。如何解决?许多人想到合并大网格,但此法不可行,大网格不适合进行裁剪操作。想象一下,若我们合并的网格仅被摄像机捕捉到一小部分,由于它们是一个整体,所以需要将它们全部加载到内存中,但实际上我们并不需要这么多模型数据。在合并网格时,在此也向读者提出一些建议,尽量将相邻的模型进行合并,以避免上述问题。其实,最有效的解决方案还是划分区域,这种划分区域可以借鉴地形划分的思想,它与地形区域紧密相关,每个地形区域中的建筑随地形区域一起加载。若区域中的建筑非常密集,这种方法尚不能完全解决问题,还需进一步处理,即加入OC遮挡算法结合LOD算法,这样便可完全解决我们当前的问题,这也是本篇课程要讲解的方法。进一步优化方法是将OC遮挡算法和LOD算法放到GPU中进行计算,这样效率还会提升。在Siggraph2015发表的一篇文章《GPU-Driven Rendering Pipelines》中,其思想就是利用GPU进行遮挡裁剪处理,主要分为两个阶段,使用的是DX12图形API,如下图所示:
其思想是先进行初步的遮挡裁剪列表,然后在此基础上根据视线距离或射线检测进行进一步的细化裁剪操作,这个思想与我们的碰撞检测算法类似,引擎中的碰撞检测算法也是基于这个原理实现的。在此向读者介绍一下:实际可用的碰撞检测算法,一般分为两个阶段:
第一阶段,broad phase快速找出潜在的碰撞物体对列表,不在该列表中的物体绝对不可能发生碰撞。broad phase确定了一批需要进一步检查的物体对。
第二阶段,narrow phase准确找出发生碰撞的物体对列表。因为上一个阶段的部分物体对实际上是没有碰撞的,需要在这个阶段剔除。
broad phase中有一个简单算法叫sweep and prune(SAP),其本质上是利用了排序算法。第一步是初始化排序列表,列表中的元素是包围盒,可以用任意排序算法完成,例如快速排序;之后的排序就不是使用快速排序了,而是使用冒泡排序,为什么使用冒泡排序更好呢?因为一个默认的前提:物体的运动有时间相关性(temporal coherence),即当前帧和下一帧的位置是相近的,所以在冒泡排序过程中,发生的位置交换预期都很靠近。
其实算法中有很多类似的地方,这里我们也要互相借鉴它们解决问题的思想用于解决我们的问题。笔者以前从事端游开发,端游中的许多优化思想同样适用于移动端,移动端与PC端相比,就是一台配置较低的电脑而已。接下来,我们继续介绍遮挡裁剪,论文作者也进行了一个效率测试,以250万物体、1G网格为例,测试效果如下所示:
是不是很酷啊!在项目开发中完全可以利用它解决问题。下面我们再谈谈使用GPU优化我们的大地形场景。
GPU大地形渲染优化解决方案
我们的大地形首先会有自己的地表贴图,常用的地表贴图是四张纹理融合,最多可以有八张贴图融合,地形纹理渲染会涉及到LOD算法,远处的地形网格可以简化一些,对应的贴图也是最低的,这就是MipMap的使用。另外,肯定会有草、花以及其他大量相同的物件渲染。先说说草和花的绘制,在游戏中,它们会非常多,常用的做法是引擎提供的面片或者是十字交叉,或者三张图片交叉,然后将带有Alpha通道的贴图映射在上面,如下图所示效果:
在PC端,CPU绘制这些草或花是可以的,因为现在的电脑都是多核的,但在手机端就会影响到效率问题。使用CPU绘制,DrawCall会非常多,而且草或花还需要摆动,计算量很大,这严重影响了运行效率。CPU有难,GPU可以帮忙,我们可以将草或花的绘制放到GPU中执行,效果如下所示: