PDA

Просмотр полной версии : когда тормозят анимации


Юрчик
15.04.2007, 23:53
Привет.
Я столкнулся с одной проблемой:
у меня три анимации на одной сцене, когда вывожу две - все ровно,
но если я добавляю третью - анимации начинают притормаживать и воспроизводятся то нормально, то медленно. В итоге получается не очень красивое зрелище. вес файла около 65 kb. количество fps - 120.
Подскажите пожалуйста где можно найти ответ на эту проблему.
Я не программист и анимации делал анимационно. Слышал что можно убирать режим времени, но как и поможет ли это в данной ситуации - не знаю.
Заранее спасибо.

aksios
16.04.2007, 00:16
не реальный fps

Kikasso
16.04.2007, 00:21
Ставьте 31 кадр в сек. Это волшебное число.

etc
16.04.2007, 01:05
Юрчик, а у тебя Oblivion 120 fps показывает?

Юрчик
16.04.2007, 13:18
Юрчик, а у тебя Oblivion 120 fps показывает?
в смысле? я не понял:(

Юрчик
16.04.2007, 13:24
поставил 31- чудеса:umnik2: :umnik2: :umnik2:
Все ровно, но почему??? теоретически не не должно быть так:eek:

CorC
16.04.2007, 13:33
Вам же написали: "Это волшебное число"
По поиску на эту тему не пробовали искать?

З.Ы.: Oblivion - это ES4 игра такая :)

k0zer
16.04.2007, 15:36
Вам же написали: "Это волшебное число"
По поиску на эту тему не пробовали искать?

Я искал - не нашел. Будь добр, просвети? :))

aksios
16.04.2007, 15:47
Я искал - не нашел. Будь добр, просвети? :))
Просто человек воспринимает максимум 24 кадра в сек., с учетом тормозов браузера, плеера и т.п. берут частоту 28-32 кадра в сек.;)

k0zer
16.04.2007, 16:49
А почему именно 31? )) А не 30?
30 - число круглое, и во многих видео стандартах эта цифра присутствует

etc
16.04.2007, 17:03
Причем тут флеш и видео-стандарт?

k0zer
16.04.2007, 17:54
подумай

etc
16.04.2007, 18:12
Не вижу связи. Флеш это флеш, видео — это видео.

_bkt
16.04.2007, 18:21
http://flash-ripper.com/archives/000851.php - статья называется "Волшебная Частота, 21 и 31 FPS"

ARTur2
16.04.2007, 19:40
А как быть если магическое число 31 на сработало??? Конкрентно меня интересует, как можно оптимизировать графику в целом(по поиску ничего конкретного не нашёл)?

etc
16.04.2007, 19:41
Уменьшить количество прозрачности, узловых точек и вообще уменьшить количество одновременно отображаемых объектов, использовать cacheAsBitmap, а также перевод некоторой векторной графики в растровую.

ARTur2
16.04.2007, 19:55
А что такое cacheAsBitmap?Опять же в поиске нашёл, что некорорые советуют его включить, а как и что это никто не говорит...
У меня ещё такой вопрос. Есть клип(вмоём случае это карта города), в клипе несколько слоёв(дороги, дома, леса и т.д.). Все эти "элементы" у меня в виде графики, причём её я обрисовывал сам, и если я правильно понимаю всю суть - это вектор. Можно ли преобразовать её в растр?

etc
16.04.2007, 19:59
Про cacheAsBitmap исчерпывающая информация в документации к Flash 8.
По второму вопросу: да, можно либо внешним редактором, либо опять же, включить использование кеширования в битмап (объект будет преобразовываться в битмап налету, только для карты данный момент метод врядли подойдет).

ARTur2
16.04.2007, 20:04
хорошо, поробую разобраться. Большое спасибо за совет!

ARTur2
16.04.2007, 20:12
Вот пример из хелпа:
function clickBtn():Void {
var circleClip:MovieClip;
for (var i:Number = 0; i<circlesArr.length; i++) {
circleClip = circlesArr[i];
circleClip.cacheAsBitmap = !circleClip.cacheAsBitmap;
}
}

не могли бы Вы объяснить что это за функция... ?

etc
16.04.2007, 20:20
В хелпе такого примера нет.
Изучаем: http://livedocs.adobe.com/flash/9.0/main/00001899.html

