用途
在Unity Profile 的 CPU Usage 里可以看到各种 Unity 函数的耗时。如下图:
下面的表格便是日常整理的一些 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中的两个节点不在同一区间,则需要计算它们的连接线段与区间分界线的交点,并将交点填入。 |