PDA

Просмотр полной версии : ограничение области отрисовки


zafod
01.08.2007, 10:06
флеш конечно так или иначе рисует все, но может есть какая-то технология, которая указывает что перерисовывать надо только определенную область. Я просто долго занимался directX - и это реально прибавляло скорости.
Единственный вариант который я нашел - это tile map, грубо говоря реисовать только тайлы, которые попадают в область экрана и перерисовывать только те где произошли изменения.
Очень буду благодарен за ссылки или примеры по поводу

iNils
01.08.2007, 13:39
Собственно флеш перерисовывает только ту часть которая изменилась.

showRedrawRegions (true);
Показывает ту самую область перерисовки.

Wolsh
01.08.2007, 14:18
iNils - Которая изменилась, но независимо от того, видима она или нет.
Хочется чтоб невидимые сейчас области не жрали ресурсов.

iNils
01.08.2007, 14:28
А они не расходуется. Это легко проверить.
Возьмите файл в аттаче и запустите, посмотрите как тормозит анимация. А теперь зайдите в объект, раскомментируйте там строчку кода, запустите еще раз и посмотрите на скорость работы.

Wolsh
01.08.2007, 22:15
Что-то ты не понимаешь никак :) Речь идет о графике и анимации, находящейся за границами Стейджа, т.е. невидимой пользователю :)
Ресурсы она жрет или по-твоему не жрет? Не про редрав-функцию речь вообще, она наверняка ничего не жрет, ктож спорит. А вот в мультике я двигаю "сцену", типа перемещаю камеру, а у меня там фильтров-блендов-альфов как ворон в москве. И хотя половину объектов давно уже не видно, все они просчитываются, уж это-то точно по фпс видно. Так вот и был вопрос- как можно если можно вообще это дело прекратить? И считать только то, что реально в данный момент в окошке плеера видно.

iNils
01.08.2007, 22:50
Вы об этом... Опять же, берем мой пример выше и убираем все объекты далеко за пределы видимой области, но один оставим на месте. И что, у вас производительность не возрасла? У меня в разы быстрее работает, чем когда все линии видимы.

etc
01.08.2007, 23:04
Плеер не занимается отрисовкой объектов, расположенных вне сцены.

Wolsh
02.08.2007, 00:47
А чем тогда? просчетом? Ну вот здесь (http://wolsh.pisem.net/flashcard/ulik_cameraMove.rar) у меня на 290 кадре :) если дождетесь, за областью видимости вводится новый объект класса цветочек, и fps падает в два раза. Цветок же появится в области видимости только в 300 кадре, и на fps это уже никак не повлияет.

iNils
02.08.2007, 01:35
Wolsh, без fla о чем может идти речь? :)

Wolsh
02.08.2007, 01:49
Не, ребят, я это-то от сердца оторвал - не люблю недоделки показывать.
Фла здесь ничем не поможет - анимация как анимация, никаких скриптов принципиально (не считая, понятно, счетчиков)
Еще раз - на 290 фрейме рисуется объект цветок, пока еще за пределами экрана. До этого его нет на сцене. Теперь он появляется на сцене и fps падает. Но мы его еще не видим - он за рамкой. И появляется в поле видимости в 300 фрейме. ФПС при этом не меняется.
Я делаю вывод что он таки отрисовывается, хотя и за пределами экрана.

iNils
02.08.2007, 02:48
1. Все фильтры запускают cacheAsBitmap
2. Перерисовка внутри клипа с фильтрами, кеширует заново.

zafod
02.08.2007, 07:17
я тоже заметил за плеером такой косяк - у меня есть 20 тайлов, 10 из них попадают на Stage, так вот,даже если найл не изменился - онвсе равно его отрисовывает, тут я просто не парюсь сам перерисовываю нужные тайлы. Далее, тайлы, что за пределами Stage - если, пока они не видны в них ничего не аттачить - то скорость заметно выше.

+ по идее фильтры могут растрезовать и дать прирост скорости? а память как?

