2009-10-30 8 views
4

강력하지 않은 하드웨어 (Atom N270 + Intel 945GSM)에서 선택 윤곽 텍스트를 매끄럽게 만드는 방법에 대한 질문이 있습니다 (Qt 4.5.3 사용). 다음과 같이 나의 접근 방식은 다음과 같습니다Qt를 사용한 부드러운 텍스트 애니메이션 (마키 텍스트 효과)

  1. 가 나는 QPixmap (오프 스크린 페인트 장치) 위에 내 텍스트 (굵게 36 x 36 픽셀의 굴림)
  2. 내가 각 30ms의에 남아 만족 x 1 픽셀 이동하는 타이머를 설정립니다.
  3. onTimer 이벤트가 발생하면 QPixmap을 선택하고이 부분을 창 캔버스에 인쇄합니다.

일반적으로 말하면 부드럽게 움직입니다. 그러나 내가 만드는 선택 윤곽 텍스트가 많을수록 CPU 사용량이 늘어납니다. 텍스트가 50 % 화면 (1920x1680)을 채울 수 있으면 CPU 사용량은 약 70-80 %입니다. 텍스트 애니메이션이 조금 깜박입니다. 타이머 간격을 50ms 이상으로 설정하면 부드럽게 작동합니다. 하지만 텍스트가 너무 느리게 움직입니다.

내 방법이 효과가 있습니까? OpenGL을 사용해야합니까? 모든 힌트를 환영합니다. 미리 감사드립니다. ^^)

답변

6

그래픽보기 프레임 워크를 살펴 봐야합니다. QGraphicsTextItem 객체를 QGraphicsScene에 추가하고 뷰의 좌표 (확대/축소 및 변환)를 설정하여 텍스트를 이동하고 원하는 크기로 표시 할 수 있습니다. 일부 텍스트는 "화면 외부"(뷰 외부) . 나는 이것을 타이머 이벤트마다 QPixmap의 (다양한 크기의) 부분을 복사하고 페인팅하는 것보다 훨씬 더 효율적이라고 기대한다.

설명서에는 그래픽보기 프레임 워크가 많은 개체를 한 번에 처리하도록 최적화되어 있다고 나와 있습니다. 더 좋지 않은 것으로 밝혀지면 4.6 베타를 시험해 볼 수 있습니다. 기하 창 뷰 렌더링을위한 최적화가 있습니다.

제쳐두고 애니메이션을 구동하는 데 도움을 준 QTimeLine을 살펴 보겠습니다. 기본적인 "틱"을 주기적으로 제공하는 것 외에도 천천히 시작하여 속도를 높이거나 끝이 가까워 질수록 속도가 느려지는 "곡선 모양"을 설정할 수 있습니다. done() 시그널 후에 QTimeLine을 다시 시작하기를 원한다면, setCurrentTime (0)을 호출하지 않고 지속 시간을 변경하고 start()를 호출하면, 타이머는 이전 지속 시간을 현재 시간으로 시작한다.

+0

전에 QGraphicsSence를 시도했지만 텍스트가 앨리어싱으로 보입니다. 나는 이유를 모른다. 내일 코드를 다시 구현하고 결과를 공유 할 것입니다. – stanleyxu2005

+0

view.setRenderHints (QPainter :: Antialiasing | QPainter :: SmoothPixmapTransform)를했을 때도 QGraphicsPixmapItems를 렌더링 할 때 앨리어싱이 너무 많이 나타났습니다. 그러나 QGraphicsPathItems의 경우 별칭이 눈에 띄지 않습니다. 큰 글꼴을 사용할 때 QGraphicsTextItem을 사용하면 더 좋을 것입니다. QGraphicsScene을 사용해 보았을 때 질문에 설명 된대로 먼저 pixmap에 렌더링 했습니까? – Patrick

+0

예, 먼저 Pixmap QGraphicsPixmapItems에 렌더링합니다. 하지만 QGraphicsTextItem은 선택 윤곽 텍스트 효과를 지원하지 않는다고 생각합니다. – stanleyxu2005