ARTur2
16.04.2007, 20:21
Вроде бы разобрался и в свой код:
public function Navigator() {
this.onLoad = function() {
this.createEmptyMovieClip("picture", this.getNextHighestDepth());
this.createEmptyMovieClip("viewArea", this.getNextHighestDepth()).createEmptyMovieClip("mask", this.getNextHighestDepth());
this.createEmptyMovieClip("redRect", this.getNextHighestDepth());
this.createEmptyMovieClip("clickArea", this.getNextHighestDepth());
this.picture.attachMovie(this.mc, "my_mc", this.getNextHighestDepth());
this.viewArea.attachMovie(this.mc, "my_mc", this.getNextHighestDepth());

добавил следущее:
public function Navigator() {
var my_mc:MovieClip; this.onLoad = function() {
this.createEmptyMovieClip("picture", this.getNextHighestDepth());
this.createEmptyMovieClip("viewArea", this.getNextHighestDepth()).createEmptyMovieClip("mask", this.getNextHighestDepth());
this.createEmptyMovieClip("redRect", this.getNextHighestDepth());
this.createEmptyMovieClip("clickArea", this.getNextHighestDepth());
this.picture.attachMovie(this.mc, "my_mc", this.getNextHighestDepth());
this.viewArea.attachMovie(this.mc, "my_mc", this.getNextHighestDepth());
my_mc.cacheAsBitmap = !my_mc.cacheAsBitmap; this.viewArea.setMask(this.mask);
но по-моему ничего не изменилось... тормозов меньше не стало... Может я что-то не правильно делаю?

по поводу примера он у меня тут лежит : boot drive\Program Files\Macromedia\Flash 8\Samples and Tutorials\Samples\ActionScript\CacheBitmap.

etc
16.04.2007, 20:26
Так надо читать справку!

Зачем объявлять onLoad в конструкторе? Вы же не на AS1 пишете, так ведь? Объявите метод onLoad, как полагается. А в конце добавить:
this.cacheAsBitmap = true;

Только лучше cacheAsBitmap ставить непосредственно на ролик с картой.

ARTur2
16.04.2007, 21:27
БОЛЬШОЕ ВАМ СПАСИБО!!!!!!!!!!!!!!!! всё заработало просто идеально!!!! Вы просто спасли меня!!!!

k0zer
18.04.2007, 01:40
Не вижу связи. Флеш это флеш, видео — это видео.
Способ создания иллюзии движения на экране существует только один. Это быстрая смена кадров со смещением изображения на них, так чтобы человек не замечал дискретности движения. Умные дяди (причем умные во множестве областей) не зря придумали число 30, видимо серьезные исследования проводили. И тут не имеет значение видео это или флеш, хотя флеш в большинстве это интерактивные видеоролики. Как тут можно не видеть связи, для меня загадка.

http://flash-ripper.com/archives/000851.php - статья называется "Волшебная Частота, 21 и 31 FPS"
Спасибо за статью, правда автор по-моему сам не догоняет смысл чисел. Дурацкий пример привел, его там в комментах поругали.
Ну и очень порадовала фраза:
"Ответ заключается в том, что значение частоты кадров, FPS, хранится в числе с плавающей запятой формата "16/16" (можно также встретить обозначение "16.16"). В таком числе 16 бит отводится под целую часть, и 16 бит -- под дробную."
Вроде ясно становится что человек не понимает то о чем говорит.
Если ошибаюсь - поправьте меня.

etc
18.04.2007, 01:43
k0zer, тебя же не смущает то, что при 30 фпс в 3D игры играть невозможно? Здесь нельзя делать обобщений, не кино смотрим. Уж тем более, никогда про 30 не слышал. Слышал про 21, 24, 25, 31, остальное — нет.
Если религия не позволяет, пользуйся 30, не заставляем. Вести разговоры на тему, что 31 есть правильно я не буду, потому что лень и уже говорили на эту тему.

iNils
18.04.2007, 02:03
PAL/SECAM - 25 кадров (Европа)
NTSC - 30 кадров (АМЕРИКА/АЗИЯ)
Но каждый кадр формируется из двух полукадров, поэтому часть общего изображения меняется чаще - 50 и 60 полукадров в секунду. Но речь идет о телевиденье, где частота фиксирована. На мониторах все происходит по другому. Поэтому k0zer не понимает о чем говорит. swf хранит в себе информацию о частоте смене кадров, но хранит не фпс, а время отводимое на каждый кадр, то есть фпс 30 записывается как 1000/30 = 33,3(3). Как видим 33,3(3) дробное число и оно записывается в формате 16.16 и дробная часть получается не точной и и при переводе в фпс со временем накапливается ошибка которая дают скачки в плавной анимации. При частоте фпс 21 и 31, это ошибка минимальна и скачок менее заметен.

k0zer
18.04.2007, 02:06
>>k0zer, тебя же не смущает то, что при 30 фпс в 3D игры играть невозможно?
30 - NTSC (по-моему), плюс чересстрочная 60 ))

Не смущает, я сам это знаю и даже догадываюсь почему )). Кстати смотря какая игра, если КС то и на 30 не страшно. А если Ку3 то для комфорта мин для 120 )).

