private CameraRenderData CollectCameraRenderData(ProfilerSample profilerSample) { CameraRenderData renderData = new CameraRenderData(); renderData.renderTime = profilerSample.timeUS / 1000.0f; VisitChildren(profilerSample, (sample) => { switch (sample.sampleName) { case "UpdateDepthTexture": renderData.updateDepth = sample.timeUS / 1000.0f; return(true); case "Render.OpaqueGeometry": renderData.opaque = sample.timeUS / 1000.0f; return(true); case "Render.TransparentGeometry": renderData.transparent = sample.timeUS / 1000.0f; return(true); case "Camera.ImageEffects": renderData.imageEffect = sample.timeUS / 1000.0f; return(true); } return(false); }); return(renderData); }
public void ReleaseEvents() { if (_cameraRenderDataList == null) { _cameraRenderDataList = new List <CameraRenderData>(); return; } CameraRenderData camData = null; for (int i = 0; i < _cameraRenderDataList.Count; i++) { camData = _cameraRenderDataList[i]; camData.ReleaseEvent(); } //Status : 이벤트가 생성되었다면 그 전 상태로 변경 if (_status == STATUS.RT_Events) { if (_isMaskParent) { _status = STATUS.RenderTexture; //RT는 유지 } else { _status = STATUS.Camera; //Camera만 갱신된 상태 } } }
public void Clear() { //만약 등록된 카메라가 있다면.. ReleaseAll(); _cameraRenderDataList.Clear(); _cam2CamRenderData.Clear(); _nCameras = 0; _renderCameraType = RenderCameraType.None; _renderCameraType_Prev = _renderCameraType; _mainData = null; _status = STATUS.NoCamera; }
public void ReleaseAll() { if (_cameraRenderDataList == null) { _cameraRenderDataList = new List <CameraRenderData>(); return; } CameraRenderData camData = null; for (int i = 0; i < _cameraRenderDataList.Count; i++) { camData = _cameraRenderDataList[i]; camData.ReleaseAll(); } //Status : NoCamera가 아니라면 Camera만 생성된 상태로 변경 if (_status != STATUS.NoCamera) { _status = STATUS.Camera; } }
// Function //----------------------------------------------- public void Refresh(bool isRefreshForce, bool isUseSRP, apOptMainCamera mainCamera) { //변경 : mainCamera에서 Refresh를 통합으로 하고, 변경 사항이 있는 경우에만 갱신 //그대로 유지할지 확인 if (mainCamera == null) { Clear(); return; } //카메라 상태를 갱신하자. _vrSupportMode = mainCamera.VRSupportMode; switch (mainCamera.GetNumberOfCamera()) { case apOptMainCamera.NumberOfCamera.None: _renderCameraType = RenderCameraType.None; break; case apOptMainCamera.NumberOfCamera.Single: if (_vrSupportMode == apPortrait.VR_SUPPORT_MODE.SingleCamera) { _renderCameraType = RenderCameraType.Single_VR; } else { _renderCameraType = RenderCameraType.Single_NoVR; } break; case apOptMainCamera.NumberOfCamera.Multiple: _renderCameraType = RenderCameraType.Multiple; break; } if (mainCamera._refreshKey != _refreshKey || isRefreshForce || _status == STATUS.NoCamera || _renderCameraType_Prev != _renderCameraType) { //다시 갱신 //삭제할 카메라를 찾자 _cal_curCamRenderData = null; for (int i = 0; i < _nCameras; i++) { _cal_curCamRenderData = _cameraRenderDataList[i]; _cal_curCamRenderData.ReadyToUpdate(); } List <apOptMainCamera.CameraData> mainRenderCameraDataList = mainCamera.RenderCameraDataList; if (mainCamera._refreshKey > 0 && mainRenderCameraDataList != null) { List <CameraRenderData> addedCameraDataList = new List <CameraRenderData>(); //<<추가해야하는 리스트 int nMainRenderCam = mainRenderCameraDataList.Count; apOptMainCamera.CameraData curRenderCamData = null; for (int iMainRCD = 0; iMainRCD < nMainRenderCam; iMainRCD++) { curRenderCamData = mainRenderCameraDataList[iMainRCD]; if (_cam2CamRenderData.ContainsKey(curRenderCamData._camera)) { _cal_curCamRenderData = _cam2CamRenderData[curRenderCamData._camera]; //이건 계속 업데이트 되는 카메라 _cal_curCamRenderData.Update(); } else { //새로 발견된 카메라 CameraRenderData newCamRenderData = new CameraRenderData(_parentOptMesh, curRenderCamData._camera, (_vrSupportMode == apPortrait.VR_SUPPORT_MODE.SingleCamera) #if UNITY_2019_1_OR_NEWER , mainCamera.VRRenderTextureSize == apPortrait.VR_RT_SIZE.ByEyeTextureSize #endif ); newCamRenderData._isUpdated = true; addedCameraDataList.Add(newCamRenderData); } } bool isAnyReleased = false; //업데이트 되지 않은 것은 삭제하자. for (int iCamRD = 0; iCamRD < _nCameras; iCamRD++) { _cal_curCamRenderData = _cameraRenderDataList[iCamRD]; if (!_cal_curCamRenderData._isUpdated) { //저장된 렌더 텍스쳐, 커맨드 버퍼 등을 Release _cal_curCamRenderData.ReleaseAll(); isAnyReleased = true; } } if (isAnyReleased) { _cameraRenderDataList.RemoveAll(delegate(CameraRenderData a) { return(!a._isUpdated); }); } //새로 추가를 하자. if (addedCameraDataList.Count > 0) { _cal_curCamRenderData = null; for (int i = 0; i < addedCameraDataList.Count; i++) { _cameraRenderDataList.Add(addedCameraDataList[i]); } } //Cam 2 Data 갱신 _nCameras = _cameraRenderDataList.Count; _cam2CamRenderData.Clear(); for (int i = 0; i < _nCameras; i++) { _cal_curCamRenderData = _cameraRenderDataList[i]; _cam2CamRenderData.Add(_cal_curCamRenderData._camera, _cal_curCamRenderData); } } _refreshKey = mainCamera._refreshKey; if (_nCameras == 0) { _mainData = null; _status = STATUS.NoCamera; } else { _mainData = _cameraRenderDataList[0]; _status = STATUS.Camera; } _renderCameraType_Prev = _renderCameraType; } _isAllSameForward = mainCamera.IsAllSameForward; _isAllCameraOrthographic = mainCamera.IsAllOrthographic; #region [미사용 코드] ////- 카메라의 개수 ////- 현재 카메라가 유효한지 //bool isNeedToRefresh = false; //Camera[] sceneCameras = Camera.allCameras; //int nSceneCameras = (sceneCameras != null ? sceneCameras.Length : 0); //if (nSceneCameras == 0) //{ // //카메라가 없네요. // if (_numberOfCameraType != NumberOfCameraType.None) // { // Clear(); // } // return; //} //if(!isRefreshForce) //{ // //조건을 체크하자 // if (_numberOfCameraType == NumberOfCameraType.None // || _mainData == null // || _cameraRenderDataList.Count == 0 // || _nCameras == 0 // || _prevNumSceneCamera != nSceneCameras) // { // //초기화 된 상태이거나 씬의 카메라 개수가 다르다면 // isNeedToRefresh = true; // } // else // { // //존재하는 카메라가 유효하지 않다면 // if(_numberOfCameraType == NumberOfCameraType.Single) // { // //1개 일때 // if(!IsLookMesh(_mainData._camera)) // { // //Single 카메라가 제대로 바라보고 있지 않다면 // isNeedToRefresh = true; // } // } // else // { // //여러개일때 // CameraRenderData curCamData = null; // for (int i = 0; i < _nCameras; i++) // { // curCamData = _cameraRenderDataList[i]; // if(curCamData == null // || curCamData._camera == null // || !IsLookMesh(curCamData._camera)) // { // isNeedToRefresh = true; // break; // } // } // } // } //} //else //{ // //무조건 Refresh // isNeedToRefresh = true; //} //if(!isNeedToRefresh) //{ // //카메라를 새로 갱신할 필요가 없다. // //카메라의 Forward와 타입만 비교하자. // _isAllSameForward = true; // _isAllCameraOrthographic = true; // if(_numberOfCameraType == NumberOfCameraType.Multiple) // { // CameraRenderData curCamData = null; // Vector3 mainForward = _mainData._transform.forward; // for (int i = 0; i < _nCameras; i++) // { // curCamData = _cameraRenderDataList[i]; // if(!curCamData._camera.orthographic) // { // //하나라도 Orthographic이 아니라면.. // _isAllCameraOrthographic = false; // } // if(Mathf.Abs(curCamData._transform.forward.x - mainForward.x) > 0.01f || // Mathf.Abs(curCamData._transform.forward.y - mainForward.y) > 0.01f || // Mathf.Abs(curCamData._transform.forward.z - mainForward.z) > 0.01f) // { // //Forward가 하나라도 다르다면 // _isAllSameForward = false; // } // } // } // return; //} ////다시 Refresh를 해야한다. //if(_numberOfCameraType != NumberOfCameraType.None) //{ // //일단 초기화 // Clear(); //} ////씬 카메라를 찾아서 추가하자 //if (nSceneCameras > 0) //{ // Camera curSceneCamera = null; // for (int i = 0; i < sceneCameras.Length; i++) // { // curSceneCamera = sceneCameras[i]; // if (curSceneCamera != null && IsLookMesh(curSceneCamera)) // { // //바라보고 있는 카메라다. > 추가 // CameraRenderData newCamData = new CameraRenderData(_parentOptMesh, curSceneCamera); // _cameraRenderDataList.Add(newCamData); // _camera2RenderData.Add(curSceneCamera, newCamData); // } // } //} //_nCameras = _cameraRenderDataList.Count; //_prevNumSceneCamera = nSceneCameras; //if(_nCameras == 0) //{ // _numberOfCameraType = NumberOfCameraType.None; // _mainData = null; //} //else if(_nCameras == 1) //{ // _numberOfCameraType = NumberOfCameraType.Single; // _mainData = _cameraRenderDataList[0]; //} //else //{ // _numberOfCameraType = NumberOfCameraType.Multiple; // _mainData = _cameraRenderDataList[0]; //} ////새로 갱신 후 카메라의 Forward와 Ortho타입만 비교하자. //_isAllSameForward = true; //_isAllCameraOrthographic = true; //if(_numberOfCameraType == NumberOfCameraType.Multiple) //{ // CameraRenderData curCamData = null; // Vector3 mainForward = _mainData._transform.forward; // for (int i = 0; i < _nCameras; i++) // { // curCamData = _cameraRenderDataList[i]; // if(!curCamData._camera.orthographic) // { // //하나라도 Orthographic이 아니라면.. // _isAllCameraOrthographic = false; // } // if(Mathf.Abs(curCamData._transform.forward.x - mainForward.x) > 0.01f || // Mathf.Abs(curCamData._transform.forward.y - mainForward.y) > 0.01f || // Mathf.Abs(curCamData._transform.forward.z - mainForward.z) > 0.01f) // { // //Forward가 하나라도 다르다면 // _isAllSameForward = false; // } // } //} #endregion }