diff --git a/02-Note/DAWA/ASoul/渲染方案/PVW相关.md b/02-Note/DAWA/ASoul/渲染方案/PVW相关.md index 2b06783..3509e9a 100644 --- a/02-Note/DAWA/ASoul/渲染方案/PVW相关.md +++ b/02-Note/DAWA/ASoul/渲染方案/PVW相关.md @@ -50,4 +50,192 @@ private RegisterLocalEventListener(): void { this.BindCamera(this.Task.TryGetBindedMainCamera()); } } +``` + + +# DirectorCamGroup.cpp +```c++ +UDirectorSequencePlayer* UDirectorCamGroup::GetDirectorSequencePlayerFromPool(int CamIndex, bool IsPreview) +{ + TargetPlayer = NewObject(this); + TargetPlayer->SetCamSequence(CamIndex, SequenceActor); + if(IsPreview) + { + CachedPreviewingPlayer.AddUnique(TargetPlayer); + } + else + { + CachedStreamingPlayer.AddUnique(TargetPlayer); + } +} +``` + +# PVW & PGM红框效果代码 TsDirectorCamManagerActor.ts +``` +//客户机加入流程: +//连接Server->同步当前场景->场景加载完成后收到本地事�?->初始化workShop +//->确认机器身份,执行本机任务(异步任务处理流程) + +//异步处理流程:根据机器的性能,加入时间不同,状态差异自适应处理任务逻辑 +// 服务端收到任务请�?->确保服务端的workShop初始化完�?->处理数据及同�?? +// ->客户机收到同步数据后->等待自己的workshop初始化完�?->处理自己的逻辑 +// 同一种任务只处理最近一�? +``` + +## HandlePreStreamTaskByNetTag() +相关切区域与切镜代码会调用RequestPVWTaskServer() +RequestPVWTaskServer() => +RequestPVWTask() => HandlePreStreamTaskDataMulticast() => HandlePreStreamTaskByNetTag() +```ts +HandlePreStreamTaskByNetTag(): void { + if (this.prestreamTaskData) { + switch (Utils.GetDirectorMode(this).TagName) { + case DirectorMode.PVWAndPGM: + if(!DirectorCamUtil.SubmitNewCommandIfDataNotChanged(this.preStreamTask, this.prestreamTaskData)){ + if (this.preStreamTask) { + this.preStreamTask.Stop() + } + this.preStreamTask = DirectorCamUtil.CreateCamTask(this, this.prestreamTaskData, CamTaskType.FullStream, this.droneCamera, + this.PVWWindow, this.handHeldCamera) + if (this.preStreamTask) { + this.preStreamTask.Start() + if (this.PVWWindow) { + this.PVWWindow.SetViewBorderColor(0, new UE.LinearColor(0, 1, 0, 1)) + } + console.log('PVW Task:' + this.preStreamTask.workShop.BindPlacement.Title + " " + this.preStreamTask.groupName + " " + + this.preStreamTask.camName) + } + } + break + case DirectorMode.Preview: + this.RefreshWindowViewBorderColor() + break + case DirectorMode.PVW: + this.HandlePVWTask() + break; + default: + break + } + } +} +``` + +# 130mm Bug日志 +```c++ +[2024.08.06-05.08.09:625][373]Puerts: (0x00000703D1DF42D0) request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:9223AA8A478BA88F1217CD86911EDAE1, Index=0, StartFrame:0 +[2024.08.06-05.08.09:626][373]LogLevelSequence: Starting new camera cut: 'Cam_TalkShowZuo_ZhuJiWei24mm_1' +[2024.08.06-05.08.09:626][373]Puerts: (0x00000703D1DF42D0) 设置相机目标: +[2024.08.06-05.08.09:626][373]Puerts: (0x00000703D1DF42D0) PVW Task: 线下 站\n4 ZhuJiWei24mm +[2024.08.06-05.08.11:550][487]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,true +[2024.08.06-05.08.11:551][487]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,false +[2024.08.06-05.08.11:551][487]LogChaosBone: Display: ResetDynamics: 1, ChaosBoneAssets Name: CBA_SK_JiaRan_Costume_BHair +[2024.08.06-05.08.11:551][487]LogChaosBone: Display: ResetDynamics: 1, ChaosBoneAssets Name: CBA_SK_JiaRan_Costume_dress +[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) BP_JiaRan_Costume_C_0 set visible false +[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) teleport to livearea 031D1C1742D7EB4C76F6B397FF404FD8 +[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,true +[2024.08.06-05.08.11:602][490]Puerts: (0x00000703D1DF42D0) X=0.000 Y=0.000 Z=0.000 +[2024.08.06-05.08.11:602][490]Puerts: Warning: (0x00000703D1DF42D0) PauseOrResumeAllFxProp ,false +[2024.08.06-05.08.11:602][490]Puerts: (0x00000703D1DF42D0) BP_JiaRan_Costume_C_0,attach prop ,玩具水枪A +[2024.08.06-05.08.11:603][490]Puerts: Warning: (0x00000703D1DF42D0) get socket of JiaRan: RightHandSocket +[2024.08.06-05.08.11:604][490]Puerts: (0x00000703D1DF42D0) Attach prop 玩具水枪A +[2024.08.06-05.08.11:604][490]Puerts: (0x00000703D1DF42D0) Idol.JiaRan successfully switch to 031D1C1742D7EB4C76F6B397FF404FD8 +[2024.08.06-05.08.12:085][519]Puerts: Error: (0x00000703D1DF42D0) OnFinishDisappearFx(), but the idol visibility is true!!BP_JiaRan_Costume_C_0 +[2024.08.06-05.08.12:107][520]Puerts: Warning: (0x00000703D1DF42D0) BP_JiaRan_Costume_C_0 set visible true +[2024.08.06-05.08.12:108][520]LogBlueprintUserMessages: [BP_JiaRan_Costume_C_0] Apply Material. Oringinal Material: false +[2024.08.06-05.08.12:108][520]Puerts: (0x00000703D1DF42D0) RefreshSceneCaptureShowList +[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) CheckItemFxPool, size 0 +[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) TriggerHandPose +[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) TriggerHandPose +[2024.08.06-05.08.12:109][520]Puerts: Warning: (0x00000703D1DF42D0) Disable instrument pose +[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) Detect hand pose ToyGun +[2024.08.06-05.08.12:109][520]Puerts: (0x00000703D1DF42D0) TriggerHandPose ToyGun +[2024.08.06-05.08.12:455][541]Puerts: (0x00000703D1DF42D0) request PGM: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:9223AA8A478BA88F1217CD86911EDAE1, Index=0, StartFrame:0 , PushMethod =0 +[2024.08.06-05.08.12:805][562]Puerts: (0x00000703D1DF42D0) request PGM: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:9223AA8A478BA88F1217CD86911EDAE1, Index=0, StartFrame:0 , PushMethod =0 +[2024.08.06-05.08.14:606][670]LogBlueprintUserMessages: [BP_JiaRan_Costume_C_0] Apply Material. Oringinal Material: true +[2024.08.06-05.08.15:822][743]Puerts: (0x00000703D1DF42D0) request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:DDB1F27A44E7E5B312830A828EB55464, Index=0, StartFrame:0 +[2024.08.06-05.08.15:823][743]LogLevelSequence: Starting new camera cut: 'Cine_Camera_Actor_1' +[2024.08.06-05.08.15:823][743]Puerts: (0x00000703D1DF42D0) 设置相机目标: +[2024.08.06-05.08.15:824][743]Puerts: (0x00000703D1DF42D0) PVW Task: 线下 贝拉2024生日 lengthtest +[2024.08.06-05.08.15:824][743]LogBlueprintUserMessages: [BP_Cine_Cam_FOV_1] 35.0 +[2024.08.06-05.08.16:256][769]LogBlueprintUserMessages: [BP_Cine_Cam_FOV_1] 35.002922 +``` + +相关Log顺序: +- request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:DDB1F27A44E7E5B312830A828EB55464, Index=0, StartFrame:0 +- LogLevelSequence: Starting new camera cut: 'Cine_Camera_Actor_1' +- Puerts: 设置相机目标: +- Puerts: PVW Task: 线下 贝拉2024生日 lengthtest +- PrintString BP_Cine_Cam_FOV_1 35.0 + +***HandlePVWTask中的prestreamTaskData 不对*** + + +```c + // 播放指定相机到PVW. + @ufunction.ufunction(ufunction.ServerAPI, ufunction.Reliable) + PlayCamSequenceOnPVWServer(camGroupId:UE.Guid, camIndex:number):void{ + let shotExists = this.directorCamSubSystem.ShotExistInGroup(this.prestreamTaskData.WorkShopId, camGroupId, camIndex) + if (shotExists || camIndex == DirectorCamUtil.DRONE_CAM_INDEX || camIndex == DirectorCamUtil.HANDHELD_CAM_INDEX) { + let newPVWTaskData = DirectorCamUtil.CopyTaskData(this.prestreamTaskData) + newPVWTaskData.CamGroupId = camGroupId + newPVWTaskData.CamIndex = camIndex + newPVWTaskData.StartFrame = 0 + newPVWTaskData.bPreviewOneFrame = false + this.RequestPVWTaskServer(newPVWTaskData) + } + else { + console.warn('当前镜头不存�?,切换无效!index=' + camIndex) + } + } + + +class TsDirectorCamSequencePlayBridge extends UE.Actor { +    PlayCamSequence(camGroupId:UE.Guid, camIndex:number): void { +        let camManager = TsDirectorCamManagerActor.Get(this); +        if (camManager) { +            camManager.PlayCamSequenceOnPVWServer(camGroupId, camIndex); +        } +    } +} +``` + + +```c++ +// 切换到当前直播区域中的多个workShop +SwitchWorkShopInAreaServer(index: number): void { + // [Server]监听到场景模块切换了直播区域后,自动切换�?0个workshop,当前切换事件用来切换当前直播区域中的多个workshop + let levelControl = this.GetLevelAreaManager() + let liveArea = levelControl.GetCurrentLiveArea() + if (!liveArea) { + console.error('DirectorCamManager@ cannot find LiveAreaBy id') + return + } + let placement = DirectorCamUtil.GetPlacementInCurLiveArea(index, liveArea) + if (!placement) { + console.error('DirectorCamManager@SwitchWorkShopEvent:GetPlacementInCurLiveArea failed') + return + } + + let GroupData = DirectorCamUtil.GetDefaultGroupData(this, placement.UUID) + if (GroupData) { + // 预览:切换workShop后播放第一个分�? + let newPreviewTaskData = new UE.CamTaskDataRPC() + newPreviewTaskData.WorkShopId = DirectorCamUtil.CopyGuid(placement.UUID) + newPreviewTaskData.CamGroupId = DirectorCamUtil.CopyGuid(GroupData.UUID) + newPreviewTaskData.CamIndex = 0 + newPreviewTaskData.OperationId = this.previewTaskData.OperationId + 1 + newPreviewTaskData.StartFrame = 0 + newPreviewTaskData.bPreviewOneFrame = false + this.HandlePreviewTaskDataMulticast(newPreviewTaskData); + + // 预推流:切换workShop后,播放第一个分组的第一个镜头 + let newPVWTaskData = new UE.CamTaskDataRPC() + newPVWTaskData.WorkShopId = DirectorCamUtil.CopyGuid(placement.UUID) + newPVWTaskData.CamGroupId = DirectorCamUtil.CopyGuid(GroupData.UUID) + newPVWTaskData.CamIndex = 0 + newPVWTaskData.StartFrame = 0 + newPVWTaskData.bPreviewOneFrame = false + this.RequestPVWTaskServer(newPVWTaskData); + } +} ``` \ No newline at end of file