Unity Profile內(nèi)各項(xiàng)參數(shù)釋義

用途

在Unity Profile 的 CPU Usage 里可以看到各種 Unity 函數(shù)的耗時(shí)。如下圖:


image.png

下面的表格便是日常整理的一些 Unity函數(shù)的釋義。供大家參考查閱~

Profile 參數(shù)表

Profile 函數(shù) 釋義
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 根據(jù)向所有GameObject廣播當(dāng)前app是否處于Pause狀態(tài)和焦點(diǎn)狀態(tài)(得到或失去焦點(diǎn))
DevicePresent The time of buffer exchange through eglSwapBuffers to render the picture.
WaitForTargetFPS 在手機(jī)平臺(tái)上,只有在Quality Settings中的V Sync Count選擇Don't Sync或者Every Second V Blank時(shí)出現(xiàn)。對(duì)于Don't Sync,tag出現(xiàn)表示cpu正在根據(jù)設(shè)定的幀率消耗掉額外的時(shí)間。對(duì)于Every Second V Blank 引擎會(huì)根據(jù)設(shè)備刷新率確定需要等待的時(shí)間。
LoadingUpdatePreloading 在異步加載/卸載場(chǎng)景,異步加載AssetBundle,加載AssetBundle中的Asset,加載Resource文件夾中資源,調(diào)用UnloadUnusedAssets時(shí)會(huì)產(chǎn)生這個(gè)tag.如果加載操作要求等待完成,則會(huì)在子tag中看到AsyncOperationComplete, 否則在子tag中會(huì)看到IntegrateAssetsInBackground
UnloadScene 首先會(huì)收集場(chǎng)景中所有的需要銷毀的gameobject(參見CollectSceneGameObjects),然后遍歷銷毀所有Gameobject(參見DestroyProfile),之后銷毀Scene本身及相關(guān)的管理類
CreateGpuProgram 根據(jù)不同的平臺(tái)對(duì)shader源文件進(jìn)行編譯。如果shader之前已經(jīng)cache,則只需要對(duì)cache的shader進(jìn)行加載。此項(xiàng)數(shù)據(jù)突出,則需要檢查是否有大量的shader或者shader變體在同一幀被加載編譯。
ApplicationPreloadAssets 引擎在加載Asset,會(huì)根據(jù)Asset的不同而執(zhí)行不同的操作
ApplicationIntegrateAssetsinBackground 根據(jù)加載線程的優(yōu)先級(jí)取得可用時(shí)間片,在時(shí)間片耗盡前,嘗試最多次的加載資源。每次加載資源會(huì)產(chǎn)生一次kPreloadSingleStep tag。Unity Preloading的線程可用時(shí)間片每次為4ms
PreloadSingleStep 每次執(zhí)行時(shí),先確保preload manager線程已經(jīng)啟動(dòng),然后嘗試向顯卡異步傳輸數(shù)據(jù)(WEBGL平臺(tái)不支持這一特性)。異步上傳的時(shí)間片和buffer大小默認(rèn)分別為2ms和4MB的循環(huán)緩沖區(qū)。通過Quality Setting可以調(diào)整默認(rèn)大小。然后查詢異步加載隊(duì)列中第一位的任務(wù)是否完成,以及和當(dāng)前任務(wù)相關(guān)的分時(shí)整合任務(wù)是否完成。如果以上任務(wù)都執(zhí)行完,會(huì)執(zhí)行一起在主線程獨(dú)占狀態(tài)下的資源整合。
ApplicationLoadLevelAsyncIntegrate 在加載場(chǎng)景時(shí)(首次加載,普通加載或者疊加加載)會(huì)出現(xiàn)該tag。對(duì)于普通加載場(chǎng)景,引擎首先會(huì)卸載場(chǎng)景(參見UnloadScene)然后加載新的場(chǎng)景。而疊加加載則會(huì)直接加載并激活目標(biāo)場(chǎng)景中的Objects
CanvasSplitInstructionsJob 遍歷分配到此Job中的instructions及其subSet,將其逐一轉(zhuǎn)換為Renderable的數(shù)據(jù)格式,并統(tǒng)計(jì)可渲染的的instructions的vertex數(shù)量等信息
CanvasCombineInstructionsJob 將SplitInstructionsJob的處理結(jié)果進(jìn)行合并,統(tǒng)計(jì)這些job計(jì)算出的vertexCount之和、bounds等信息,并按照最終結(jié)果,為生成Renderable的數(shù)據(jù)列表元素指定renderDepth
CanvasSortJob 根據(jù)分配到此Job的Instructions的Bounds大小計(jì)算一個(gè)合適的gridSize值(此值在后續(xù)計(jì)算中用來將每個(gè)Instruction劃分為若干區(qū)域,并計(jì)算出這些區(qū)域的depth的最大值),然后執(zhí)行“Canvas.Sort”(根據(jù)Instructions之間的重疊情況、z值、所屬canvas、material、texture等因素,進(jìn)行排序,以達(dá)到最優(yōu)的渲染效率)
CanvasPrepareBatchesJob 執(zhí)行“Canvas.PrepareBatches”(遍歷分配到此job中的renderable instructions,將其按照canvas或material的異同劃分batch,并將每個(gè)batch中的節(jié)點(diǎn)根據(jù)clipRect、textureID、alpha等因素的不同,劃分為若干個(gè)SubBatch,同時(shí)統(tǒng)計(jì)每個(gè)SubBatch渲染所需的shaderProperty、vertex、indices等信息)
CanvasGeometryJob 將“Canvas.PrepareBatchesJob”計(jì)算出的SubBatch渲染所需的shaderProperty、vertex、indices、alpha等信息,通過位運(yùn)算與矩陣運(yùn)算,轉(zhuǎn)化為更底層的渲染可用的數(shù)據(jù)格式
CanvasPrepareBatches 遍歷一段已排序的 renderable instruction,將其按照canvas或material的異同劃分batch,并將每個(gè)batch中的節(jié)點(diǎn)根據(jù)clipRect、textureID、alpha等因素的不同,劃分為若干個(gè)SubBatch,同時(shí)統(tǒng)計(jì)每個(gè)SubBatch渲染所需的shaderProperty、vertex、indices等信息
Layout 先后遍歷LayoutQueue隊(duì)列(包含標(biāo)記為dirty的ScrollRect、Scrollbar等)和GraphicQueue隊(duì)列(包含標(biāo)記為dirty的Graphic、InputField等),首先過濾掉其中的無效元素(null或IsDestroyed),然后調(diào)用剩余的有效元素的Rebuild接口,更新元素自身的Geometry數(shù)據(jù)與Mesh數(shù)據(jù),完成之后,清空隊(duì)列。其中在遍歷完LayoutQueue之后會(huì)進(jìn)行Cull操作。
CanvasRenderOverlays 等待Batch數(shù)據(jù)的生成,并在渲染命令隊(duì)列中加入幾何處理的命令;遍歷batches數(shù)組,若此batch有關(guān)聯(lián)的canvas,則調(diào)用該canvas的RenderOverlays,否則就直接渲染此batch;若batches數(shù)組為空,則遍歷關(guān)聯(lián)canvas數(shù)組,調(diào)用每個(gè)關(guān)聯(lián)canvas的RenderOverlays
CanvasBuildBatch 將此Canvas下的所有有效的CanvasRenderer節(jié)點(diǎn),根據(jù)其渲染順序,以及material、z值、子Canvas等因素,進(jìn)行合批(batch),并統(tǒng)計(jì)每個(gè)batch渲染所需的vertex、indices、shaderProperties等數(shù)據(jù),將其轉(zhuǎn)化為更適合底層渲染使用的數(shù)據(jù)格式,完成之后將canvas的meshBounds標(biāo)記為dirty
CanvasRendererSyncTransform 獲取此transform的localToWorld所需的轉(zhuǎn)換矩陣,通過矩陣乘法,將原transform轉(zhuǎn)換成parent canvas坐標(biāo)下的transform,將新計(jì)算出的transform賦值給目標(biāo)canvas中對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)
CanvasRendererSyncWorldRect 根據(jù)canvasRender自身的localBounds、transform,計(jì)算出worldBounds,繼而計(jì)算出globalRect,然后將數(shù)據(jù)同步到parent canvas的數(shù)據(jù)中,并標(biāo)記worldBounds中的z值是否與canvas一致
CanvasRendererSyncClipRect 將canvasRender自身的enableClip標(biāo)志位以及clipRect數(shù)據(jù)同步到parent canvas的數(shù)據(jù)中
CanvasSort 將傳入的Instructions按照其互相之間的重疊情況(根據(jù)gridSize對(duì)把Instruction劃分為若干區(qū)域,計(jì)算出這些區(qū)域中depth的最大值)、z值、所屬canvas、material、texture等因素,進(jìn)行排序,以達(dá)到最優(yōu)的渲染效率
CanvasRenderSubBatch 若此subBatch有shaderProperties數(shù)據(jù)則先設(shè)置GfxDevice的shaderProperties,然后將此subBatch在總batch中對(duì)應(yīng)的vertexBuffer數(shù)據(jù)段和indexBuffer數(shù)據(jù)段,傳輸給GfxDevice進(jìn)行渲染
UGUIRenderingRenderOverlays 遍歷CanvasManager中的所有canvas,若canvas的targetDisplay與當(dāng)前displayIndex相匹配,且其renderMode為ScreenSpaceOverlay,則執(zhí)行Canvas.RenderOverlays
UGUIRenderingEmitScreenSpaceCamerasGeometryForCamera 處理WorldSpace和ScreenSpaceCamera模式的canvas:首先為shaderProperties設(shè)置ztest屬性,然后遍歷CanvasManager中的canvas列表,若canvas為worldSpace模式,或canvas為ScreenSpaceCamera模式且canvas的目標(biāo)camera是參數(shù)傳入的camera,則調(diào)用canvas的EmitWorldGeometry函數(shù)(此函數(shù)會(huì)遍歷canvas的batches,若有此batch有關(guān)聯(lián)canvas則調(diào)用canvas的EmitWorldGeometry(),否則直接為此batch以及其subBatch生成渲染數(shù)據(jù)并加入要渲染到的camera的render隊(duì)列中,如果batches中沒有數(shù)據(jù),則直接調(diào)用關(guān)聯(lián)canvas列表的EmitWorldGeometry函數(shù))
UGUIRenderingEmitWorldScreenspaceCameraGeometry 處理特定狀態(tài)的WorldSpace和ScreenSpaceCamera模式的canvas:首先為shaderProperties設(shè)置ztest屬性,然后遍歷CanvasManager中的canvas列表,若canvas為WorldSpace或ScreenSpaceCamera模式模式,則遍歷camera列表,判斷camera的onScreen/offScreen狀態(tài)、displayId等是否與參數(shù)一致,若滿足條件則以此camera為參數(shù),調(diào)用canvas的EmitWorldGeometry函數(shù)(此函數(shù)會(huì)遍歷canvas的batches,若有此batch有關(guān)聯(lián)canvas則調(diào)用canvas的EmitWorldGeometry(),否則直接為此batch以及其subBatch生成渲染數(shù)據(jù)并加入要渲染到的camera的render隊(duì)列中,如果batches中沒有數(shù)據(jù),則直接調(diào)用關(guān)聯(lián)canvas列表的EmitWorldGeometry函數(shù))
UGUIRenderingUpdateBatches 首先觸發(fā)willRenderCanvases回調(diào),之后遍歷CanvasManager中的canvas列表,更新每個(gè)canvas的rectTransform、alpha等信息,然后重新統(tǒng)計(jì)并排序此canvas下的CanvasRenderer控件的渲染信息,若更新完數(shù)據(jù)之后發(fā)現(xiàn)canvas處于dirty狀態(tài),則執(zhí)行Canvas.BuildBatch,計(jì)算渲染數(shù)據(jù)。
AlbedoRendererRenderObjects 根據(jù)albedo或者emissive設(shè)置參數(shù),然后先進(jìn)行一次渲染,再進(jìn)行一次線框式的渲染。
AlbedoRendererRenderAlbedo 渲染對(duì)象的albedo部分。調(diào)用了gAlbedoRendererRenderObjects和gDilateAndDownsample來進(jìn)行具體操作。
AlbedoRendererRenderEmissive 渲染對(duì)象的emissive部分。調(diào)用了gAlbedoRendererRenderObjects和gDilateAndDownsample來進(jìn)行具體操作。
DilateAndDownsample 對(duì)圖像進(jìn)行dilation和下采樣的具體計(jì)算。
EnlightenRuntimeManagerFastUpdateEmissive 獲得需要進(jìn)行關(guān)于emissive部分的fastupfate的對(duì)象,然后調(diào)用相應(yīng)函數(shù),設(shè)置材質(zhì)為dynamic、更新顏色,并在成功以后tag相應(yīng)的guid。
EnlightenRuntimeManagerUpdateMaterialsForSystem 調(diào)用gEnlightenRuntimeManagerUpdateAlbedo來渲染,并在成功以后tag相應(yīng)的guid。
EnlightenRuntimeManagerUpdateAlbedo 從EnlightenRuntimeManager獲得albedo、chart mask、圖像寬度高度等數(shù)據(jù),將這些內(nèi)容和dilation寬度、被分配的空間傳入gAlbedoRendererRenderAlbedo以及gAlbedoRendererRenderEmissive進(jìn)行下一步操作,然后將結(jié)果設(shè)置入buffer。
Physics2DEffectorFixedUpdate 遍歷需要更新的effector,若有需要更新的contact則傳入timeDelta進(jìn)行計(jì)算。
Physics2DJointBreakLimits 遍歷joint,若反作用的力或者力矩超過了斷裂的臨界值,則銷毀該joint。
Physics2DCompositeColliderPrepareShapes 如果path是dirty狀態(tài),則將新的collider的path重新計(jì)算得到composite的path,然后再換算得到polygon的path。然后根據(jù)幾何類型選擇調(diào)用gPhysics2DProfileCompositeColliderPrepareShapesOutline或gPhysics2DProfileCompositeColliderPrepareShapesPolygon。
Physics2DCompositeColliderPrepareShapesOutline 將傳入的path換算成outline。
Physics2DCompositeColliderPrepareShapesDecomposition 若有物理場(chǎng)景,則開始計(jì)算:將傳入的path進(jìn)行tessellation。
Physics2DCompositeColliderAddToComposite 將collider加入到composite(若composite已有同一地址的collider則清除該collider的path),將shape計(jì)算得到的path傳入collider,然后將相應(yīng)dirty置為true;如果組合過程(compositing)未停止,則重新生成collider。
Physics2DCompositeColliderRemoveFromComposite 將collider刪除出composite(若composite沒有同一地址的collider則直接返回即可);如果組合過程(compositing)未停止,則重新生成collider。
Physics2DRigidbody2DLayerChanged 喚醒body。
Physics2DRigidbody2DRecalculateContacts 對(duì)每個(gè)滿足條件的(enabled,擁有shape,不是應(yīng)用于effector)collider調(diào)用gPhysics2DProfileColliderRecalculateContacts,另外如果該body為static則喚醒其collider的contact。
Physics2DCapsuleColliderPrepareShapes 將長(zhǎng)寬和坐標(biāo)換算為capsule的兩個(gè)半圓圓心和半徑,然后賦值在shape上,并添加該shape。
Physics2DCreateShapes 先檢查是否有需要忽略的rigidbody(若有則更新composite);然后對(duì)于composite的情況,若能準(zhǔn)備path或者shape,則將之加入composite;對(duì)于非composite的情況,若能準(zhǔn)備shape,則創(chuàng)建fixture。
Physics2DColliderTransformParentChanged 如果是composite的情況,則在獲得更新composite屬性之前,將collider從composite中刪除;如果body已被修改,則重新生成collider。
Physics2DColliderLayerChanged 僅調(diào)用gPhysics2DProfileColliderRecalculateContacts。
Physics2DColliderRecalculateContacts 對(duì)每個(gè)fixture進(jìn)行contact的標(biāo)記以用于過濾,然后喚醒從第一個(gè)shape獲取的body,并重置它的contact的friction和restitution屬性。
Physics2DPolygonColliderPrepareShapes 檢查collider是否是激活狀態(tài),獲得的多邊形是否非空,path是否非空,然后調(diào)用gPhysics2DProfilePolygonColliderPrepareShapesDecomposition。
TilemapRendererCameraBoundsJob 計(jì)算tilemap的某一個(gè)區(qū)域在camera視錐范圍內(nèi)的邊界值:遍歷區(qū)域中所有的chunk,計(jì)算出每個(gè)chunk的世界坐標(biāo),對(duì)比獲得在視錐體范圍內(nèi)的chunks的最小坐標(biāo)的和最大坐標(biāo),作為當(dāng)前區(qū)域的min邊界和max邊界
TilemapRendererBuildChunkJob 遍歷上一步計(jì)算出的根據(jù)textureID分批后的數(shù)據(jù),計(jì)算此批次相應(yīng)的mesh、vertex以及sprite的引用等信息,并遍歷此批次中所有tile,為其計(jì)算sprite、color、channelmask等信息
TilemapRendererDispatchJob 按tilemap的SortOrder指定的順序,遍歷當(dāng)前區(qū)域塊內(nèi)的chunk,計(jì)算渲染此chunk需要的sprite、transform、color等信息,并根據(jù)texture的id動(dòng)態(tài)合批,計(jì)算結(jié)果供下一渲染計(jì)算步驟使用
TilemapRendererGeometryJob 根據(jù)分配給此job的chunk信息,計(jì)算出渲染此chunk所需的另外的shader channels、頂點(diǎn)轉(zhuǎn)換所需的flags和params,然后進(jìn)行vertex轉(zhuǎn)換和index轉(zhuǎn)換,以得到GFX渲染所需數(shù)據(jù)存儲(chǔ)到vertexBuffer和indexBuffer中
TilemapRendererRender 遍歷待渲染的渲染節(jié)點(diǎn),將節(jié)點(diǎn)的custom shader properties同步到GFX中,然后將渲染節(jié)點(diǎn)中的chunks根據(jù)texture進(jìn)行合批渲染,其中若前一節(jié)點(diǎn)的最后一個(gè)job與后一節(jié)點(diǎn)之間的當(dāng)前job的mask interaction字段值相匹配,也進(jìn)行合批渲染
TilemapRendererIndividualJob 按SortOrder指定的順序,遍歷分配到此job下的chunks的所有tile節(jié)點(diǎn),為每一個(gè)有sprite的tile計(jì)算其相應(yīng)的渲染信息,包括material、color、position、shader properties等,存儲(chǔ)到相應(yīng)的渲染節(jié)點(diǎn)
TilemapRendererScheduleIndividual 遍歷tilemap中的所有chunk,為有sprite的tile生成渲染節(jié)點(diǎn),并分發(fā)job,為這些渲染節(jié)點(diǎn),計(jì)算ndividual模式渲染所需數(shù)據(jù)
TilemapRendererCalculateChunkCullingBounds 遍歷此tilemap引用到的所有sprites,選出所有sprite超出單元格的最大尺寸(以u(píng)nit為單位),并將此尺寸作為此tilemap的單元裁剪邊界(chunkcullingbounds)
TilemapRendererCameraBoundsCheck 計(jì)算整個(gè)tilemap在camera視錐范圍內(nèi)的邊界值:首先從camera視錐體的cullingMatrix中提取出 left/right/bottom/top/near/far 6個(gè)面,然后把tilemap中所有的chunk,分為若干block,異步遍歷每個(gè)block下的chunks,得到每個(gè)block的min和max的邊界,最后得出所有blocks的合并后的邊界值。
TilemapRendererPrepareChunkMode Chunk模式下:按sortOrder指定的順序,遍歷此tilemap范圍內(nèi)的坐標(biāo)值,統(tǒng)計(jì)每個(gè)坐標(biāo)中tile引用到的渲染所需數(shù)據(jù),同時(shí)更新渲染數(shù)據(jù)的引用計(jì)數(shù),以實(shí)現(xiàn)合批渲染
TilemapRendererPrepareIndividualMode Individual模式下:若tilemap非空,則觸發(fā)TilemapRenderer.ScheduleIndividual操作,準(zhǔn)備Individual模式所需的渲染數(shù)據(jù)
TilemapRendererClearChunks 清除超出渲染界限的長(zhǎng)久未渲染過的chunk:首先將此tilemap中的所有chunk按照上一次渲染幀的大小排序,若當(dāng)前tilemap的chunk數(shù)量超過了視野范圍內(nèi)可容納數(shù)量或系統(tǒng)默認(rèn)的最大chunk數(shù),則將超出部分的chunk中,上一次渲染幀與當(dāng)前渲染幀的差值超過系統(tǒng)指定限度的chunk移除
TilemapRendererCheckDirtyChunks 檢查此Tilemap是否發(fā)生了變化: 檢查此tilemap的材質(zhì)是否發(fā)生變化,若材質(zhì)未發(fā)生變化,則逐個(gè)檢查 bounding view 范圍內(nèi)的 chunk 是否發(fā)生了變化(有新chunk,或老的chunk已dirty)
TilemapRendererDistributeJobs 遍歷tilemap的bounding view范圍內(nèi)的所有chunk,若chunk尚未被渲染或chunk已dirty,則將有所需要重新渲染的chunks統(tǒng)計(jì)下來,分批異步計(jì)算其渲染所需數(shù)據(jù)
TilemapUpdate 如果是第一次Update,則將此tilemap中的所有tile重新創(chuàng)建,并觸發(fā)tile上的MonoBehavior中的StartUp方法。若有待更新的cameraView,則觸發(fā)Tilemap.UpdateTileAnimation,更新animatedTiles。
TilemapUpdateTileAnimation 若當(dāng)前處于playing狀態(tài),AnimationFrameRate大于0,且時(shí)間發(fā)生了變化,則針對(duì)每個(gè)需要更新的cameraView,遍歷view范圍內(nèi)的animatedTile,檢查該tile是否需要更新sprite(looping、speed、lastUpdateTime等條件是否滿足),若滿足條件,則更新animatedTile的sprite。
EarlyUpdateUpdateCanvasRectTransform 在每次EarlyUpdate中,遍歷CanvasManager中的所有canvas分別更新每個(gè)canvas的rectTransform屬性。若canvas的renderMode為ScreenSpace并且沒有parentCanvas,則根據(jù)此canvas的renderMode、parentCanvas、position.z等因素,更新rectTransform的anchor、pivot、position、screenSize、scale等值,若這些值發(fā)生變化,則加入任務(wù)隊(duì)列等待渲染。若canvas的renderMode為worldSpace或有parentCanvas則無需重新計(jì)算rectTransform。
PostLateUpdateUpdateCanvasRectTransform 在每次PostLateUpdate中,遍歷CanvasManager中的所有canvas分別更新每個(gè)canvas的rectTransform屬性。若canvas的renderMode為ScreenSpace并且沒有parentCanvas,則根據(jù)此canvas的renderMode、parentCanvas、position.z等因素,更新rectTransform的anchor、pivot、position、screenSize、scale等值,若這些值發(fā)生變化,則加入任務(wù)隊(duì)列等待渲染。若canvas的renderMode為worldSpace或有parentCanvas則無需重新計(jì)算rectTransform。
PhysicsRaycast 有兩個(gè)方法:raycasttest及raycast,分別根據(jù)不同的flag和filter來計(jì)算raycast的結(jié)果。
PhysicsRaycastAll 若AutoSyncTransforms為真,則先調(diào)用gPhysicsSyncRigidbodies和gPhysicsSyncColliders;然后計(jì)算raycast并返回一個(gè)數(shù)組的結(jié)果。
EnlightenRuntimeManagerAddCustomLights 將RuntimeEnlightenManager中存儲(chǔ)的LightData數(shù)據(jù)清除,遍歷參數(shù)傳入的自定義light數(shù)組,若光源的BounceIntensity非0,則將光源數(shù)據(jù)轉(zhuǎn)化后,存入RuntimeEnlightenManager的光源數(shù)據(jù)表中。
EnlightenRuntimeManagerRemoveCustomLights 將RuntimeEnlightenManager中存儲(chǔ)的LightData數(shù)據(jù)清除。
EnlightenRuntimeManagerUpdateLightsEnqueue 將SharedLightData類型光源數(shù)據(jù)轉(zhuǎn)換為EnlightenLightData類型數(shù)據(jù),以供后續(xù)使用。
ShadowsCullShadowCastersDirectional 將此job內(nèi)的sceneNode,根據(jù)是否在plane范圍內(nèi)、是否被遮擋、是否在light的layerCullDistance內(nèi)等因素,進(jìn)行篩選和剔除,并記錄后續(xù)計(jì)算所需數(shù)據(jù)。
ShadowsCullShadowCastersDirectionalDetail 根據(jù)light在每個(gè)layer中的cullDistance值,以及光源的cullingPlane與sphere數(shù)據(jù),篩選可見的sceneNode,并轉(zhuǎn)換shadowCasterBound的數(shù)據(jù)結(jié)構(gòu)。
ShadowsCullShadowCastersLocal 先跟進(jìn)根據(jù)light的cullingPlane等因素對(duì)renderer node進(jìn)行剔除,然后針對(duì)具體光源的特征(point / spot),使用不同計(jì)算方法,對(duì)傳入的scene node數(shù)組進(jìn)行剔除。
ShadowsCullShadowCastersLocalDetail 根據(jù)light type(point / spot)的不同,使用不同計(jì)算方法,對(duì)傳入的scene node數(shù)組進(jìn)行剔除。
ShadowsCullLocalLightShadowCasters 遍歷傳入的的shadowedLight,計(jì)算每個(gè)light的cullingPlane,再將每個(gè)renderer list,針對(duì)當(dāng)前光源的特性,計(jì)算出受光源影響的renderer,存入相應(yīng)數(shù)組中,并對(duì)最終數(shù)據(jù)做相應(yīng)的合并與處理。
ShadowsPrepareUmbraShadowCullerBuffers 把非static的renderer的index和bounds數(shù)據(jù)統(tǒng)計(jì)到傳入的兩個(gè)數(shù)組中.
ShadowsCreateUmbraShadowCuller 將之前統(tǒng)計(jì)到的可見的物體的bounds統(tǒng)計(jì)到數(shù)組中,然后用umbra生成出一個(gè)ShadowCuller,供后續(xù)使用。
ShadowsCullDirectionalShadowCasters 遍歷所有有效直線光,根據(jù)光源的特性和屬性值,對(duì)rendererList進(jìn)行剔除(lights的邊界plane、遮擋、shadowType、distance等因素),并在過程中統(tǒng)計(jì)后續(xù)所需的數(shù)據(jù)(nodeIndex、bounds等數(shù)據(jù))。
ShadowsCullShadowCastersDirectionalUmbra 將分配到此job的cullingData進(jìn)行處理,根據(jù)是否為staticRenderer,使用不同的算法計(jì)算出未被遮擋的casterList,然后遍歷sceneNode數(shù)組,將有效的sceneNode也加入casterList。
ShadowsCullShadowCastersWithoutUmbra 將分配到此job的cullingData進(jìn)行處理,遍歷jobData中的sceneNode,將在plane范圍內(nèi)的node統(tǒng)計(jì)出來。
ShadowsGenerateCombinedDynamicVisibleList 若使用umbra occlusion culling,則執(zhí)行“Shadows.PrepareUmbraShadowCullerBuffers”,即把非static的renderer的index和bounds數(shù)據(jù)統(tǒng)計(jì)到傳入的兩個(gè)數(shù)組中 。
ShadowsCombineLocalShadowCasterCullignIndexListsAndDestroy 將renderer list分配的每個(gè)job計(jì)算出的shadow caster的bounds合并,然后把之前的job計(jì)算的數(shù)據(jù)合并到同一個(gè)數(shù)組中,釋放臨時(shí)數(shù)據(jù)。
ShadowsCombineLocalShadowCasterBoundsAndDestroyJob 將前面計(jì)算出的shadowCaster的bounds信息轉(zhuǎn)化成合適的數(shù)據(jù)結(jié)構(gòu),以供后續(xù)使用。
FrustumAndOcculusionCullLocalLights 將分配到此job的非直線光源,分別做視錐剔除計(jì)算、和遮擋剔除計(jì)算,篩選出經(jīng)過兩種過濾之后仍可見的光源,記錄其數(shù)據(jù)。
FrustumAndOcculusionCullLocalLightsCombine 將各job根據(jù)計(jì)算整理出的光源數(shù)組合并(visibleLight、offScreenLight、fadeLight等)。
OcclusionAndConnectivityCullLight 遍歷分配到此job的有效光源,用umbra計(jì)算光源的被遮擋情況,并根據(jù)其Shadow是否為Full Strength 記錄到不同數(shù)組中;然后用umbra計(jì)算出visible的SphereLight,并記錄到數(shù)組中。
CullLightFrustumLocal 遍歷分配到此job的光源,若光源在視錐(Frustum)范圍內(nèi)(或在范圍外但距離足以造成影響),則為其中的spot和point類型的光源計(jì)算其屏幕空間范圍;否則若光源距離在衰減范圍內(nèi),則記錄此光源以及其衰減距離。
FindActiveLights 遍歷LightManager中的所有l(wèi)ight,過濾掉與scene、camera的cullingMask不匹配的、intensity小于0的、非realtime、range區(qū)域可忽略不計(jì)的光源。將剩余的有效光源,根據(jù)lightType分別記錄下光源數(shù)據(jù)(position、radius、shadow等信息)。
AddDirectionalLights 根據(jù)Important、Intensity、GreyScale、ShadowType等因素篩選出最亮的直線光(Directional Light)作為,mainLight,并在其他有效直線光中統(tǒng)計(jì)出has shadow的光源,在以上過程中記錄下所有有效直線光源的詳細(xì)數(shù)據(jù)。
AddActiveLocalLights 統(tǒng)計(jì)符合條件的localLights和customLights的信息到activeLights數(shù)組中,并按照visible、off-screen、lightType等因素排序。
AddCustomActiveLocalLights 統(tǒng)計(jì)特殊component(如ParticleSystem等)中的自定義光源,若其中有spot或point類型光源,則統(tǒng)計(jì)到待用數(shù)據(jù)中。
CullQueryPortalVisibilityUmbra 根據(jù)Umbra算法,判斷當(dāng)前job下的可見物體是否在camera視錐之外。
CullQueryPortalVisibilityCombineJob 若所有job均未檢測(cè)出視錐外可見物,則標(biāo)記為可使用UmbraOcclusionCulling,并且合并所有job的數(shù)據(jù)。
CullSceneDynamicObjects 首先對(duì)當(dāng)前job需要處理的node數(shù)組,根據(jù)layer、sceneMask、enable等因素進(jìn)行篩選,將無效的node剔除。若可以使用Umbra Culling,則根據(jù)occlusionBuffer遮擋情況進(jìn)行剔除;否則判斷是否在cullingPlane范圍內(nèi)進(jìn)行剔除。將以上結(jié)果再根據(jù)farPlane等因素進(jìn)行進(jìn)一步剔除。
CullSceneDynamicObjectsCombineJob 如果此job是處理static occlusion的,并且使用Umbra Culling,則只需將數(shù)組中的因?yàn)閘ayer、sceneMask、enable、farPlane等因素而不可見的node剔除。否則,則將每個(gè)job的計(jì)算結(jié)果整合到同一個(gè)數(shù)組中。
Drawing 將針對(duì)此camera的cullResult按照合適的渲染流程進(jìn)行渲染。
DrawingMultiCustomPre 初始化RenderLoopContext;若當(dāng)前環(huán)境支持SinglePassStereo且開啟了SinglePassStereo模式,則初始化gfxDevice的stereo相關(guān)數(shù)據(jù);對(duì)cameraStack的當(dāng)前狀態(tài)進(jìn)行處理。
DrawingMultiCustom 將待渲染的數(shù)據(jù)分類整理到Opaque和AfterOpaque隊(duì)列,然后按照forward或deferred渲染流程逐步渲染,最后對(duì)skybox、motionVector、halo等效果進(jìn)行渲染。
DrawingMultiCustomPost 觸發(fā)PostRender回調(diào),渲染Overlay的物體,回置環(huán)境變量。
UpdateDepthTexture 將renderNode隊(duì)列中物體的深度數(shù)據(jù),按照一定的shader環(huán)境,渲染到depthTexture中。
UpdateDepthNormalsTexture 將renderNode隊(duì)列中物體的深度和法線數(shù)據(jù),按照一定的shader環(huán)境,渲染到一張RenderTexture中。
PrepareSceneCullingParameters 對(duì)SceneCullingParameters內(nèi)容賦值,并對(duì)其中待計(jì)算的數(shù)據(jù)結(jié)構(gòu)申請(qǐng)空間;更新LODGroupManager的數(shù)據(jù),然后對(duì)CullResults的lodDataArray賦值。
FrustumCullReflectionProbesJob 遍歷此job下的reflection probe的cube信息,根據(jù)cullingPlane,統(tǒng)計(jì)出視錐范圍內(nèi)的reflection probe。
CameraImageEffects 1. 根據(jù)所有的filter把sourceRT拷貝到destRT 2. 執(zhí)行filter中的renderFunc回調(diào)
GraphicsBlit 用指定的shader把Texture拷貝到RenderTexture中。
CameraRenderSkybox 根據(jù)skybox的類型,分不同數(shù)量的pass對(duì)skybox的面進(jìn)行渲染。
HaloRender 篩選出可見范圍內(nèi)的Halo,分發(fā)job生成Halo渲染數(shù)據(jù),之后調(diào)用device接口進(jìn)行渲染。
HaloGeometryJob 遍歷當(dāng)前job的Halo數(shù)組,根據(jù)Halo的size、depth、color等信息生成渲染數(shù)據(jù)。
SceneCulling 對(duì)場(chǎng)景中的有效的renderer、lihgts、reflection probe 做“視錐剔除”和“遮擋剔除”,剔除完畢后,調(diào)用注冊(cè)過的 globalCallback 和 renderer 的 callback 。
CullAllVisibleLights 篩選出scene中在camera視錐范圍下的有效光源,并根據(jù)lights的類型與屬性數(shù)據(jù),按照優(yōu)先級(jí)先后順序,計(jì)算出cast shadow的光源,以及其光照下的shadow casters數(shù)據(jù),并按照一定規(guī)則對(duì)數(shù)據(jù)進(jìn)行整理排序。
CullAllVisibleReflectionProbes 篩選出scene中的probe,根據(jù)probe是否在視錐范圍內(nèi),記錄它的visible狀態(tài)、bounds信息等。
PrepareSceneNodes 將cullResult中得到的各個(gè)類型的rendererList,分發(fā)到各個(gè)job處理,統(tǒng)計(jì)出其中需要callback的renderer,并放到cullResult的不同功能的callback數(shù)組中。
PrepareSceneNodesSetUp 若此job中的rendererList為空,則不創(chuàng)建任何subJob;否則,將cullResult中的indexList、sceneNode數(shù)據(jù)對(duì)傳入此job的參數(shù)數(shù)據(jù)中,然后分為合適數(shù)量的subJob進(jìn)行處理(統(tǒng)計(jì)其中需要callback的node)。
PrepareSceneNodesJob 遍歷此job負(fù)責(zé)處理的數(shù)組段,統(tǒng)計(jì)其中需要callback且jobdata的callback數(shù)組中有其所需的callback的node,將符合要求的node的index統(tǒng)計(jì)到數(shù)組中。
SceneNodesInitJob 根據(jù)其rendererList類型,為處理該list的job指定其負(fù)責(zé)的數(shù)據(jù)在數(shù)組中的start位置,并為jobdata中的callback數(shù)組指定相關(guān)的回調(diào)。
PrepareSceneNodesCombineJob 遍歷統(tǒng)計(jì)到的node index數(shù)組,統(tǒng)計(jì)node對(duì)應(yīng)的renderer,放到cullResult的不同功能的callback數(shù)組中。
FindDirectionalShadowCastingLights 將統(tǒng)計(jì)到的有效的直線光,根據(jù)是否在prePass中可見、是否在需要計(jì)算陰影的空間內(nèi)、shadowType等因素,判斷每個(gè)light是否會(huì)投射陰影,并標(biāo)記。
FindLocalShadowCastingLights 遍歷上一步篩選出的localLights和customLights,篩選出其中castShadow的light。
FindShadowCastingLights 對(duì)傳入的light數(shù)組,根據(jù)是否在prePass中可見、是否在需要計(jì)算陰影的空間內(nèi)、shadowType等因素,判斷每個(gè)light是否會(huì)投射陰影,并標(biāo)記。
CullSendEvents culling結(jié)束后,調(diào)用global 的 callback;然后調(diào)用renderer注冊(cè)的callback;最后執(zhí)行renderer的update
AddLocalLights 統(tǒng)計(jì)localLights和customLights中的有效、并cast shadow的lights,計(jì)算出每個(gè)lights照射范圍內(nèi)的shadow caster數(shù)據(jù)。
AddReflectionProbes 把所有active的probe統(tǒng)計(jì)到一個(gè)數(shù)組中,并根據(jù)之前的剔除結(jié)果,標(biāo)記每個(gè)probe的visible情況、bounds信息等。
ShadowsCullShadowCastersDetailPoint 遍歷傳入的sceneNode,根據(jù)point light的半徑和node的bound等信息,計(jì)算出point light影響范圍內(nèi)的node。
ShadowsCullShadowCastersDetailSpot 遍歷傳入的sceneNode,根據(jù)spot light的光錐空間和node的bound信息,計(jì)算出spot light影響范圍內(nèi)的node。
CullDynamicObjectsWithUmbra 遍歷傳入的的bounds數(shù)組,將其中被occlusionBuffer遮擋的元素剔除掉。
CullObjectsWithoutUmbra 根據(jù)已有的cullingPlanes準(zhǔn)備合適數(shù)量的一個(gè)plane數(shù)組,遍歷傳入的待處理bounds數(shù)組,將不在plane范圍內(nèi)的部分剔除。
CullingGroupSendEvents 遍歷CullingGroups,若其targetCamera與參數(shù)中一致,則先向所有state變化了的visible的node發(fā)送事件,然后向state變化了的Invisible的node發(fā)送事件。
RenderDeferredSort 對(duì)deferredRenderPath需要處理的RenderObject隊(duì)列按照一定規(guī)則進(jìn)行排序。
RenderDeferredGBuffer 1. 根據(jù)情況創(chuàng)建相應(yīng)數(shù)量的GBuffer,并將其傳送給gfxDevice。 2. 遍歷所有RenderObjectData,根據(jù)其攜帶的shader的各個(gè)pass設(shè)置渲染環(huán)境以及參數(shù)。
RenderDeferredLighting 將GBuffer中對(duì)應(yīng)的發(fā)現(xiàn)RT設(shè)置到shaderProperties中,然后先后對(duì)activeLight和mainLight進(jìn)行渲染。
RenderDeferredLight 根據(jù)光源類型和信息,設(shè)置shader pass context,然后逐步生成光源的geometry數(shù)據(jù)進(jìn)行渲染。
RenderDeferredFinalPass 將光照信息合并到當(dāng)前main RenderTexture上,觸發(fā)renderEvent回調(diào)。
RenderDeferredForwardObjectsToDepth 把需要前向渲染的objects渲染信息寫入depthPass中。
RenderDeferredCombineDepthNormals 將depth信息合并入normal信息的RenderTexture中。
RenderDeferredReflections 準(zhǔn)備渲染ReflectionProbe需要的環(huán)境,并把所有的probe信息以quad或mesh的形式進(jìn)行渲染。
RenderDeferredDefaultReflection 根據(jù)默認(rèn)的reflection環(huán)境,設(shè)置device的DepthState和StencilState,將camera的nearPlane根據(jù)reflection的轉(zhuǎn)換矩陣渲染到device上。
RenderDeferredReflProbeQuad 關(guān)閉裁剪,將ReflectionProbe生成的vertex渲染到camera的nearPlane對(duì)應(yīng)的quad上。
RenderDeferredReflectionsToEmissive 將Reflection生成的RenderTexture渲染到Emissive的RenderTexture。
RenderPrepare 為RenderNode隊(duì)列中的node下的material生成RenderObjectData,按不同條件放入opaque和afterOpaque。
RenderOpaqueGeometry 根據(jù)當(dāng)前的renderPath(prePass、deferredPath、forwardPath等),對(duì)OpaqueObjects執(zhí)行不同的RenderLoop。
RenderTransparentGeometry 將需要在transparent批進(jìn)行渲染的物體送諸渲染,更新camera的depthTexture。
RenderMotionVectors 若camera的depthTextureMode需要,且當(dāng)前環(huán)境支持MotionVector,則篩選出需要渲染的motionVector數(shù)據(jù)的RenderObject,按相應(yīng)流程進(jìn)行渲染。
RenderDeferredForwardObjectsIntoDepth 將需要ForwardRender的objects的深度信息渲染到depthRT中。
RenderDeferredForwardObjectsIntoDepthNormals 利用特定的shader,將需要ForwardRender的objects的depth和normal信息渲染入特定的RT中。
MotionVectorSort 對(duì)篩選出的有MotionVector的RenderObject隊(duì)列進(jìn)行排序。
MotionVectorRender 將統(tǒng)計(jì)出的motionVector列表分發(fā)到合適數(shù)量的job進(jìn)行渲染。
MotionVectorRenderJob 遍歷此job負(fù)責(zé)的存有motionVector數(shù)據(jù)的 renderPass 列表,分別對(duì)每個(gè)pass進(jìn)行渲染。
RenderPrePassSort 對(duì)prePass需要處理的RenderObject隊(duì)列按照一定規(guī)則進(jìn)行排序。
RenderPrePassGeometryPass 將帶有效shader的待渲染對(duì)象,逐一遍歷其shader的pass,按照一定規(guī)則,合批渲染。
RenderPrePassLighting 先后渲染activeLights和mainLight,并在渲染之前與之后分別觸發(fā)BeforeLighting / AfterLighting的callback。
RenderPrePassLight 根據(jù)光源數(shù)據(jù),設(shè)置shaderPass、lightMaterial、deviceParams等數(shù)值,然后將光源的mesh進(jìn)行渲染。
RenderPrePassFinalPass 遍歷所有RenderObject,將其shaderPass經(jīng)過處理之后加入batchRenderer的pass隊(duì)列中,并在之前與之后觸發(fā)BeforeFinalPass / AfterFinalPass 的 callback。
RenderPrePassForwardObjectsToDepth 遍歷forwardRenderedObjects,篩選出其中forwardRender并且receiveShadow的Objects,將這些物體的depth信息渲染到一張renderTexture上。
RenderPrePassCombineDepthNormals 利用combineShader,將depth和normal合并到一張RenderTexture,并設(shè)置到當(dāng)前passContext環(huán)境中。
RenderDeferredCopyDepth 將當(dāng)前device的渲染結(jié)果中的depth信息拆分到一張RenderTexture中。
RenderForwardOpaquePrepare 遍歷所有Opaque的RenderObject,統(tǒng)計(jì)它的渲染方式(逐頂點(diǎn)/逐像素)、數(shù)據(jù)(shader/lights/shadow),然后遍歷shader中的所有pass,生成ForwardRenderPassData,加入到renderLoop的pass隊(duì)列中。
RenderForwardOpaqueSort 對(duì)renderLoop中的opaqueObj生成的pass隊(duì)列排序。
RenderForwardOpaqueCollectShadows 根據(jù)ShadowCachingData和LightData設(shè)置shaderProperties等環(huán)境,然后生成一張屏幕空間的shadowMap。
RenderForwardOpaqueRender 設(shè)置渲染opaque物體所需環(huán)境,然后分job渲染各個(gè)pass以及其對(duì)應(yīng)的projector隊(duì)列。
RenderForwardAlphaPrepare 遍歷所有Transparent的RenderObject,統(tǒng)計(jì)它的渲染方式(逐頂點(diǎn)/逐像素)、數(shù)據(jù)(shader/lights/shadow),然后遍歷shader中的所有pass,生成ForwardRenderPassData,加入到renderLoop的pass隊(duì)列中。
RenderForwardAlphaSort 對(duì)renderLoop中的transparentObj生成的pass隊(duì)列排序。
RenderForwardAlphaRender 設(shè)置渲染aplha物體所需環(huán)境,然后分job渲染各個(gè)pass以及其對(duì)應(yīng)的projector隊(duì)列。
RenderForwardRenderLoopJob 遍歷job下的renderPass,首先渲染pass對(duì)應(yīng)的projector隊(duì)列,然后根據(jù)pass類型,配飾shader環(huán)境,進(jìn)行渲染。
RenderForwardAssignProjectorQueuesJob 為當(dāng)前job分配的renderPass指定projector范圍。
PrepareUpdateRendererBoundingVolumes 調(diào)用RendererUpdateManager中注冊(cè)過prepareDispatchUpdateFunc回調(diào)的函數(shù),獲得后續(xù)所需的BoundsJobData,并做相應(yīng)數(shù)據(jù)補(bǔ)充。
UpdateRendererBoundingVolumes 用RendererUpdateManager中注冊(cè)過transformChangeFunc的函數(shù)生成job,回調(diào)用將各自的transform信息生成Bounds數(shù)據(jù)存入jobData。
FinalizeUpdateRendererBoundingVolumes 調(diào)用RendererUpdateManager中注冊(cè)過finalizeUpdateFunc回調(diào)的函數(shù),處理上一步獲得的BoundsJobData。
TextureAwakeFromLoad 根據(jù)texture的settingData,計(jì)算出GPU渲染所需的texture數(shù)據(jù),并根據(jù)情況,將texture scale至power of two之后上傳GPU,或按照original size,上傳GPU。
Physics2DDestroyShapes 刪除collider,即刪除fixture、重置參數(shù)、從該collider相關(guān)聯(lián)的composite中移除。另外根據(jù)傳入的bool來確定操作:若collider需要重新生成則將之標(biāo)記給contact,否則將contact同時(shí)刪除。
Physics2DPolygonColliderPrepareShapes 檢查collider是否是激活狀態(tài),獲得的多邊形是否非空,path是否非空,然后調(diào)用gPhysics2DProfilePolygonColliderPrepareShapesDecomposition。
Physics2DPolygonColliderPrepareCompositePaths 檢查collider是否是激活狀態(tài),collider是否非空,path是否非空。將path轉(zhuǎn)換為composite。在此之前,若sprite renderer處于tiled的繪制模式,則先調(diào)用gPrepareTilingSegment,獲得“九宮格”信息,然后計(jì)算tile的數(shù)據(jù)變化,調(diào)用gGenerateTilingArea生成結(jié)果。
Physics2DPolygonColliderPrepareShapesDecomposition 將傳入的polygon path進(jìn)行tessellation。在此之前,若sprite renderer處于tiled的繪制模式,則先調(diào)用gPrepareTilingSegment,獲得“九宮格”信息,然后計(jì)算tile的數(shù)據(jù)變化,調(diào)用gGenerateTilingArea生成結(jié)果,最后將結(jié)果轉(zhuǎn)換為composite再轉(zhuǎn)換為polygon。
Physics2DBoxColliderPrepareShapes 檢查collider是否是激活狀態(tài),根據(jù)長(zhǎng)寬和坐標(biāo)換算為box的4個(gè)點(diǎn),檢驗(yàn)這4個(gè)點(diǎn)是否有效,然后賦值在shape上,并添加該shape。
Physics2DEdgeColliderPrepareShapes 檢查collider是否是激活狀態(tài),將距離小于最低要求的點(diǎn)合并,檢查剩余節(jié)點(diǎn)數(shù)是否不少于2個(gè),然后賦值在shape上,并添加該shape。
Physics2DCircleColliderPrepareShapes 檢查collider是否是激活狀態(tài),計(jì)算圓心和半徑,然后賦值在shape上,并添加該shape。
TerrainUpdateTreeBillboardTexture2 若camera的角度變化超過一定值或等待的幀數(shù)超過一定值,若當(dāng)前平臺(tái)為WIN/OSX/LINUX,則先后將albedoShader和normalShader設(shè)置到treeData的prototype的material中進(jìn)行渲染,否則,只對(duì)material當(dāng)前pass的mesh進(jìn)行常規(guī)渲染。
TerrainFlushDirty 根據(jù)當(dāng)前terrain的dirtyFlag,判斷terrain發(fā)生變化的屬性有哪些(trees、heightMap等屬性),并分別針對(duì)各個(gè)屬性的變化對(duì)terrain數(shù)據(jù)進(jìn)行reload。
TerrainHeightmapRenderStep1 遞歸遍歷terrainRenderer中的劃分的節(jié)點(diǎn),根據(jù)節(jié)點(diǎn)到camera到距離等因素,標(biāo)記節(jié)點(diǎn)的可見性等信息。
TerrainHeightmapRenderStep2 遞歸遍歷terrainRenderer中的劃分的節(jié)點(diǎn),根據(jù)節(jié)點(diǎn)之間想相鄰關(guān)系/父子關(guān)系,進(jìn)一步優(yōu)化劃分節(jié)點(diǎn)的visible狀態(tài)(self visible 、some children visible)。
TerrainHeightmapRenderStep3 遞歸遍歷terrainRenderer中的劃分的節(jié)點(diǎn),根據(jù)每個(gè)節(jié)點(diǎn)的visible狀態(tài),生成相應(yīng)的mesh或刪除不需要的mesh;根據(jù)以上結(jié)果,創(chuàng)建為需要渲染的node創(chuàng)建renderer。
TerrainDetailsRender 為DetailRenderer下的prototypes生成一個(gè)atlasTexture上傳GPU;對(duì)terrian劃分的patches做視錐剔除、深度剔除,為篩選出的可見的patch生成IntermediateRenderer,加入管理器中。
TerrainTreesRender 根據(jù)烘焙數(shù)據(jù)更新terrain中樹節(jié)點(diǎn)的probe的enable狀態(tài);根據(jù)需要,重新統(tǒng)計(jì)或刷新treeRenderer的渲染信息;按照由遠(yuǎn)及近,分別對(duì)遠(yuǎn)處的樹合批渲染,近處的樹按照billboard或fullTree的形式單獨(dú)渲染。
TerrainTreesOnWillRender 在play狀態(tài)下,遍歷裁剪結(jié)果中的可見的treeNode,若treeRendererVisiblility位圖中未標(biāo)可見,則更新位圖狀態(tài),并更新此treeNode中的renderer的wind(風(fēng))數(shù)據(jù)。
QuadTreeNodeRender 根據(jù)RenderNode的renderingData,生成GfxDevice可使用的渲染數(shù)據(jù),然后執(zhí)行Draw操作。
TerrainRecomputeInvalidPatches 遍歷篩選出的patch,重新計(jì)算此patch采樣高度最大誤差,以及此patch范圍內(nèi)高度的min/max值。
TerrainUpdateHeightmapTexture 把HeightMap的高度信息,寫入一張指定格式的紋理中,然后把紋理數(shù)據(jù)寫入HeightMap的RenderTexture。
QuadTreeBatchNodeRender 首先將此RenderNode的shader properties,設(shè)置到GfxDevice當(dāng)前環(huán)境;然后遍歷node中的batch數(shù)組,將數(shù)據(jù)push入待渲染隊(duì)列,當(dāng)隊(duì)列中instance數(shù)量達(dá)到max值,則提交渲染,如此循環(huán)直至數(shù)組末端。
TerrainUpdateMaterials 若terrain的shader或material發(fā)生變化,則根據(jù)當(dāng)前的terrainData,重新生成splat material,并更新其他渲染相關(guān)數(shù)據(jù)。
TerrainUpdateTreeBillboardTexture 若camera的角度變化超過一定值或等待的幀數(shù)超過一定值,則遍歷treeData中的所有prototype的material,并對(duì)material的當(dāng)前pass數(shù)據(jù)進(jìn)行渲染。
Physics2DPrepareTilingSegment 傳入“九宮格”的位置信息,并以path中的節(jié)點(diǎn)根據(jù)其位置所在的區(qū)間分別填入數(shù)據(jù);若path中的兩個(gè)節(jié)點(diǎn)不在同一區(qū)間,則需要計(jì)算它們的連接線段與區(qū)間分界線的交點(diǎn),并將交點(diǎn)填入。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評(píng)論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評(píng)論 3 421
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,935評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,325評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,534評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,892評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,322評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評(píng)論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評(píng)論 1 289
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,800評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,084評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容