etc
02.08.2007, 10:27
Еще раз - на 290 фрейме рисуется объект цветок, пока еще за пределами экрана. До этого его нет на сцене.
Тормозит потому что движется ствол, а не отрисовывается цветок.

Wolsh
02.08.2007, 12:13
Ствол (а точнее вся сцена) начинает двигаться гораздо раньше.
Падение фпс точно совпадает с появлением на сцене цветка.
Таким образом дело всёже в нем. А значит плеер отрисовывает/просчитывает объекты даже если они не видны.
iNils, дело не в том что там кэшируется-не кэшируется, а в том что это делается независимо от того, надо ли это в данный момент показывать на экране.

etc
02.08.2007, 13:30
Честно говоря оно в целом само по себе тормозит неимоверно, так что…
Пока исходника не будет, делать выводы на пустом месте нет смысла.

iNils
02.08.2007, 14:10
Таким образом дело всёже в нем. А значит плеер отрисовывает/просчитывает объекты даже если они не видны.Выше я приводил примеры того, что объекты не отрисовываются. Значит проблема в твоей реализации.

Wolsh
06.08.2007, 01:53
Я не то чтобы наглый, просто хочется до истины докопаться.
Вот появилось время, сделал еще два файлика из той же улитки. (http://wolsh.pisem.net/flashcard/ulitki.rar)
В одном из них я просто удалил цветок. Обрати внимание, __etc, снижения fps не происходит вообще. (файл ulik_withoutFlower.swf).
В другом варианте я сделал так, что цветок появляется на сцене на том же 290-м кадре, но гораздо дольше не показывается в поле видимости, оставаясь "за кадром". Так долго, что мог бы и вообще не появиться. Тем не менее fps падает как и раньше, и точно также не меняется в тот момент, когда цветок наконец становится виден. (файл ulik_standFlower.swf). Представь себе, __etc, что этот цветок со всеми своими фильтрами начал бы отрисовываться только в тот момент, когда его попка пересекла границу видимого поля. Я думаю, торможение было бы неизбежно.

iNils, конечно дело в реализации. Но уверяю тебя, я нигде в коде не писал draw.outStageObjects = allwaysTrue (шутка блин). Твой пример говорит только что в твоем примере это так, а в моем - иначе. Другая нагрузка, другая глубина вложенности мувиков, другое их кол-во, другие фильтры. В результате - я утверждаю что цветок отрисовывается/просчитывается за пределами видимости, и прошу отнестись серьезно и не выдавать желаемое за действительное. Мне бы тоже хотелось, чтобы не отрисовывал, и автору начального поста - тоже.

etc
06.08.2007, 10:09
Мы уже условились, что без fla и 120 fps разговаривать на эту тему не будем.

zafod
06.08.2007, 11:08
showRedrawRegions нам ясно говорит, что отрисовывается и за пределами экрана.
Вставте эту строчку себе в код. Красными квадратами он помечает области перерисовки.
Теперь объект выносим за пределы экрана.
Вуаля - он за пределами, но тоже в красном квадрате!!! Значит и за пределами вмдимости флеш его рисует каждый кадр

Kikasso
06.08.2007, 11:41
снижения fps не происходит вообще.
Куда уж ниже - у меня 7 fps кажет.

Wolsh
06.08.2007, 12:12
2 Kikasso У меня и пять бывает. Если будет всё так легко, как хочет __etc, мы ничего не увидим.
Еще раз напоминаю - обсуждается не практический вопрос "как снизить торможение во флэшке с улитками", а теоретический - отрисовывает ли плеер то, что находится за пределами экрана. Флэшка с улитками никоим образом не закончена, и если я выложу фла, начнется бесконечный спор о том, как ее улучшить, на данном этапе совершенно мне не интересный. Что господин __etc желает увидеть во фла, я не понимаю, да и он не сознается. Ни о чем я с ним не обуславливался, кроме того, что фла не выложу на всеобщее обозрение, пока проект не будет закончен МНОЙ(*). Требования снизить торможение я воспринимаю как хитрость, ибо тогда будет трудно определить наличие проблемы - редравы либо не видно, когда они за рамкой, либо когда видно, то уже и объект виден и, понятно, отрисовывается. Я считаю что подобную проблему и видно только на таком крайнем примере, с высокой нагрузкой.
На предоставленных свф видно все, что нужно. Таким образом __etc просто ушел от обсуждения, к сожалению.
*)2 iNils - если тебе просто как художнику-дизайнеру :) интересно покопаться, дай мыло я тебе лично как собёздинику вышлю

