Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как грамотно реализовать анимацию? 
V
    Опции темы
Alix
Дата 15.12.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 1
Всего: 23



Упрощу задачу, для более легкого понимания (реально все по-другому). Есть текстовой файл, с записями по одной в строке, вида:
timeshift image
где timeshift - время, когда надо отобразить этот image. (не точное, а "после наступления которого").

Программа запускается, запоминает в startTime время запуска (GetTickCount). В дальнейшем в Application.OnIdle вызывается функция, которая берет текущее время currentTime := GetTickCount - startTime, а затем просматривает записи от lastLine (инициализована -1), до той, у которой timeshift не будет > currentTime. По-хорошему, такая запись должна выбраться только одна. Затем рисуется соотвествующая картинка и lastLine меняется на индекс последней обработаной строки.

Вроде все хорошо, но есть три минуса:
1. Сильно грузит процессор
2. Не всегда OnIdle вызывается быстро. Не знаю чем обусловлено, но при нетронутом коде заход в OnIdle может происходить раза в 2-3 реже, в результате анимация начинает жутко тормозить. Почему так происходит пока не понял.
3. Часто OnIdle вызывается при уже вызванном OnIdle. Т.е. функция еще работает, а система решает вызвать ее еще раз. Решал с помощью doing : boolean; При заходе if doing then exit else doing := true, при выходе doing := false;
Использовать timer - не лучшая идея, т.к. работать с интервалом в 10-15 мс он не способен.

Как можно обойти эти недостатки?


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 15.12.2007, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Alix @  15.12.2007,  10:51 Найти цитируемый пост)
Использовать timer - не лучшая идея, т.к. работать с интервалом в 10-15 мс он не способен.

  GetTickCount дает точно такое же разрешение как и таймер. Точнее только мультимедийный таймер и QueryPerformanceCounter 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
OdesitVadim
Дата 3.1.2008, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.11.2007
Где: Одесса:)

Репутация: нет
Всего: нет



я бы сделал по простому.
вначале весь файл загружается, сортируется, что бы картинки шли в нужном порядке. и составляется список пар время показа и адрес картинки. теперь запускаем поток, ставим ему приоритет выше среднего. его основной цикл будет выглядеть так. 
Код

for i:=0 to timelist.count-1 do
begin
  PostMessage(FormHandle, WM_USER, i,0);//FormHandle - заведомо переданный хендл формы, которая обрабатывает отрисовку
  Sleep(timelist[i].time);
end;

использование sleep в потоке вполне разумно - поток просто будет засыпать.
в основной форме делаем обработку сообщения, где то так
Код

procedure MyMess(var msg:TMessage); message WM_USER;
....
procedure TMyForm.MyMess(var msg:TMessage);
begin
  Image1.Picture.LoadFromFile(timelist[msg.wparam].filename);
end;

так как поток основное время будет спать, то приоритет можно сделать немного выше - что бы винда не пропускала его обработку. Единственный недостаток этой системы - в целом последовательность может немного разтянуться. (винда не гарантирует, что она точно выдержить все временные промежутки, но недодерживать она не будет, скорее передержит).
Но это решить просто - у нас ведь есть поле, которое указывает, в какое время нужно показывать картинку. С помощью GetTickCount вначале запоминаем начальное время, а потом в цикле запрашиваем и корректируем задержку.
Но! винда не гарантирует, что выдержит интервалы, которые короче 52 милисекунды. А на серверных вариантах - и все 130 (не уверен в точности числа, но точно чуть больше 100). Поэтому, если у вас будут интервалы меньше 0.1 секунды - то это плохая задумка. В таком случае лучше применить совершенно другие технологии - есть специальные программы, которые с набора картинок могут сделать видеофайл. Может это решит всё проблему?
PM MAIL   Вверх
Alix
Дата 3.1.2008, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 1
Всего: 23



я сомневаюсь в надежности данного метода, т.к. неизвестно сколько времени пройдет от посылки сообщения до приема, да и интервалы там поменьше 50мс будут. Впрочем проблему почти решило использование мультимедийного таймера и иная реализация "спец-эффектов". 
Что до видеофайла, то у отдельных картинок и качество выше будет и размер суммарный меньше.


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1053 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.