Я религиозные войны вести не люблю и не собираюсь. Я даже верю, что 31 это хорошо и всегда ее ставлю последнее время. Но в той статье что дал _bkt по-моему фигня написана, а не обьяснение.
Если не очень лень, был бы признателен получить ссылку на то, где говорили на эту тему.

etc
18.04.2007, 02:06
Ах да, NTSC. Ну не в счет, в общем-то.
А ссылочки в поиске надыбать можно, правда-правда.

k0zer
18.04.2007, 02:08
PAL/SECAM - 25 кадров (Европа)
NTSC - 30 кадров (АМЕРИКА/АЗИЯ)
Но каждый кадр формируется из двух полукадров, поэтому часть общего изображения меняется чаще - 50 и 60 полукадров в секунду. Но речь идет о телевиденье, где частота фиксирована. На мониторах все происходит по другому. Поэтому k0zer не понимает о чем говорит. swf хранит в себе информацию о частоте смене кадров, но хранит не фпс, а время отводимое на каждый кадр, то есть фпс 30 записывается как 1000/30 = 33,3(3). Как видим 33,3(3) дробное число и оно записывается в формате 16.16 и дробная часть получается не точной и и при переводе в фпс со временем накапливается ошибка которая дают скачки в плавной анимации. При частоте фпс 21 и 31, это ошибка минимальна и скачок менее заметен.
1000/25 = 40 ровно

k0zer
18.04.2007, 02:10
Ах да, NTSC. Ну не в счет, в общем-то.
А ссылочки в поиске надыбать можно, правда-правда.
Честное слово искал, но безуспешно. Видимо не те ключевые слова.
Я понимаю, что модераторов достают одни и теже вопросы, по-этому предпочитаю поиском пользоваться.

iNils
18.04.2007, 02:12
1000/25 = 40 ровноЕсли смотрел внимательно, то мой коммент в той статье был второй и я именно об этом писал, но как оказалось все на много сложнее.

k0zer
18.04.2007, 02:15
Если смотрел внимательно, то мой коммент в той статье был второй и я именно об этом писал, но как оказалось все на много сложнее.
Не заметил ))
Мне кстати понравилось ещё, цитирую: "преобразовываем в hex со отбрасыванием дробной части, получаем 41.(6)=29h
преобразовываем обратно 29h=41". Зачем преобразовывать в 16рич? у десятич. дробную часть не отбросить? )) В компе все-равно все двоичное, вобщем не понял я. ))
А где-нибудь почитать об этом можно, что намного сложнее?
Ну или если можно здесь высказать.

wvxvw
19.04.2007, 03:00
31 кадр\сек - стандарт американского телевидения.

iNils
19.04.2007, 03:01
31 кадр\сек - стандарт американского телевидения.
http://www.broadcasting.ru/wiki/index.php?title=NTSC
30!

wvxvw
19.04.2007, 03:14
хм.. ну раз википедия говорит 30, значит 30... сорри. пропустил страницу, сейчас перечитал. Я думаю, еще потому что 31 - простое число, и точно не будет дискретности. В смысле, не получится так, что каждый тик (несколько тиков) экрана м видим одну картинку, а за ней другую сразу же. А вместо этого произойдет частичная смена на предыдущем и следующем тике - но это только мои предположения, ни чем не подтвержденные %)

Ash Rivers
04.02.2008, 17:09
А вот такой флэш-информер есть:

http://ubp.com.ua/xml/n-inf-b.swf

Представляет из себя зацикленную бегущую строку с заголовками новостей и картинками к ним, подгружаемыми из формируемого PHP-скриптом XML-файла.
Никак не получается побороть "скачки" текстовых и графических блоков.
Пробовал и cacheAsBitmap (хотя подтягиваемые картинки по сути и являются этими самыми Битмапами), и fps ставил как в 31 так и в 21 кадр ... Ставил даже, ради эксперимента, от "1" до "31" кадра. Скорость - меняется, скачки - остаются) =(
Быть может кто-то сталкивался с подобной проблемой при воспроизведении роликов с динамически подгружаемыми данными?..

P.S. По ссылке, напрямую, флэшка может не грузить заголовки/картинки, а вот на главной > http://ubp.com.ua/ < проблема проявляет себя в полной красе ...


[update : 4.02.08 // 18:00]

Методом установки счётчика кадров (http://www.flasher.ru/forum/showthread.php?t=107526) выяснился интересный факт: установленный fps реально не дотягивает до выдаваемого результата. Совпадение происходит только при установленном 1 и 2 fps %) Далее уже идут расхождения.
Так, при установленном значении в 3 fps выдаёт 2 fps, при 28 fps выдаёт 26 fps, при 31 fps даёт 29 fps и т.д.
Но даже завысив заданное значение fps до "35" и получив на выходе цифру 31-32, прокрутка всёравно продолжает дёргаться =(