下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Virtools项目优化

Virtools项目优化.doc

Virtools项目优化

aisa_2000
2012-04-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《Virtools项目优化doc》,可适用于IT/计算机领域

VirtoolsOptimizationwhitepaper-优化白皮书      爱迪斯通(北京)科技                           Optimization优化为优化你的Virtools作品,以下建议将尽可能帮助你获得最好的图像帧率(FPS帧秒),其中包括四个主要方面。·RenderingOptimization渲染优化·MemoryOptimization内存优化·ScriptOptimizationandBehaviorGraphManagement脚本优化及行为图表管理·OtherOptimizationProcesses其他优化过程RendingOptimization渲染优化·在掌握渲染优化方法前,请回顾“Virtools渲染进程”主题。ViewingFrustrum画面部分图像帧率(FPS帧秒)主要由被渲染的可见物体的数量决定。Virtools总是对所有可见物体进行渲染即使是被阻挡的物体。为降低所需渲染的可见物体的数量有两种重要的解决策略。·室外场景中,你通常在摄影机视图中工作(参见:摄影机设置),因此远距离物体对整个场景一般而言无足轻重首先,尽可能增大摄影机近剖面距离(NearClip)值同时尽可能减小其远剖面距离(FarClip)值在调整过程中找到合适的平衡值你会发现场景中被渲染的物体数量大幅减少但是此时场景的整体效果会降低。为改善摄影机远景的过渡效果这时应当在场景中增加雾效。对比以下两张图片我们可以看到摄影机视图中开启雾效前后的情况。无雾效有雾效·室内场景中你通常应该使用Virtools的入口(Portal)管理。该入口机制用来自动显示隐藏对于当前摄影机不可见的地点(places)。Portalcom("DocumentationCmosBBSamplesOptimization")中给出了入口管理的实例。在该场景中(参见下图)我们定义了四个地点,每个地点代表一个房间。我们先在相邻两个地点的连接处(门所在位置)设置入口(Portal)共三个。之后在Placesetup地点设置中我们定义了入口与地点之间的连接关系。最后一旦入口机制被"PortalManagementBB"激活其中任一个入口在摄影机中不可见时该入口后面的地点就不会被渲染出来。没有入口增加入口Culling剔除在你已经优化了需要渲染的物体数量后Virtools便会只寻找这些需要显示的物体进行渲染。渲染过程中对无需显示的物体进行剔除的过程称作Culling剔除当你的场景中有大量物体的时候此过程可以节省大量渲染时间。为加快剔除的过程你需要对场景中的物体按照渲染过程RenderingProcess所描述的那样建立良好的层级管理。一个好的层级管理意味着同一区域内的物体应当被放在相同的层级里你可以建立一个地点(places)来作为同一区域内所有物体的父级。在Virtools中你可以使用层级管理器HierarchyManager来修改层级关系。Lighting灯光当所有可见物体被找到Virtools会开始计算光照效果。该计算过程将对当前场景中所有可见物体的每一个顶点进行计算。以下列出对此过程的几个优化方法。·尽量减少产生光照效果的灯光的数量。优先选择方向光源其次点光源最后选择聚光光源。尽量减少反射光同时尽量降低灯光的光照范围。·优化你的D模型尽量减少模型面数。·将那些不会在摄影机视图中被整体显示出来的高精度模型(面数很高的物体)分解成几个小物体。例如在下图所示场景中地面被分成了四块。由于无论何时摄影机都只能看见一或两块地面这样就减少了光照计算量。但另一方面增加物体数量的同时降低了摄影机剪辑的速度所以你应当在设置物体数量与物体尺寸之间找到适当的平衡。·另一种优化高精度模型的方法是使用Prelighting光照预处理。你可以在建模软件中对物体进行光照处理然后将它的光照信息输出至Virtools。在Virtools中在物体的MeshSetup中将LitMode选项选为Prelit此时对此物体的所有光照计算将被忽略。为了增加系统效能我们建议将所有静止物体进行光照预处理只对运动物体进行光照计算。你也可以在Virtools中使用"PrecomputeLighting"BB行为模块来为物体制作光照贴图关于此主题的更多相关信息请参阅“Lightingwhitepaper”光照白皮书部分。Drawing绘制渲染过程的最后一步是绘制场景。其渲染时间由以下几方面决定:·所需绘制的面数。因此在符合你的画面质量的前提下建立实时渲染D模型应尽量减少模型面数。虽然对所能绘制的模型面数在理论上并没有上限但是这完全取决于你的显卡硬件水平。·贴图及视频尺寸。当你在作品中使用贴图或视频时你应当尽量保持它们的尺寸为的幂数(,x,x,x)否则Virtools在显存中读取这些文件的时候将重新更改它们的尺寸对于重新更改视频文件的尺寸尤其会消耗大量时间。一张贴图的最大尺寸直接由你的D图形显卡的性能所决定。(一些旧型号显卡尤其需要这些文件的尺寸为正方形)·透明度。当系统绘制透明物体时会对每一个像素进行绘制其最先读取当前buffervalue缓冲值然后与物体信息相混合最后将所得到的值写入缓冲器。因此你的作品中透明的层级越多系统绘制场景的时间将越长。所以尤其注意请隐藏那些完全透明的物体。·多重贴图。当你用多重贴图时(Virtools中MeshSetup网格设置中的Channel通道)你可以选择贴图的混合模式以混合不同的材质层级(SrcBlend,DestBlend)。Virtools会提供所选混会模式下需要显卡渲染通道的数量。如果需要两个通道那么这个物体将会被绘制两次。最新的图形显示卡可以在一个通道内绘制不同的材质层级但这仍要由被选择的混合模式决定。因此尽可能选择占用渲染通道最少的混合模式。NVPerfHUDNVidia英伟达为它的注册开发者提供了一款渲染诊断软件命名为NVPerfHUD它能用于Dev的Directx光栅。使用前在注册表中加入以下键值(DWORDtype)HKEYCURRENTUSERSoftwareVirtoolsAllowNVPerf。此键值允许VirtoolsDirectX光栅在诊断模式下工作此模式需要使用NVPerfHUD。将键值修改为激活诊断模式键值改为关闭诊断模式。如果诊断模式被激活后Virtools不能在NVPerfHUD下运行是由于Dev‘sDirectx光栅在"Referencerasterizer"模式下。(参见DirectX文档中关于Referencerasterizer的信息)。请参考由NVidia提供的NVPerfHUD的说明文件。如果你看见以下警告请选择YES:MemoryOptimization内存优化。在学习存储优化方法前请参阅HowHardwareisUsedbyVirtools(“硬件在Virtools中的运行方式”主题)。MemoryOptimization内存优化·显存容量。保证你需要占用的图像存储空间不要超过你的显卡图形存储器VRAM的容量否则会大大降低渲染数据的存取速度。以下方法可以节约显存空间:·尽可能共享同一张贴图(一些不同材质使用的是一样的贴图)。·在TextureSetup贴图设置中使用最经济的“DesiredVideoFormat”(目标图像格式)。选择或者位的格式由你的需要决定当然你也可以使用压缩格式。·如果必要指定纹理贴图和精灵储存在系统内存中而不是在显存中甚至不去储存它们(例如:从光驱读取)以释放更多的显存空间。这些存储方式可以在VariableManager变量管理器中进行选择。·使用复合贴图。(一张次方尺寸的贴图可以由几幅小贴图共同组成用来显示几个不同的物体具体做法如下角色帖图所示)。·共享媒体文件。为减小文件尺寸保证必需的内存空间你应当:·在材质间共享贴图(贴图参数可以在MaterialSetup材质设置中设置或直接在建模时设置)·在网格间共享材质。(可以在LevelManager级别管理间通过拖放材质球实现也可以在MeshSetup网格设置的材质列表选项里进行设置或者直接在建模时共享材质)·在D物件间共享网格(在LevelManager级别管理间拖放网格实现也可以在DObjectSetupD物体设置中的ObjectMeshesList物体网格列表选项里进行设置或者直接在建模时共享网格)·在角色间共享动作(当你复制一个角色时选择ShareAnimations共享动画或者使用ShareCharacterAnimationKeysBB)。更多信息请参阅“角色动画控制白皮书”(CharacterAnimationControlWhitepaper)FileSizeOptimization文件尺寸优化·纹理压缩。在完成你的作品前压缩贴图尺寸以减小整个项目文件的大小。为获得最好的画面效果建议在TextureSetup贴图设置中对每张贴图指定存储模式(savingoptions)而不是采用全局压缩的方式(在Preferences性能选项中的MiscellaneousControls混合控制中或在VariableManager变量管理器中进行设置)。对特定的图像格式设定与之对应的图像压缩规则将获得更好的效果。·外部文件。在项目周期里及发布最后作品时你可能需要将图像和声音文件作为外部文件进行保存(Preferences选项中MiscellaneousControls选项)这些文件将不会被包含在作品文件中。尤其当需要对同一作品保存不同版本时我们强烈建议你采取这样的保存方式。之后使用PathManager路径管理来确定这些图像和声音文件的存储目录。·文件压缩。当制作提供下载的网络作品时你一定想尽量减少整个文件的档案大小(例如当你保存了同一作品的多个版本时)你可以对最后的Virtoolsfiles(nmo,com)按最大压缩比进行压缩这样做对作品的帧率没有影响。当然文件压缩的越小读取时所用的解压缩时间将更多。你可以在FileOptions选项中的VariableManager变量管理器内设置压缩比。·?使用PatchMesh面片网格。为获得更小的文件你可以在作品中使用面片网格模型代替法线网格模型。面片网格保存后占用很小的存储空间。ScriptOptimizationandBehaviorGraphManagement脚本优化及行为图表管理脚本通常在整个计算过程中不是最占时间的但是如果你的脚本没有优化它们会降低帧率。以下推荐几种优化脚本的基本方法:·使用通用脚本。例如当你需要旋转个物体你并不需要为这个物体分别撰写旋转脚本而只需要编写旋转一组物体的单个脚本或是在array 阵列中描述这些旋转物体的参数如速度等等。·使用层级化的行为图表(BG)来组织你的脚本将那些在循环中被一直执行但实际只需执行一次的BB行为模块分离出来。(请参照下文BehaviorGraphManagement行为图表管理)·当你的确需要编写大量的的脚本(例如分析一个非常长的array阵列)尽量将它的执行过程分散到几帧中而不是在一帧中同时执行。·对BB行为模块所使用的相同的输入数据请尽量多的采用shortcuts来表示以减小文件尺寸。·对于复杂计算你可以使用VirtoolsScriptingLanguageVirtools脚本语言(VSL)进行编写以代替换众多ParameterOperations参数计算或者BB行为模块。BehaviorGraphManagement行为图表管理行为图表管理描述了引擎分析所有BB模块链接并执行所有BB模块功能所需的时间。它于当前帧内在每一个“激活”的脚本里寻找可执行BB并将所有可执行BB执行完毕。行为图表管理的用时状态(与其它重要的性能指标 一起)可以在Profiler分析器中查看。在状态栏中点击按钮(播放模式时该按钮在帧率FPS状态的左侧)即可打开Profiler分析器。BehaviorGraphManagementStrategies:行为图表管理方法:Hierarchy层级为加快渲染速度在层级状态下组织你的BG行为图表是关键。层级管理可以帮助优化剔除(culling)显示隐藏物体执行BB行为模块等等。ActiveScriptsandActiveBehaviorGraphs执行脚本与执行行为图表脚本的实际数量并不重要真正重要的是实际执行的脚本"Activescripts"数量与实际执行的行为图表BG的数量。将所有BB行为模块不加区分的放在同一级别进行处理是一个比较普遍的错误我们应该对“单次执行”的非循环BBBG与“始终执行”的循环BBBG加以区分。在当前执行阶段一旦有脚本或行为图表被激活Dev引擎一定会执行每一个脚本链接。但它会忽略所有没被激活的行为图表脚本。VSLforLoopingProcesses用VSL循环进程零延迟的循环会增加严重的系统开销。许多循环进程可以使用VSL代码实现这样可以大幅提升系统性能。尤其在运行每一帧都需要用到多个群组group或阵列array的情况下这点显得尤为重要。行为图表管理实例脚本:需要避免的上图所示的是一个不规范的脚本编写方式由于存在循环语句即使多数的BB只单次执行但是这些只执行一次的BB应当组织在一个单独的脚本中(或者至少在一个单独的行为图表BG中)。脚本:优化后遵照上述原则图中SwitchOnParameterBB在当前时间点只有一个输出端会被激活因此我们可以将该输出端后的BB组织在一个单独的BG中这样的层级管理可以帮助我们直接跳过不被激活的部分以节约宝贵的时间。脚本:需要避免的上图中的脚本将比下图脚本执行更长时间。脚本:优化后在这个优化后的脚本中那些接到讯息方响应执行的BB被重新组织到一个名为OnceInWhile的BG中该BG只有在需要的时候才会被执行。BGManagementAddendum行为图表管理附录ViewingActiveInactiveScripts观察已激活非激活脚本状态激活“Schematic”工具栏中的TraceMode跟踪模式以观察脚本BG的执行情况。如果一个已激活的脚本中有许多链接及没被激活的BB那么这个脚本很可能需要优化。OtherScriptOptimizationstrategies:其它脚本优化方法:·?隐藏显示某一层级:不要通过物体间层级关系的判断来显示隐藏每一个物体直接使用HideHierarchyShowBB来实现。·将两个物体设置在同一位置:不要循环使用SetPositionBB来实现只要在HierarchyManager层级管理中将其中一个物体设置为另一物体的父级。Addendum附录当我们执行一个已激活的脚本或行为图表时我们先开始检查当前层级的所有行为链接。这是因为BB行为模块在任何时间点(不管在一个循环进程的内部还是外部)都有可能激活它们的输出端。WaitMessageBB就是这种行为模式的一个例子一旦收到由其他脚本发出的讯息它的输出端就会被激活。只有当其被激活后我们才能执行WaitMessageBB的后续行为。也就是说执行包含WaitMessageBB的脚本时我们检查所有的链接(link)。检查从上一帧开始它的输入端链接是否被激活。有可能激活链接在其后的所有BB。其他优化过程。Virtools提供了以下工具以提高显示帧率:·LevelOfDetail细节水平。Virtools在"OptimizationLevelOfDetail"类型里提供了此类BB以自动改变物体的面数。只要选中ProgressiveMesh选项面片网格模型或是通常的网格模型都可以实现此功能。通过这些BBVirtools将根据物体与摄影机的距离自动调整物体面数。距离越远物体的面数越少。当角色远离摄影机时你也可以为动画设置细节级别从而精简角色动作。·CollisionDetection碰撞检查。当你在使用高精度模型做障碍物时碰撞检查进程将花费更多时间。一般而言对碰撞检查的精度不必要求与渲染精度一样高。因此使用一个隐藏的简单模型来代替高精度模型做障碍物可以极大提高系统效率。将隐藏物体与可见物体放在同一位置并只将该隐藏物体用于碰撞检查。·VariableManager变量管理。在变量管理器中你可以对程序及作品的渲染选项进行设置。确保这些选项符合你的图形显示卡功效。·PortalManagement入口管理。当你建立了一个由几个独立房间组成的室内场景时使用Virtools入口管理。Virtools为此在"OptimizationPortals"类型中提供相关BB设定两个地点间的入口(隐藏物体)当此入口不可见时系统会自动隐藏相应地点。·Occluder遮挡物。当你不使用Virtools 入口管理时你可以在Attribute管理器内Optimization类型里对物体设置Occluder遮挡物属性来实现相似功能。当一个物体被设定为遮挡物时所有在其后面的物体(相对于摄影机而言)都将被隐藏这样能加快渲染速度。当然遮挡物越多你用于判断被遮挡物体的时间将越长。判断被遮挡物需要占用一定时间而减少渲染物体数量后又可以节约一定时间你需要在两者之间找到适当的平衡以达到合适的优化效果。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/10

Virtools项目优化

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利