public void CheckTime_Repaint(apEditor.LOW_CPU_STATUS lowCPUStatus) { //if(apVersion.I.IsDemoViolation) //{ // //재생할 수 없다. // return; //} //Repaint 상에서의 경과 시간을 리턴한다. _stopWatch[REPAINT].Stop(); long deltaTime_Repaint = _stopWatch[REPAINT].ElapsedMilliseconds; //SubTimer 갱신 _subTimer[REPAINT].UpdateTime(deltaTime_Repaint); _deltaTimeCount[REPAINT] = deltaTime_Repaint; _prevDeltaTime[REPAINT] = (_deltaTimeCount[REPAINT] / 1000.0f); if (lowCPUStatus == apEditor.LOW_CPU_STATUS.LowCPU_Low || lowCPUStatus == apEditor.LOW_CPU_STATUS.LowCPU_Mid) { //Low CPU에서는 Repaint가 아주 낮은 단위로 호출되는데, //이때 중간중간에 2프레임간 연속으로 실행되면서 FPS가 높은걸로 나타난다. //따라서 일정값의 FPS보다 높다면 (=시간 간격이 짧다면) //그 프레임은 무시해야한다. if (_prevDeltaTime[REPAINT] > 0.01f) { _fps = (int)(1.0f / (_prevDeltaTime[REPAINT] * _subTimer[REPAINT].TimeMultiply)); } } else { if (_prevDeltaTime[REPAINT] > 0.0f) { _fps = (int)(1.0f / (_prevDeltaTime[REPAINT] * _subTimer[REPAINT].TimeMultiply)); } } _stopWatch[REPAINT].Reset(); _stopWatch[REPAINT].Start(); if (lowCPUStatus == apEditor.LOW_CPU_STATUS.LowCPU_Low || lowCPUStatus == apEditor.LOW_CPU_STATUS.LowCPU_Mid) { //LowCPU 모드일때는 //Repaint직후에 불필요한 Update를 막고자 Update용 StopWatch를 리셋한다 _stopWatch[UPDATE].Reset(); _stopWatch[UPDATE].Start(); } }
// Functions //---------------------------------------- public bool CheckTime_Update(apEditor.LOW_CPU_STATUS lowCPUStatus) { //if(apVersion.I.IsDemoViolation) //{ // //재생할 수 없다. // //UnityEngine.Debug.LogError("Timer DemoViolation"); // return false; //} _isValidFrame = false; _stopWatch[UPDATE].Stop(); _stopWatch[UPDATE_ALL_FRAME].Stop(); long deltaTime_Update = _stopWatch[UPDATE].ElapsedMilliseconds; long deltaTime_UpdateAllFrame = _stopWatch[UPDATE_ALL_FRAME].ElapsedMilliseconds; //Sub Time도 계산 _subTimer[UPDATE].UpdateTime(deltaTime_Update); _subTimer[UPDATE_ALL_FRAME].UpdateTime(deltaTime_UpdateAllFrame); _deltaTimeCount[UPDATE] += deltaTime_Update; _deltaTimeCount[UPDATE_ALL_FRAME] += deltaTime_UpdateAllFrame; //Update는 60FPS보다 높으면 프레임 스킵을 해야한다. if (lowCPUStatus == apEditor.LOW_CPU_STATUS.LowCPU_Low) { //약 2FPS if (_deltaTimeCount[UPDATE] > MIN_UPDATE_DELTA_TIME_LOWCPU_LOW) { _prevDeltaTime[UPDATE] = (_deltaTimeCount[UPDATE] / 1000.0); _deltaTimeCount[UPDATE] = 0; _isValidFrame = true; } } else if (lowCPUStatus == apEditor.LOW_CPU_STATUS.LowCPU_Mid) { //약 10FPS if (_deltaTimeCount[UPDATE] > MIN_UPDATE_DELTA_TIME_LOWCPU_MID) { _prevDeltaTime[UPDATE] = (_deltaTimeCount[UPDATE] / 1000.0); _deltaTimeCount[UPDATE] = 0; _isValidFrame = true; } } else { //정상적인 FPS if (_deltaTimeCount[UPDATE] > MIN_UPDATE_DELTA_TIME) { _prevDeltaTime[UPDATE] = (_deltaTimeCount[UPDATE] / 1000.0); _deltaTimeCount[UPDATE] = 0; _isValidFrame = true; } } //Update All Frame은 프레임 스킵 없이 매번 경과 시간을 리턴한다. _prevDeltaTime[UPDATE_ALL_FRAME] = (_deltaTimeCount[UPDATE_ALL_FRAME] / 1000.0); _deltaTimeCount[UPDATE_ALL_FRAME] = 0; _stopWatch[UPDATE].Reset(); _stopWatch[UPDATE].Start(); _stopWatch[UPDATE_ALL_FRAME].Reset(); _stopWatch[UPDATE_ALL_FRAME].Start(); return(_isValidFrame); }