2013-08-29 2 views
3

QPixmap 1024x128 (수학 함수가 그림을 그립니다)을 업데이트해야합니다 ... 30 초 ... 60 번, 애니메이션 프레임 워크를 사용하고 싶지 않습니다. 그게 과도하다고 생각합니다. 수학 함수는 1/60 초보다 훨씬 빠르게 작동하며 작업에 일정한 시간이 걸리므로 문제가되지 않습니다.애니메이션 프레임 워크가없는 Qt 애니메이션

QTimer를 초당 30 ... 60 틱 (TPS)으로 사용해야하고 타이머 슬롯에서 update()를 호출해야합니까? 그러나 QTimer는 실제 화면 업데이트와 동기화되지 않으며 QTimer가 정확하지 않습니다. QTimer 속도가 너무 낮거나 (부드러운 동작이 아님) 또는 너무 높습니다 (너무 많은 CPU 사용) - 좋은 방법을 찾는 방법? 내 실험은 내 리눅스와 윈도우 테스트 기계가 매끄러운 업데이트를 얻기 위해 다른 QTimer 간격을 필요로한다는 것을 보여주었습니다 : Linux : 30 TPS, windows : 50 ... 60 TPS (나는 1000/30 msec를 설정하면 견고한 움직임을 보았습니다).

어쩌면 애니메이션 프레임 워크를 잘못 이해하고 실제로이 작업에 매우 간단하고 적절합니까?

+0

Qt는 정말 좋지 않습니다. 부드러운 결과를 얻으려면 Qt 5.1, QML을 사용하고, 셰이더 프로그램 (GPU)으로 이미지를 계산하는 것이 바람직합니다. Qt로 60fps를 부드럽게하는 것이 최선의 방법이라고 생각합니다.또는 QTimer로 얻을 수있는 적절한 간격으로 해결하십시오. 데스크톱 응용 프로그램에서는 완전히 부드럽지는 않지만 아마도 괜찮습니다. – hyde

답변

1

롱 샷이지만 애니메이션 프레임 워크를 배제하면 많은 옵션을 남기지 않습니다. 수학 함수가 모든 프레임을 미리 계산할 수있는 경우에만 작동하는 하나의 아이디어는 애니메이션 GIF 또는 MNG를 즉시 평가하여 QMovie로 재생하는 것입니다. 그러나 오버 헤드에서 나는 그것이 애니메이션 프레임 워크보다 낫다고 확신하지 못합니다.

1

애니메이션을 수행하기 위해 애니메이션 프레임 워크가 필요하지 않지만, 사용자에게 유용 할 수있는 옵션 중 하나입니다.

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 데이터 생성 방법에 대한 예를 게시하십시오.

+0

** 느린 컴퓨터에서는 업데이트 간격이 길어서 개체의 거리가 업데이트됩니다. 더 빠른 컴퓨터와 비교하여 업데이트 사이에 더 많은 시간이 소요됩니다. ** 극한 상황에서 고르지 못한 움직임 효과가 발생하지 않습니까? – Greenflow

+1

@Greenflow, 당신 말이 맞아요. 기계가 잘 견딜 수 없다면, 도약을 볼 수 있습니다. 네트워크 비디오 게임을 할 때와 같은 지연 시간이지만, 일정량이 아닌 시간을 기준으로 애니메이션을 수행하는 방법입니다. 모든 움직이는 물체는 시간을 기준으로 거리를 이동합니다. 움직이는 물체를 관찰하는 방식 때문에 바뀌지 않아야합니다. 네가 일정한 속도로 달리고 잠깐 눈을 감는다면, 내가 다음에 눈을 뜰 때 너를 본 마지막 장소에 가지 않을거야. – TheDarkKnight

+0

@ Merlin069 내 질문과 관련성이 낮음. QTimer 인터페이스는 밀리 초 단위로 작동하고 기계 속도 종속 코드가 캡슐화되어 있기 때문에 설명했던 빠름 느린 문제를 생각할 필요가 없습니다. 내 질문을 업데이트하고 새 주제를 만들었습니다. http://stackoverflow.com/questions/18528300/choppy-scrolling-of-qpixmap-using-qt-animation-framework – pavelkolodin