다트 웹 애플리케이션에서 60fps로 애니메이션 루프 또는 게임 루프를 구동하려면 어떻게해야합니까?다트와 웹을 사용하여 애니메이션 루프를 60fps로 구동하려면 어떻게해야합니까?
19
A
답변
34
전통적인 window.requestAnimationFrame
의 미래 기반 사촌 인 window.animationFrame
을 사용하십시오.
다트는 비동기 작업을 처리하는 데보다 객체 지향적 인 방법으로 Future 및 Stream을 사용하도록 전환했습니다. 콜백 기반 (이전 '폐기 됨') requestAnimationFrame
은 미래 기반 (새로운 핫) animationFrame
으로 대체되었습니다. 여기
import 'dart:html';
gameLoop(num delta) {
// do stuff
window.animationFrame.then(gameLoop);
}
void main() {
window.animationFrame.then(gameLoop);
}
animationFrame
의 서명은 다음과 같습니다
Future<num> animationFrame();
공지 사항 animationFrame
는 "높은 성능을 보유하고 num
로 완료 미래를 반환하는 방법 타이머 "는 window.performance.now()
과 유사합니다. num
은 현재와 페이지가 시작된 시점 사이에 단조롭게 증가하는 차이입니다. 마이크로 초 해상도입니다.
브라우저가 페이지를 그리기 직전에 미래가 완료됩니다. 이 미래가 완료되면 세상의 상태를 업데이트하고 모든 것을 그립니다.
애니메이션 또는 루프를 계속하려면 모든 프레임에서 새 프레임을 animationFrame에서 요청해야합니다. 이 예제에서 gameLoop()
레지스터는 다음 애니메이션 프레임에서 통지를받습니다.
알아두면 좋겠지 만 game_loop이라는 펍 패키지가 있습니다.
해당 game_loop 링크는 404 – Tgwizman
입니다. 올바른 위치는 다음과 같습니다. http://pub.dartlang.org/packages/game_loop – Tgwizman
어떻게 requestAnimationFrame을 이전에 중단 했습니까? 소스를 보면 Future 기반의 animationFrame은 원래 (이전에 n 개의 버려진) requestAnimationFrame 콜백을 사용하여 완료되도록 완성기를 만듭니다. – paulecoyote