etc
06.08.2007, 12:49
Посмотрел флешки три раза. Разницы в уровне FPS не нашел принципиальной.
fla мне нужен для того, чтобы выяснить, что именно происходит за пределами сцены. А так — черный ящик.

Golovach
06.08.2007, 12:54
Если за пределами сцены происходят математические вычисления, я не просто отрисовка - почему бы и не тормизить?
На счет отрисовки могу сказать - даже за пределами маски НИЧЕГО не отрисовывается, убедился многократно.

Wolsh
06.08.2007, 12:57
На моем компе: там где цветка нет, фпс на 290м кадре не только не падает, а поднимается с устойчивой 6 до 7.
там, где цветок появляется за границами флэшки в 290м кадре, фпс тутже падает с устойчивой 6 до 3-4.
3-4 и 7 - разница в два раза.

Математические вычисления? Траектории полета на Луну? Вычисления цветка там происходят, это же очевидно - при его отсутствии торможение не усиливается (как мягко я стал выражаться :))

За пределами маски - готов поспорить. ХитТест показывает что там что-то есть

etc
06.08.2007, 13:00
У меня показывает 15 на обеих в этом месте. Ну может с цветком и 14 показывает.

Wolsh
06.08.2007, 13:49
15 ??? И ты еще ругаешься что все тормозит? Да там рассчитано на 12 фпс (в смысле скорость движения улитки более-менее нормальна при 12 фпс).
Вот это то, о чем я говорил - когда мощности компа хватает, проблему вообще не увидишь.

>> Ну может с цветком и 14 показывает.
Ну наконец-то. Ты всеже признаешь, что что-то там происходит. Как ты думаешь, зачем это?
Плеер знает, что это попадет в область видимости или он вынужден пересчитывать движущийся мувик со сценой из-за того что там новый объект появился, хоть и невидимый пока?

etc
06.08.2007, 14:00
Ну вообще говоря в самом начале оно вообще 24 фигачит :D

Wolsh
06.08.2007, 14:11
Улитка там не вспотела так носиться? Дай угадаю - двухядерный кор с 2 гигами оперативки? Эх...

etc
06.08.2007, 14:15
Угадал :)

Насчет отрисовки, опять же, говорю, что мне нужно знать, что там происходит вне сцены. Если статичный объект (в смысле его содержимое не изменяется), то он не перерисовывается.

silin
06.08.2007, 14:46
имхо загвоздка в том, что ты добавляешь цветочек в мувик, который сам анимирован, т.е. должен пересчитываться/перерисовываться (получается что всесте совсем своим нутром, невзирая на положение этого нутра относительно сцены), если бы это был отдельный мувик, не нагруженный анимацией (плееру не надо каждый фрейм определять где он), то все было бы как сказано выше, в редроРегион он бы не попадал..

Wolsh
06.08.2007, 15:07
Ну вот и разобрались (собственно, я уже и сам так начал думать).
Действительно, цветок появляется внутри движущегося в этот момент клипа (впрочем, в нем вообще все находится, т.е. вся сцена перемещается). Похоже, это и есть условие, при котором происходит перерисовка. Всем спасибо. Silin, где ты раньше был? :)

etc
06.08.2007, 15:11
Просто надо вспомнить, как работает cacheAsBitmap. Точнее, когда работает, когда нет. При тех же условиях работает перерисовка.