Unity Profile内各项参数释义

用途

在Unity Profile 的 CPU Usage 里可以看到各种 Unity 函数的耗时。如下图:


image.png

下面的表格便是日常整理的一些 Unity函数的释义。供大家参考查阅~

Profile 参数表

Profile 函数 释义
Overhead There is no statistical CPU consumption in the engine. Each module of the engine has a certain internal friction, which is very high. It is suggested that the exclusion method be used to determine which module has the highest Overhead.
CameraRender Preparations for GPU rendering submission, including software tailoring, occlusion culling, batch, rendering queue preparation, etc.
MeshBakePhysXCollisionData When scenes are loaded, create the Mesh data needed for PhysX for Mesh Collider.
MeshBakeScaledMeshPhysXCollisionData When scenes are loaded, create the Mesh data needed for PhysX for Mesh Collider with Scale
LoadingReadObjectThreaded Threaded data read operations when loading scenarios and loading data from Resources or AssetBundle
IntergrateAllThreadedObjects When loading scenarios and loading data from Resources or AssetBundle, the main thread integrates data read by threads
FontCacheFontForText Refresh font texture when text component text changes
CanvasRendererOnTransformChanged When the UI element in Canvas has a Transform attribute change, do dirty tagging operation on the UI element
GfxWaitForPresent CPU等待GPU渲染完成并交换到前缓冲
DirectorSampleTime When Animator plays animation, the sampling time of each frame is calculated
BehaviourUpdate Update callback consumption in scripts
FixedBehaviourUpdate Fixed Update callback consumption in script
LateBehaviorUpdate Late Update callback consumption in script
PlayerInitState 根据向所有GameObject广播当前app是否处于Pause状态和焦点状态(得到或失去焦点)
DevicePresent The time of buffer exchange through eglSwapBuffers to render the picture.
WaitForTargetFPS 在手机平台上,只有在Quality Settings中的V Sync Count选择Don't Sync或者Every Second V Blank时出现。对于Don't Sync,tag出现表示cpu正在根据设定的帧率消耗掉额外的时间。对于Every Second V Blank 引擎会根据设备刷新率确定需要等待的时间。
LoadingUpdatePreloading 在异步加载/卸载场景,异步加载AssetBundle,加载AssetBundle中的Asset,加载Resource文件夹中资源,调用UnloadUnusedAssets时会产生这个tag.如果加载操作要求等待完成,则会在子tag中看到AsyncOperationComplete, 否则在子tag中会看到IntegrateAssetsInBackground
UnloadScene 首先会收集场景中所有的需要销毁的gameobject(参见CollectSceneGameObjects),然后遍历销毁所有Gameobject(参见DestroyProfile),之后销毁Scene本身及相关的管理类
CreateGpuProgram 根据不同的平台对shader源文件进行编译。如果shader之前已经cache,则只需要对cache的shader进行加载。此项数据突出,则需要检查是否有大量的shader或者shader变体在同一帧被加载编译。
ApplicationPreloadAssets 引擎在加载Asset,会根据Asset的不同而执行不同的操作
ApplicationIntegrateAssetsinBackground 根据加载线程的优先级取得可用时间片,在时间片耗尽前,尝试最多次的加载资源。每次加载资源会产生一次kPreloadSingleStep tag。Unity Preloading的线程可用时间片每次为4ms
PreloadSingleStep 每次执行时,先确保preload manager线程已经启动,然后尝试向显卡异步传输数据(WEBGL平台不支持这一特性)。异步上传的时间片和buffer大小默认分别为2ms和4MB的循环缓冲区。通过Quality Setting可以调整默认大小。然后查询异步加载队列中第一位的任务是否完成,以及和当前任务相关的分时整合任务是否完成。如果以上任务都执行完,会执行一起在主线程独占状态下的资源整合。
ApplicationLoadLevelAsyncIntegrate 在加载场景时(首次加载,普通加载或者叠加加载)会出现该tag。对于普通加载场景,引擎首先会卸载场景(参见UnloadScene)然后加载新的场景。而叠加加载则会直接加载并激活目标场景中的Objects
CanvasSplitInstructionsJob 遍历分配到此Job中的instructions及其subSet,将其逐一转换为Renderable的数据格式,并统计可渲染的的instructions的vertex数量等信息
CanvasCombineInstructionsJob 将SplitInstructionsJob的处理结果进行合并,统计这些job计算出的vertexCount之和、bounds等信息,并按照最终结果,为生成Renderable的数据列表元素指定renderDepth
CanvasSortJob 根据分配到此Job的Instructions的Bounds大小计算一个合适的gridSize值(此值在后续计算中用来将每个Instruction划分为若干区域,并计算出这些区域的depth的最大值),然后执行“Canvas.Sort”(根据Instructions之间的重叠情况、z值、所属canvas、material、texture等因素,进行排序,以达到最优的渲染效率)
CanvasPrepareBatchesJob 执行“Canvas.PrepareBatches”(遍历分配到此job中的renderable instructions,将其按照canvas或material的异同划分batch,并将每个batch中的节点根据clipRect、textureID、alpha等因素的不同,划分为若干个SubBatch,同时统计每个SubBatch渲染所需的shaderProperty、vertex、indices等信息)
CanvasGeometryJob 将“Canvas.PrepareBatchesJob”计算出的SubBatch渲染所需的shaderProperty、vertex、indices、alpha等信息,通过位运算与矩阵运算,转化为更底层的渲染可用的数据格式
CanvasPrepareBatches 遍历一段已排序的 renderable instruction,将其按照canvas或material的异同划分batch,并将每个batch中的节点根据clipRect、textureID、alpha等因素的不同,划分为若干个SubBatch,同时统计每个SubBatch渲染所需的shaderProperty、vertex、indices等信息
Layout 先后遍历LayoutQueue队列(包含标记为dirty的ScrollRect、Scrollbar等)和GraphicQueue队列(包含标记为dirty的Graphic、InputField等),首先过滤掉其中的无效元素(null或IsDestroyed),然后调用剩余的有效元素的Rebuild接口,更新元素自身的Geometry数据与Mesh数据,完成之后,清空队列。其中在遍历完LayoutQueue之后会进行Cull操作。
CanvasRenderOverlays 等待Batch数据的生成,并在渲染命令队列中加入几何处理的命令;遍历batches数组,若此batch有关联的canvas,则调用该canvas的RenderOverlays,否则就直接渲染此batch;若batches数组为空,则遍历关联canvas数组,调用每个关联canvas的RenderOverlays
CanvasBuildBatch 将此Canvas下的所有有效的CanvasRenderer节点,根据其渲染顺序,以及material、z值、子Canvas等因素,进行合批(batch),并统计每个batch渲染所需的vertex、indices、shaderProperties等数据,将其转化为更适合底层渲染使用的数据格式,完成之后将canvas的meshBounds标记为dirty
CanvasRendererSyncTransform 获取此transform的localToWorld所需的转换矩阵,通过矩阵乘法,将原transform转换成parent canvas坐标下的transform,将新计算出的transform赋值给目标canvas中对应的数据节点
CanvasRendererSyncWorldRect 根据canvasRender自身的localBounds、transform,计算出worldBounds,继而计算出globalRect,然后将数据同步到parent canvas的数据中,并标记worldBounds中的z值是否与canvas一致
CanvasRendererSyncClipRect 将canvasRender自身的enableClip标志位以及clipRect数据同步到parent canvas的数据中
CanvasSort 将传入的Instructions按照其互相之间的重叠情况(根据gridSize对把Instruction划分为若干区域,计算出这些区域中depth的最大值)、z值、所属canvas、material、texture等因素,进行排序,以达到最优的渲染效率
CanvasRenderSubBatch 若此subBatch有shaderProperties数据则先设置GfxDevice的shaderProperties,然后将此subBatch在总batch中对应的vertexBuffer数据段和indexBuffer数据段,传输给GfxDevice进行渲染
UGUIRenderingRenderOverlays 遍历CanvasManager中的所有canvas,若canvas的targetDisplay与当前displayIndex相匹配,且其renderMode为ScreenSpaceOverlay,则执行Canvas.RenderOverlays
UGUIRenderingEmitScreenSpaceCamerasGeometryForCamera 处理WorldSpace和ScreenSpaceCamera模式的canvas:首先为shaderProperties设置ztest属性,然后遍历CanvasManager中的canvas列表,若canvas为worldSpace模式,或canvas为ScreenSpaceCamera模式且canvas的目标camera是参数传入的camera,则调用canvas的EmitWorldGeometry函数(此函数会遍历canvas的batches,若有此batch有关联canvas则调用canvas的EmitWorldGeometry(),否则直接为此batch以及其subBatch生成渲染数据并加入要渲染到的camera的render队列中,如果batches中没有数据,则直接调用关联canvas列表的EmitWorldGeometry函数)
UGUIRenderingEmitWorldScreenspaceCameraGeometry 处理特定状态的WorldSpace和ScreenSpaceCamera模式的canvas:首先为shaderProperties设置ztest属性,然后遍历CanvasManager中的canvas列表,若canvas为WorldSpace或ScreenSpaceCamera模式模式,则遍历camera列表,判断camera的onScreen/offScreen状态、displayId等是否与参数一致,若满足条件则以此camera为参数,调用canvas的EmitWorldGeometry函数(此函数会遍历canvas的batches,若有此batch有关联canvas则调用canvas的EmitWorldGeometry(),否则直接为此batch以及其subBatch生成渲染数据并加入要渲染到的camera的render队列中,如果batches中没有数据,则直接调用关联canvas列表的EmitWorldGeometry函数)
UGUIRenderingUpdateBatches 首先触发willRenderCanvases回调,之后遍历CanvasManager中的canvas列表,更新每个canvas的rectTransform、alpha等信息,然后重新统计并排序此canvas下的CanvasRenderer控件的渲染信息,若更新完数据之后发现canvas处于dirty状态,则执行Canvas.BuildBatch,计算渲染数据。
AlbedoRendererRenderObjects 根据albedo或者emissive设置参数,然后先进行一次渲染,再进行一次线框式的渲染。
AlbedoRendererRenderAlbedo 渲染对象的albedo部分。调用了gAlbedoRendererRenderObjects和gDilateAndDownsample来进行具体操作。
AlbedoRendererRenderEmissive 渲染对象的emissive部分。调用了gAlbedoRendererRenderObjects和gDilateAndDownsample来进行具体操作。
DilateAndDownsample 对图像进行dilation和下采样的具体计算。
EnlightenRuntimeManagerFastUpdateEmissive 获得需要进行关于emissive部分的fastupfate的对象,然后调用相应函数,设置材质为dynamic、更新颜色,并在成功以后tag相应的guid。
EnlightenRuntimeManagerUpdateMaterialsForSystem 调用gEnlightenRuntimeManagerUpdateAlbedo来渲染,并在成功以后tag相应的guid。
EnlightenRuntimeManagerUpdateAlbedo 从EnlightenRuntimeManager获得albedo、chart mask、图像宽度高度等数据,将这些内容和dilation宽度、被分配的空间传入gAlbedoRendererRenderAlbedo以及gAlbedoRendererRenderEmissive进行下一步操作,然后将结果设置入buffer。
Physics2DEffectorFixedUpdate 遍历需要更新的effector,若有需要更新的contact则传入timeDelta进行计算。
Physics2DJointBreakLimits 遍历joint,若反作用的力或者力矩超过了断裂的临界值,则销毁该joint。
Physics2DCompositeColliderPrepareShapes 如果path是dirty状态,则将新的collider的path重新计算得到composite的path,然后再换算得到polygon的path。然后根据几何类型选择调用gPhysics2DProfileCompositeColliderPrepareShapesOutline或gPhysics2DProfileCompositeColliderPrepareShapesPolygon。
Physics2DCompositeColliderPrepareShapesOutline 将传入的path换算成outline。
Physics2DCompositeColliderPrepareShapesDecomposition 若有物理场景,则开始计算:将传入的path进行tessellation。
Physics2DCompositeColliderAddToComposite 将collider加入到composite(若composite已有同一地址的collider则清除该collider的path),将shape计算得到的path传入collider,然后将相应dirty置为true;如果组合过程(compositing)未停止,则重新生成collider。
Physics2DCompositeColliderRemoveFromComposite 将collider删除出composite(若composite没有同一地址的collider则直接返回即可);如果组合过程(compositing)未停止,则重新生成collider。
Physics2DRigidbody2DLayerChanged 唤醒body。
Physics2DRigidbody2DRecalculateContacts 对每个满足条件的(enabled,拥有shape,不是应用于effector)collider调用gPhysics2DProfileColliderRecalculateContacts,另外如果该body为static则唤醒其collider的contact。
Physics2DCapsuleColliderPrepareShapes 将长宽和坐标换算为capsule的两个半圆圆心和半径,然后赋值在shape上,并添加该shape。
Physics2DCreateShapes 先检查是否有需要忽略的rigidbody(若有则更新composite);然后对于composite的情况,若能准备path或者shape,则将之加入composite;对于非composite的情况,若能准备shape,则创建fixture。
Physics2DColliderTransformParentChanged 如果是composite的情况,则在获得更新composite属性之前,将collider从composite中删除;如果body已被修改,则重新生成collider。
Physics2DColliderLayerChanged 仅调用gPhysics2DProfileColliderRecalculateContacts。
Physics2DColliderRecalculateContacts 对每个fixture进行contact的标记以用于过滤,然后唤醒从第一个shape获取的body,并重置它的contact的friction和restitution属性。
Physics2DPolygonColliderPrepareShapes 检查collider是否是激活状态,获得的多边形是否非空,path是否非空,然后调用gPhysics2DProfilePolygonColliderPrepareShapesDecomposition。
TilemapRendererCameraBoundsJob 计算tilemap的某一个区域在camera视锥范围内的边界值:遍历区域中所有的chunk,计算出每个chunk的世界坐标,对比获得在视锥体范围内的chunks的最小坐标的和最大坐标,作为当前区域的min边界和max边界
TilemapRendererBuildChunkJob 遍历上一步计算出的根据textureID分批后的数据,计算此批次相应的mesh、vertex以及sprite的引用等信息,并遍历此批次中所有tile,为其计算sprite、color、channelmask等信息
TilemapRendererDispatchJob 按tilemap的SortOrder指定的顺序,遍历当前区域块内的chunk,计算渲染此chunk需要的sprite、transform、color等信息,并根据texture的id动态合批,计算结果供下一渲染计算步骤使用
TilemapRendererGeometryJob 根据分配给此job的chunk信息,计算出渲染此chunk所需的另外的shader channels、顶点转换所需的flags和params,然后进行vertex转换和index转换,以得到GFX渲染所需数据存储到vertexBuffer和indexBuffer中
TilemapRendererRender 遍历待渲染的渲染节点,将节点的custom shader properties同步到GFX中,然后将渲染节点中的chunks根据texture进行合批渲染,其中若前一节点的最后一个job与后一节点之间的当前job的mask interaction字段值相匹配,也进行合批渲染
TilemapRendererIndividualJob 按SortOrder指定的顺序,遍历分配到此job下的chunks的所有tile节点,为每一个有sprite的tile计算其相应的渲染信息,包括material、color、position、shader properties等,存储到相应的渲染节点
TilemapRendererScheduleIndividual 遍历tilemap中的所有chunk,为有sprite的tile生成渲染节点,并分发job,为这些渲染节点,计算ndividual模式渲染所需数据
TilemapRendererCalculateChunkCullingBounds 遍历此tilemap引用到的所有sprites,选出所有sprite超出单元格的最大尺寸(以unit为单位),并将此尺寸作为此tilemap的单元裁剪边界(chunkcullingbounds)
TilemapRendererCameraBoundsCheck 计算整个tilemap在camera视锥范围内的边界值:首先从camera视锥体的cullingMatrix中提取出 left/right/bottom/top/near/far 6个面,然后把tilemap中所有的chunk,分为若干block,异步遍历每个block下的chunks,得到每个block的min和max的边界,最后得出所有blocks的合并后的边界值。
TilemapRendererPrepareChunkMode Chunk模式下:按sortOrder指定的顺序,遍历此tilemap范围内的坐标值,统计每个坐标中tile引用到的渲染所需数据,同时更新渲染数据的引用计数,以实现合批渲染
TilemapRendererPrepareIndividualMode Individual模式下:若tilemap非空,则触发TilemapRenderer.ScheduleIndividual操作,准备Individual模式所需的渲染数据
TilemapRendererClearChunks 清除超出渲染界限的长久未渲染过的chunk:首先将此tilemap中的所有chunk按照上一次渲染帧的大小排序,若当前tilemap的chunk数量超过了视野范围内可容纳数量或系统默认的最大chunk数,则将超出部分的chunk中,上一次渲染帧与当前渲染帧的差值超过系统指定限度的chunk移除
TilemapRendererCheckDirtyChunks 检查此Tilemap是否发生了变化: 检查此tilemap的材质是否发生变化,若材质未发生变化,则逐个检查 bounding view 范围内的 chunk 是否发生了变化(有新chunk,或老的chunk已dirty)
TilemapRendererDistributeJobs 遍历tilemap的bounding view范围内的所有chunk,若chunk尚未被渲染或chunk已dirty,则将有所需要重新渲染的chunks统计下来,分批异步计算其渲染所需数据
TilemapUpdate 如果是第一次Update,则将此tilemap中的所有tile重新创建,并触发tile上的MonoBehavior中的StartUp方法。若有待更新的cameraView,则触发Tilemap.UpdateTileAnimation,更新animatedTiles。
TilemapUpdateTileAnimation 若当前处于playing状态,AnimationFrameRate大于0,且时间发生了变化,则针对每个需要更新的cameraView,遍历view范围内的animatedTile,检查该tile是否需要更新sprite(looping、speed、lastUpdateTime等条件是否满足),若满足条件,则更新animatedTile的sprite。
EarlyUpdateUpdateCanvasRectTransform 在每次EarlyUpdate中,遍历CanvasManager中的所有canvas分别更新每个canvas的rectTransform属性。若canvas的renderMode为ScreenSpace并且没有parentCanvas,则根据此canvas的renderMode、parentCanvas、position.z等因素,更新rectTransform的anchor、pivot、position、screenSize、scale等值,若这些值发生变化,则加入任务队列等待渲染。若canvas的renderMode为worldSpace或有parentCanvas则无需重新计算rectTransform。
PostLateUpdateUpdateCanvasRectTransform 在每次PostLateUpdate中,遍历CanvasManager中的所有canvas分别更新每个canvas的rectTransform属性。若canvas的renderMode为ScreenSpace并且没有parentCanvas,则根据此canvas的renderMode、parentCanvas、position.z等因素,更新rectTransform的anchor、pivot、position、screenSize、scale等值,若这些值发生变化,则加入任务队列等待渲染。若canvas的renderMode为worldSpace或有parentCanvas则无需重新计算rectTransform。
PhysicsRaycast 有两个方法:raycasttest及raycast,分别根据不同的flag和filter来计算raycast的结果。
PhysicsRaycastAll 若AutoSyncTransforms为真,则先调用gPhysicsSyncRigidbodies和gPhysicsSyncColliders;然后计算raycast并返回一个数组的结果。
EnlightenRuntimeManagerAddCustomLights 将RuntimeEnlightenManager中存储的LightData数据清除,遍历参数传入的自定义light数组,若光源的BounceIntensity非0,则将光源数据转化后,存入RuntimeEnlightenManager的光源数据表中。
EnlightenRuntimeManagerRemoveCustomLights 将RuntimeEnlightenManager中存储的LightData数据清除。
EnlightenRuntimeManagerUpdateLightsEnqueue 将SharedLightData类型光源数据转换为EnlightenLightData类型数据,以供后续使用。
ShadowsCullShadowCastersDirectional 将此job内的sceneNode,根据是否在plane范围内、是否被遮挡、是否在light的layerCullDistance内等因素,进行筛选和剔除,并记录后续计算所需数据。
ShadowsCullShadowCastersDirectionalDetail 根据light在每个layer中的cullDistance值,以及光源的cullingPlane与sphere数据,筛选可见的sceneNode,并转换shadowCasterBound的数据结构。
ShadowsCullShadowCastersLocal 先跟进根据light的cullingPlane等因素对renderer node进行剔除,然后针对具体光源的特征(point / spot),使用不同计算方法,对传入的scene node数组进行剔除。
ShadowsCullShadowCastersLocalDetail 根据light type(point / spot)的不同,使用不同计算方法,对传入的scene node数组进行剔除。
ShadowsCullLocalLightShadowCasters 遍历传入的的shadowedLight,计算每个light的cullingPlane,再将每个renderer list,针对当前光源的特性,计算出受光源影响的renderer,存入相应数组中,并对最终数据做相应的合并与处理。
ShadowsPrepareUmbraShadowCullerBuffers 把非static的renderer的index和bounds数据统计到传入的两个数组中.
ShadowsCreateUmbraShadowCuller 将之前统计到的可见的物体的bounds统计到数组中,然后用umbra生成出一个ShadowCuller,供后续使用。
ShadowsCullDirectionalShadowCasters 遍历所有有效直线光,根据光源的特性和属性值,对rendererList进行剔除(lights的边界plane、遮挡、shadowType、distance等因素),并在过程中统计后续所需的数据(nodeIndex、bounds等数据)。
ShadowsCullShadowCastersDirectionalUmbra 将分配到此job的cullingData进行处理,根据是否为staticRenderer,使用不同的算法计算出未被遮挡的casterList,然后遍历sceneNode数组,将有效的sceneNode也加入casterList。
ShadowsCullShadowCastersWithoutUmbra 将分配到此job的cullingData进行处理,遍历jobData中的sceneNode,将在plane范围内的node统计出来。
ShadowsGenerateCombinedDynamicVisibleList 若使用umbra occlusion culling,则执行“Shadows.PrepareUmbraShadowCullerBuffers”,即把非static的renderer的index和bounds数据统计到传入的两个数组中 。
ShadowsCombineLocalShadowCasterCullignIndexListsAndDestroy 将renderer list分配的每个job计算出的shadow caster的bounds合并,然后把之前的job计算的数据合并到同一个数组中,释放临时数据。
ShadowsCombineLocalShadowCasterBoundsAndDestroyJob 将前面计算出的shadowCaster的bounds信息转化成合适的数据结构,以供后续使用。
FrustumAndOcculusionCullLocalLights 将分配到此job的非直线光源,分别做视锥剔除计算、和遮挡剔除计算,筛选出经过两种过滤之后仍可见的光源,记录其数据。
FrustumAndOcculusionCullLocalLightsCombine 将各job根据计算整理出的光源数组合并(visibleLight、offScreenLight、fadeLight等)。
OcclusionAndConnectivityCullLight 遍历分配到此job的有效光源,用umbra计算光源的被遮挡情况,并根据其Shadow是否为Full Strength 记录到不同数组中;然后用umbra计算出visible的SphereLight,并记录到数组中。
CullLightFrustumLocal 遍历分配到此job的光源,若光源在视锥(Frustum)范围内(或在范围外但距离足以造成影响),则为其中的spot和point类型的光源计算其屏幕空间范围;否则若光源距离在衰减范围内,则记录此光源以及其衰减距离。
FindActiveLights 遍历LightManager中的所有light,过滤掉与scene、camera的cullingMask不匹配的、intensity小于0的、非realtime、range区域可忽略不计的光源。将剩余的有效光源,根据lightType分别记录下光源数据(position、radius、shadow等信息)。
AddDirectionalLights 根据Important、Intensity、GreyScale、ShadowType等因素筛选出最亮的直线光(Directional Light)作为,mainLight,并在其他有效直线光中统计出has shadow的光源,在以上过程中记录下所有有效直线光源的详细数据。
AddActiveLocalLights 统计符合条件的localLights和customLights的信息到activeLights数组中,并按照visible、off-screen、lightType等因素排序。
AddCustomActiveLocalLights 统计特殊component(如ParticleSystem等)中的自定义光源,若其中有spot或point类型光源,则统计到待用数据中。
CullQueryPortalVisibilityUmbra 根据Umbra算法,判断当前job下的可见物体是否在camera视锥之外。
CullQueryPortalVisibilityCombineJob 若所有job均未检测出视锥外可见物,则标记为可使用UmbraOcclusionCulling,并且合并所有job的数据。
CullSceneDynamicObjects 首先对当前job需要处理的node数组,根据layer、sceneMask、enable等因素进行筛选,将无效的node剔除。若可以使用Umbra Culling,则根据occlusionBuffer遮挡情况进行剔除;否则判断是否在cullingPlane范围内进行剔除。将以上结果再根据farPlane等因素进行进一步剔除。
CullSceneDynamicObjectsCombineJob 如果此job是处理static occlusion的,并且使用Umbra Culling,则只需将数组中的因为layer、sceneMask、enable、farPlane等因素而不可见的node剔除。否则,则将每个job的计算结果整合到同一个数组中。
Drawing 将针对此camera的cullResult按照合适的渲染流程进行渲染。
DrawingMultiCustomPre 初始化RenderLoopContext;若当前环境支持SinglePassStereo且开启了SinglePassStereo模式,则初始化gfxDevice的stereo相关数据;对cameraStack的当前状态进行处理。
DrawingMultiCustom 将待渲染的数据分类整理到Opaque和AfterOpaque队列,然后按照forward或deferred渲染流程逐步渲染,最后对skybox、motionVector、halo等效果进行渲染。
DrawingMultiCustomPost 触发PostRender回调,渲染Overlay的物体,回置环境变量。
UpdateDepthTexture 将renderNode队列中物体的深度数据,按照一定的shader环境,渲染到depthTexture中。
UpdateDepthNormalsTexture 将renderNode队列中物体的深度和法线数据,按照一定的shader环境,渲染到一张RenderTexture中。
PrepareSceneCullingParameters 对SceneCullingParameters内容赋值,并对其中待计算的数据结构申请空间;更新LODGroupManager的数据,然后对CullResults的lodDataArray赋值。
FrustumCullReflectionProbesJob 遍历此job下的reflection probe的cube信息,根据cullingPlane,统计出视锥范围内的reflection probe。
CameraImageEffects 1. 根据所有的filter把sourceRT拷贝到destRT 2. 执行filter中的renderFunc回调
GraphicsBlit 用指定的shader把Texture拷贝到RenderTexture中。
CameraRenderSkybox 根据skybox的类型,分不同数量的pass对skybox的面进行渲染。
HaloRender 筛选出可见范围内的Halo,分发job生成Halo渲染数据,之后调用device接口进行渲染。
HaloGeometryJob 遍历当前job的Halo数组,根据Halo的size、depth、color等信息生成渲染数据。
SceneCulling 对场景中的有效的renderer、lihgts、reflection probe 做“视锥剔除”和“遮挡剔除”,剔除完毕后,调用注册过的 globalCallback 和 renderer 的 callback 。
CullAllVisibleLights 筛选出scene中在camera视锥范围下的有效光源,并根据lights的类型与属性数据,按照优先级先后顺序,计算出cast shadow的光源,以及其光照下的shadow casters数据,并按照一定规则对数据进行整理排序。
CullAllVisibleReflectionProbes 筛选出scene中的probe,根据probe是否在视锥范围内,记录它的visible状态、bounds信息等。
PrepareSceneNodes 将cullResult中得到的各个类型的rendererList,分发到各个job处理,统计出其中需要callback的renderer,并放到cullResult的不同功能的callback数组中。
PrepareSceneNodesSetUp 若此job中的rendererList为空,则不创建任何subJob;否则,将cullResult中的indexList、sceneNode数据对传入此job的参数数据中,然后分为合适数量的subJob进行处理(统计其中需要callback的node)。
PrepareSceneNodesJob 遍历此job负责处理的数组段,统计其中需要callback且jobdata的callback数组中有其所需的callback的node,将符合要求的node的index统计到数组中。
SceneNodesInitJob 根据其rendererList类型,为处理该list的job指定其负责的数据在数组中的start位置,并为jobdata中的callback数组指定相关的回调。
PrepareSceneNodesCombineJob 遍历统计到的node index数组,统计node对应的renderer,放到cullResult的不同功能的callback数组中。
FindDirectionalShadowCastingLights 将统计到的有效的直线光,根据是否在prePass中可见、是否在需要计算阴影的空间内、shadowType等因素,判断每个light是否会投射阴影,并标记。
FindLocalShadowCastingLights 遍历上一步筛选出的localLights和customLights,筛选出其中castShadow的light。
FindShadowCastingLights 对传入的light数组,根据是否在prePass中可见、是否在需要计算阴影的空间内、shadowType等因素,判断每个light是否会投射阴影,并标记。
CullSendEvents culling结束后,调用global 的 callback;然后调用renderer注册的callback;最后执行renderer的update
AddLocalLights 统计localLights和customLights中的有效、并cast shadow的lights,计算出每个lights照射范围内的shadow caster数据。
AddReflectionProbes 把所有active的probe统计到一个数组中,并根据之前的剔除结果,标记每个probe的visible情况、bounds信息等。
ShadowsCullShadowCastersDetailPoint 遍历传入的sceneNode,根据point light的半径和node的bound等信息,计算出point light影响范围内的node。
ShadowsCullShadowCastersDetailSpot 遍历传入的sceneNode,根据spot light的光锥空间和node的bound信息,计算出spot light影响范围内的node。
CullDynamicObjectsWithUmbra 遍历传入的的bounds数组,将其中被occlusionBuffer遮挡的元素剔除掉。
CullObjectsWithoutUmbra 根据已有的cullingPlanes准备合适数量的一个plane数组,遍历传入的待处理bounds数组,将不在plane范围内的部分剔除。
CullingGroupSendEvents 遍历CullingGroups,若其targetCamera与参数中一致,则先向所有state变化了的visible的node发送事件,然后向state变化了的Invisible的node发送事件。
RenderDeferredSort 对deferredRenderPath需要处理的RenderObject队列按照一定规则进行排序。
RenderDeferredGBuffer 1. 根据情况创建相应数量的GBuffer,并将其传送给gfxDevice。 2. 遍历所有RenderObjectData,根据其携带的shader的各个pass设置渲染环境以及参数。
RenderDeferredLighting 将GBuffer中对应的发现RT设置到shaderProperties中,然后先后对activeLight和mainLight进行渲染。
RenderDeferredLight 根据光源类型和信息,设置shader pass context,然后逐步生成光源的geometry数据进行渲染。
RenderDeferredFinalPass 将光照信息合并到当前main RenderTexture上,触发renderEvent回调。
RenderDeferredForwardObjectsToDepth 把需要前向渲染的objects渲染信息写入depthPass中。
RenderDeferredCombineDepthNormals 将depth信息合并入normal信息的RenderTexture中。
RenderDeferredReflections 准备渲染ReflectionProbe需要的环境,并把所有的probe信息以quad或mesh的形式进行渲染。
RenderDeferredDefaultReflection 根据默认的reflection环境,设置device的DepthState和StencilState,将camera的nearPlane根据reflection的转换矩阵渲染到device上。
RenderDeferredReflProbeQuad 关闭裁剪,将ReflectionProbe生成的vertex渲染到camera的nearPlane对应的quad上。
RenderDeferredReflectionsToEmissive 将Reflection生成的RenderTexture渲染到Emissive的RenderTexture。
RenderPrepare 为RenderNode队列中的node下的material生成RenderObjectData,按不同条件放入opaque和afterOpaque。
RenderOpaqueGeometry 根据当前的renderPath(prePass、deferredPath、forwardPath等),对OpaqueObjects执行不同的RenderLoop。
RenderTransparentGeometry 将需要在transparent批进行渲染的物体送诸渲染,更新camera的depthTexture。
RenderMotionVectors 若camera的depthTextureMode需要,且当前环境支持MotionVector,则筛选出需要渲染的motionVector数据的RenderObject,按相应流程进行渲染。
RenderDeferredForwardObjectsIntoDepth 将需要ForwardRender的objects的深度信息渲染到depthRT中。
RenderDeferredForwardObjectsIntoDepthNormals 利用特定的shader,将需要ForwardRender的objects的depth和normal信息渲染入特定的RT中。
MotionVectorSort 对筛选出的有MotionVector的RenderObject队列进行排序。
MotionVectorRender 将统计出的motionVector列表分发到合适数量的job进行渲染。
MotionVectorRenderJob 遍历此job负责的存有motionVector数据的 renderPass 列表,分别对每个pass进行渲染。
RenderPrePassSort 对prePass需要处理的RenderObject队列按照一定规则进行排序。
RenderPrePassGeometryPass 将带有效shader的待渲染对象,逐一遍历其shader的pass,按照一定规则,合批渲染。
RenderPrePassLighting 先后渲染activeLights和mainLight,并在渲染之前与之后分别触发BeforeLighting / AfterLighting的callback。
RenderPrePassLight 根据光源数据,设置shaderPass、lightMaterial、deviceParams等数值,然后将光源的mesh进行渲染。
RenderPrePassFinalPass 遍历所有RenderObject,将其shaderPass经过处理之后加入batchRenderer的pass队列中,并在之前与之后触发BeforeFinalPass / AfterFinalPass 的 callback。
RenderPrePassForwardObjectsToDepth 遍历forwardRenderedObjects,筛选出其中forwardRender并且receiveShadow的Objects,将这些物体的depth信息渲染到一张renderTexture上。
RenderPrePassCombineDepthNormals 利用combineShader,将depth和normal合并到一张RenderTexture,并设置到当前passContext环境中。
RenderDeferredCopyDepth 将当前device的渲染结果中的depth信息拆分到一张RenderTexture中。
RenderForwardOpaquePrepare 遍历所有Opaque的RenderObject,统计它的渲染方式(逐顶点/逐像素)、数据(shader/lights/shadow),然后遍历shader中的所有pass,生成ForwardRenderPassData,加入到renderLoop的pass队列中。
RenderForwardOpaqueSort 对renderLoop中的opaqueObj生成的pass队列排序。
RenderForwardOpaqueCollectShadows 根据ShadowCachingData和LightData设置shaderProperties等环境,然后生成一张屏幕空间的shadowMap。
RenderForwardOpaqueRender 设置渲染opaque物体所需环境,然后分job渲染各个pass以及其对应的projector队列。
RenderForwardAlphaPrepare 遍历所有Transparent的RenderObject,统计它的渲染方式(逐顶点/逐像素)、数据(shader/lights/shadow),然后遍历shader中的所有pass,生成ForwardRenderPassData,加入到renderLoop的pass队列中。
RenderForwardAlphaSort 对renderLoop中的transparentObj生成的pass队列排序。
RenderForwardAlphaRender 设置渲染aplha物体所需环境,然后分job渲染各个pass以及其对应的projector队列。
RenderForwardRenderLoopJob 遍历job下的renderPass,首先渲染pass对应的projector队列,然后根据pass类型,配饰shader环境,进行渲染。
RenderForwardAssignProjectorQueuesJob 为当前job分配的renderPass指定projector范围。
PrepareUpdateRendererBoundingVolumes 调用RendererUpdateManager中注册过prepareDispatchUpdateFunc回调的函数,获得后续所需的BoundsJobData,并做相应数据补充。
UpdateRendererBoundingVolumes 用RendererUpdateManager中注册过transformChangeFunc的函数生成job,回调用将各自的transform信息生成Bounds数据存入jobData。
FinalizeUpdateRendererBoundingVolumes 调用RendererUpdateManager中注册过finalizeUpdateFunc回调的函数,处理上一步获得的BoundsJobData。
TextureAwakeFromLoad 根据texture的settingData,计算出GPU渲染所需的texture数据,并根据情况,将texture scale至power of two之后上传GPU,或按照original size,上传GPU。
Physics2DDestroyShapes 删除collider,即删除fixture、重置参数、从该collider相关联的composite中移除。另外根据传入的bool来确定操作:若collider需要重新生成则将之标记给contact,否则将contact同时删除。
Physics2DPolygonColliderPrepareShapes 检查collider是否是激活状态,获得的多边形是否非空,path是否非空,然后调用gPhysics2DProfilePolygonColliderPrepareShapesDecomposition。
Physics2DPolygonColliderPrepareCompositePaths 检查collider是否是激活状态,collider是否非空,path是否非空。将path转换为composite。在此之前,若sprite renderer处于tiled的绘制模式,则先调用gPrepareTilingSegment,获得“九宫格”信息,然后计算tile的数据变化,调用gGenerateTilingArea生成结果。
Physics2DPolygonColliderPrepareShapesDecomposition 将传入的polygon path进行tessellation。在此之前,若sprite renderer处于tiled的绘制模式,则先调用gPrepareTilingSegment,获得“九宫格”信息,然后计算tile的数据变化,调用gGenerateTilingArea生成结果,最后将结果转换为composite再转换为polygon。
Physics2DBoxColliderPrepareShapes 检查collider是否是激活状态,根据长宽和坐标换算为box的4个点,检验这4个点是否有效,然后赋值在shape上,并添加该shape。
Physics2DEdgeColliderPrepareShapes 检查collider是否是激活状态,将距离小于最低要求的点合并,检查剩余节点数是否不少于2个,然后赋值在shape上,并添加该shape。
Physics2DCircleColliderPrepareShapes 检查collider是否是激活状态,计算圆心和半径,然后赋值在shape上,并添加该shape。
TerrainUpdateTreeBillboardTexture2 若camera的角度变化超过一定值或等待的帧数超过一定值,若当前平台为WIN/OSX/LINUX,则先后将albedoShader和normalShader设置到treeData的prototype的material中进行渲染,否则,只对material当前pass的mesh进行常规渲染。
TerrainFlushDirty 根据当前terrain的dirtyFlag,判断terrain发生变化的属性有哪些(trees、heightMap等属性),并分别针对各个属性的变化对terrain数据进行reload。
TerrainHeightmapRenderStep1 递归遍历terrainRenderer中的划分的节点,根据节点到camera到距离等因素,标记节点的可见性等信息。
TerrainHeightmapRenderStep2 递归遍历terrainRenderer中的划分的节点,根据节点之间想相邻关系/父子关系,进一步优化划分节点的visible状态(self visible 、some children visible)。
TerrainHeightmapRenderStep3 递归遍历terrainRenderer中的划分的节点,根据每个节点的visible状态,生成相应的mesh或删除不需要的mesh;根据以上结果,创建为需要渲染的node创建renderer。
TerrainDetailsRender 为DetailRenderer下的prototypes生成一个atlasTexture上传GPU;对terrian划分的patches做视锥剔除、深度剔除,为筛选出的可见的patch生成IntermediateRenderer,加入管理器中。
TerrainTreesRender 根据烘焙数据更新terrain中树节点的probe的enable状态;根据需要,重新统计或刷新treeRenderer的渲染信息;按照由远及近,分别对远处的树合批渲染,近处的树按照billboard或fullTree的形式单独渲染。
TerrainTreesOnWillRender 在play状态下,遍历裁剪结果中的可见的treeNode,若treeRendererVisiblility位图中未标可见,则更新位图状态,并更新此treeNode中的renderer的wind(风)数据。
QuadTreeNodeRender 根据RenderNode的renderingData,生成GfxDevice可使用的渲染数据,然后执行Draw操作。
TerrainRecomputeInvalidPatches 遍历筛选出的patch,重新计算此patch采样高度最大误差,以及此patch范围内高度的min/max值。
TerrainUpdateHeightmapTexture 把HeightMap的高度信息,写入一张指定格式的纹理中,然后把纹理数据写入HeightMap的RenderTexture。
QuadTreeBatchNodeRender 首先将此RenderNode的shader properties,设置到GfxDevice当前环境;然后遍历node中的batch数组,将数据push入待渲染队列,当队列中instance数量达到max值,则提交渲染,如此循环直至数组末端。
TerrainUpdateMaterials 若terrain的shader或material发生变化,则根据当前的terrainData,重新生成splat material,并更新其他渲染相关数据。
TerrainUpdateTreeBillboardTexture 若camera的角度变化超过一定值或等待的帧数超过一定值,则遍历treeData中的所有prototype的material,并对material的当前pass数据进行渲染。
Physics2DPrepareTilingSegment 传入“九宫格”的位置信息,并以path中的节点根据其位置所在的区间分别填入数据;若path中的两个节点不在同一区间,则需要计算它们的连接线段与区间分界线的交点,并将交点填入。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容