Frontend/Three.js

애니메이션 성능 보정

wam 2024. 8. 28. 01:48


애니메이션 성능 보정

 

  • 사용자마다 다른 기기에서 사용
  • 컴퓨터 성능에 따라 움직이는 속도가 다를 수 있음

 

주의 getElapsedTime()와 getDelta()은 동시에 사용하면 값이 꼬이기 때문에 동시에 사용하지 말자

 

 

성능 보정 : 경과시간 clock.getElapsedTime()

 

clock.getElapsedTime() 메서드를 사용하여 경과시간으로 성능 보정하기

 

  • 실행 시점으로부터 총 경과 시간
  • 초 단위로 찍힘
  • 성능이 시간에 영향을 주지 않음 (절대 시간)

 

 

기존

// 1초에 60도씩 돌아간다.
mesh.rotation.y += THREE.MathUtils.degToRad(1);

 

 

성능 보정

// 1도 대신 경과 시간을 넣기

const time = clock.getElapsedTime() ;
mesh.rotation.y = time; // +=로 값을 더해 주는 것이 아니라 = 로 초 자체를 사용하면 됨.
// mesh.rotation.y = 10 * time; // 속도를 올리고 싶을 때

 

 

성능 보정 : 실행 간격 clock.getDelta()

 

clock.getDelta() 메서드를 사용하여 함수 실행 간격 시간으로 성능 보정하기

 

  • 함수가 한 번 실행될 때마다 그 시간 간격 즉, 시간차를 나타낸다.

 

 

기존

// 1초에 60도씩 돌아간다.
mesh.rotation.y += THREE.MathUtils.degToRad(1);

 

 

성능 보정

// 1도 대신 실행 간격 넣기

const delta= clock.getDelta() ;
mesh.rotation.y += delta; // 일정한 값이 기 때문에 += 을 사용해서 증가 시키기

 

 

다른 방법의 성능 보정 : 자바스크립트 내장 기능을 이용 Date.now()

 

자바스크립트 내장 기능 Date.now() 메서드를 사용하여 성능 보정하기

 

  • Date.now() 메소드는 UTC 기준으로 1970년 1월 1일 0시 0분 0초부터 현재까지 경과된 밀리초를 반환합니다. __mdn 문서

 

 

성능 보정

	let oldTime = Date.now(); // 처음 실행되는 시점

	function draw() {
		const newTime = Date.now();
		const deltaTime = newTime - oldTime; // 시간차 계산
		oldTime = newTime; // 지금 실행 시간으로 변경
		// deltaTime 값이 기본적으로 크기 때문에 소수점으로 값 계산
		mesh.rotation.y += deltaTime * 0.005;
		mesh.position.y += deltaTime * 0.001;
		
		if (mesh.position.y > 3) {
			mesh.position.y = 0;
		}
		renderer.render(scene, camera);

		// window.requestAnimationFrame(draw);
		renderer.setAnimationLoop(draw);
	}

컴퓨터 화면 주사율에 따라 값은 달라진다.