애니메이션을 수행하기 위해 애니메이션 프레임 워크가 필요하지 않지만, 사용자에게 유용 할 수있는 옵션 중 하나입니다.
QTimer가 페인트 이벤트와 동기화되어야한다고 생각 하긴하지만 실제로는 문제가되지 않습니다.
오브젝트가 A에서 B로 이동한다고 상상한다면 프레임 워크없이 처음으로 이와 같은 것을 애니메이션 할 때 많은 사람들이 단순히 업데이트 기능을 가지고 다음과 같이하면됩니다 : -
QPoint pos(pObject->getPos()); // get the current position
pObject->setPos(pos + QPoint(2, 0); // set the position to previous + 2;
이 경우 컴퓨터의 실행 속도에 따라 개체 업데이트가 달라집니다. 컴퓨터가 빠를수록 렌더링 프레임 속도에 관계없이 객체가 더 빨리 움직입니다.
이 문제를 해결하려면 객체가 컴퓨터의 계산 능력에 관계없이 같은 속도로 움직 이도록하려면 업데이트 기능이 필요합니다. 마지막 갱신 및 요소 이후의 시간을 고려 : -에 관계없이 렌더러 개체를 그립니다하는 속도의,
그래서
QPoint updateSpeed(30,0); // speed at which the object will move
int deltaTime = m_timer.elapsed(); // how long since we last updated
QPoint newPos = pObject->getPos() + QPoint(updateSpeed.X() * deltaTime, updateSpeed.Y());
pObject->setPos(newPos);
, 이제 객체의 애니메이션이 시간에 의존 것을, 그것은 항상 실행됩니다 같은 비율. 느린 컴퓨터에서는 업데이트 간 경과 시간이 더 길기 때문에 빠른 컴퓨터와 비교할 때 개체가 이동하는 거리가 더 업데이트됩니다. 서로 다른 속도로 실행되는 두 대의 기계는 동일한 시간 내에 동일한 거리가되도록 대상의 움직임을 보존합니다.
질문에 다시 돌아 가면, 수학 함수에서 위 이미지의 애니메이션 객체가 애니메이션 된 것과 같은 방식으로 시간에 따라 이미지가 업데이트되는 한 이미지를 계산한다고 가정 해 보았습니다. 초당 30 또는 60 프레임의 QPixmap에서 update() 함수를 호출하는 타이머가 필요하며 이미지 데이터 계산 업데이트에 링크 할 필요가 없습니다.
마지막으로 질문에 답변이되지 않는 경우 QPixmap 데이터 생성 방법에 대한 예를 게시하십시오.
Qt는 정말 좋지 않습니다. 부드러운 결과를 얻으려면 Qt 5.1, QML을 사용하고, 셰이더 프로그램 (GPU)으로 이미지를 계산하는 것이 바람직합니다. Qt로 60fps를 부드럽게하는 것이 최선의 방법이라고 생각합니다.또는 QTimer로 얻을 수있는 적절한 간격으로 해결하십시오. 데스크톱 응용 프로그램에서는 완전히 부드럽지는 않지만 아마도 괜찮습니다. – hyde