13 KiB
Raw Blame History

TsScreenPlayerTextureRenderer

   - MultiViewActor: UE.MultiViewActor;// 用于渲染pvw/pgm画面

  • ReceiveBeginPlay() =>
    • this.RegisterLocalEventListener(); =>
      • this.ChangeCameraTask(TaskData);

RegisterLocalEventListener

private RegisterLocalEventListener(): void {
	this.PVWCameraChangeFunc = (TaskData: UE.CamTaskDataRPC) => {
		if (this.CurTag == DirectorMode.PVWCameraRenderer) {
			this.ChangeCameraTask(TaskData);
		}
	}
	this.PGMCameraChangeFunc = (TaskData: UE.CamTaskDataRPC) => {
		if (this.CurTag == DirectorMode.PGMCameraRenderer) {
			this.ChangeCameraTask(TaskData);
		}
	}
	this.SwitchDirectorNetTagFunc = (oldTag: UE.GameplayTag, newTag: UE.GameplayTag) => {
		this.SwitchDirectorNetTagCallback(oldTag, newTag);
	}

	DirectorEventSystem.RegisterEventListener(this, DirectorEvent.OnPVWTaskRequested, this.PVWCameraChangeFunc);
	DirectorEventSystem.RegisterEventListener(this, DirectorEvent.OnPGMTaskRequested, this.PGMCameraChangeFunc);
	DirectorEventSystem.RegisterEventListener(this, DirectorEvent.SwitchDirectorMode, this.SwitchDirectorNetTagFunc)
}

ChangeCameraTask

    ChangeCameraTask(TaskData: UE.CamTaskDataRPC) {
        if(!this.bStarted){
            return;
        }
        
        if(this.DirectorCamManagerActor == null){
            this.DirectorCamManagerActor = this.GetCameraManagerActor();
        }
        // double check
        if(this.DirectorCamManagerActor == null){
            return;
        }
        
        if (this.Task) {
            this.Task.Stop();
        }
        this.Task = DirectorCamUtil.CreateCamTask(this, TaskData, CamTaskType.FullStream, this.DirectorCamManagerActor.droneCamera, null, this.DirectorCamManagerActor.handHeldCamera)
        if (this.Task) {
            this.Task.Start()
            this.BindCamera(this.Task.TryGetBindedMainCamera());
        }
    }

DirectorCamGroup.cpp

UDirectorSequencePlayer* UDirectorCamGroup::GetDirectorSequencePlayerFromPool(int CamIndex, bool IsPreview)
{
	TargetPlayer = NewObject<UDirectorSequencePlayer>(this);  
	TargetPlayer->SetCamSequence(CamIndex, SequenceActor);  
	if(IsPreview)  
	{  
	    CachedPreviewingPlayer.AddUnique(TargetPlayer);  
	}  
	else  
	{  
	    CachedStreamingPlayer.AddUnique(TargetPlayer);  
	}
}

PVW & PGM红框效果代码 TsDirectorCamManagerActor.ts

//客户机加入流程:
//连接Server->同步当前场景->场景加载完成后收到本地事<E59CB0>?->初始化workShop
//->确认机器身份,执行本机任务(异步任务处理流程)

//异步处理流程:根据机器的性能,加入时间不同,状态差异自适应处理任务逻辑
// 服务端收到任务请<E58AA1>?->确保服务端的workShop初始化完<E58C96>?->处理数据及同<E58F8A>??
// ->客户机收到同步数据后->等待自己的workshop初始化完<E58C96>?->处理自己的逻辑
// 同一种任务只处理最近一<E8BF91>?

HandlePreStreamTaskByNetTag()

相关切区域与切镜代码会调用RequestPVWTaskServer() RequestPVWTaskServer() => RequestPVWTask() => HandlePreStreamTaskDataMulticast() => HandlePreStreamTaskByNetTag()

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日志

[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 不对

日志

Puerts: (0x000009E309FB5E30) request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:B3441B7649E66555CCB558B2C0FD2872, Index=0, StartFrame:0
LogLevelSequence: Starting new camera cut: 'ZhuJiwei_Zheng16-24mm_5'
Puerts: (0x000009E309FB5E30) 130mm bug用log,其他相机1 bindingCam逻辑,ZhuJiwei_Zheng16-24mm_5
Puerts: (0x000009E309FB5E30) 130mm bug用log,其他相机2 bindingCam逻辑,ZhuJiwei_Zheng16-24mm_5
Puerts: (0x000009E309FB5E30) 130mm bug用log,ChangeSequenceCamTarget FullStream Other
Puerts: (0x000009E309FB5E30) 设置相机目标: Idol.BeiLa 0
Puerts: (0x000009E309FB5E30) PVW Task: 线下 单唱站\nFastRhythm ZhuJiwei_Zheng16-24mm
Puerts: (0x000009E309FB5E30) request PVW: WorkShop:3F855CF84C91BBD9207C0FAF5273586C, CamGroup:DDB1F27A44E7E5B312830A828EB55464, Index=0, StartFrame:0
Puerts: (0x000009E309FB5E30) Nice Playing Sequence:LevelSequenceActor_2:BP_lengthtest_1
Puerts: (0x000009E309FB5E30) RebindTarget: BP_BeiLa_Costume_C_0
PIE: Warning: Sequence did not contain any bindings with the tag 'Beila' LevelSequenceActor_2
LogLevelSequence: Starting new camera cut: 'CineCameraActor_Focus130MMTest_1'
Puerts: (0x000009E309FB5E30) 130mm bug用log,其他相机1 bindingCam逻辑,CineCameraActor_Focus130MMTest_1
Puerts: (0x000009E309FB5E30) 130mm bug用log,其他相机2 bindingCam逻辑,CineCameraActor_Focus130MMTest_1
Puerts: (0x000009E309FB5E30) 130mm bug用log,ChangeSequenceCamTarget FullStream Other
Puerts: (0x000009E309FB5E30) 设置相机目标: Idol.BeiLa 0
Puerts: (0x000009E309FB5E30) PVW Task: 线下 贝拉2024生日 BP_lengthtest_1
LogBlueprintUserMessages: [BP_Cine_Cam_FOV_1] 35.0

可能的相关代码

    // 播放指定相机到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('当前镜头不存<E4B88D>?,切换无效!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);
        }
    }
}
// 切换到当前直播区域中的多个workShop
SwitchWorkShopInAreaServer(index: number): void {
	// [Server]监听到场景模块切换了直播区域后自动切换<E58887>?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后播放第一个分<E4B8AA>?
		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);
	}
}