PDA

Просмотр полной версии : Отрисовка во flash


zafod
22.05.2007, 15:35
Я вот не пойму, почему нельзя отрисовывать скажем 100 мувиклипов во флешке с приличной скоростью. Может есть какая то хотрость?

etc
22.05.2007, 15:47
О каких клипах конкретно идет речь?

zafod
22.05.2007, 17:05
обычные MovieClip, я просто не пойму вообще как он отрисовывает

DimZ
22.05.2007, 18:31
кто он? и зачем их отрисовывать?

zafod
23.05.2007, 08:09
Я просто не знаю как это во flash делается, я занимаюсь DirectX и OpenGL, там я спрайты заливаю в видеокарту, подключаю шейдеры и пошло - это все для быстрой отрисовки. А во flash как мне быстро отрисовывать я не в курсе. Мне подсказали _root.attachMovie( inst, newInst, depth, {objectInit} ) - но это прям такие тормоза. Это если у меня 11 fps то это он всего 11 раз мне аттачил клип на сцену в секунду? Как то должно быть же побыстрее?

vooparker
23.05.2007, 10:08
2zafod, 11 раз аттачил клип на сцену в секунду? Ты что аттач в onEnterFrame вешаешь?

zafod
23.05.2007, 10:36
ну да. А как надо? На нескольео фрэймов разбить?

Dendroid
23.05.2007, 11:46
Я вот не пойму, почему нельзя отрисовывать скажем 100 мувиклипов во флешке с приличной скоростью.

Я просто не знаю как это во flash делается, я занимаюсь DirectX и OpenGL, там я спрайты заливаю в видеокарту, подключаю шейдеры и пошло - это все для быстрой отрисовки. А во flash как мне быстро отрисовывать я не в курсе. Мне подсказали _root.attachMovie( inst, newInst, depth, {objectInit} ) - но это прям такие тормоза. Это если у меня 11 fps то это он всего 11 раз мне аттачил клип на сцену в секунду? Как то должно быть же побыстрее?

Странно, такой большой, знает DirectX, а не знает таких простых вещей:

1. Видеокарта - это целая куча процессоров, которые занимаются только тем, что перемалывают твои спрайты и шейдеры в параллельном режиме. А Флэш пользуется только одним процессором, центральным. Выключили поддержку процессоров на карте (запустили DirectX в режиме эмуляции) - о, как замедлилось всё на порядок-другой.

Идём дальше.
2. Флэш вообще не использует hardware layer графической системы. Поэтому весь вывод идёт через медленные, но работающие на всём железе графические функции операционной системы. Забыли про DirectX и DirectDraw вообще, открыли обычный виндовый канвас, и рисуем в нём кистями. Что, неудобно спрайты руками двигать? Заботится о сглаживании общей картинки? А уж с векторными изображениями как можно запариться... А ещё эта неизбавимая головная боль с фонтами... А ведь Флэш ещё может те же элементы показать и под Mac, и под Linux. И даже иногда на сотовом телефоне. И выглядеть будет одинаково везде.

3. Флэш - это вебная технология, т.е. размер конечного приложения и размер самого плагина - критичные величины. Сколько, говорите, ваше DirectX приложение весит? Ага, зато текстуры 256x256, ну-ну. А сам новый DirectX? Ни фига себе. А сколько мне будет стоить видеокарта для запуска этого нового DirectX. Что, всё равно в том разрешении, что у меня на мониторе, не запустится? А зачем я это тогда три дня скачивал? Нда...

4. Флэш начинался как инструмент для рисования. Ну, это как Adobe ImageReady: огромная среда с кучей инструментов, фильтров, настроек, а вывод результата - в маленький такой gif-файл. Спрашиваете, почему нельзя поставить частоту кадров 30 и где поддержка HDR и альфа-канала? А Вы, извините, с какой планеты будете?

5. Никто особо не заботился сперва об оптимизации скорости работы внутреннего языка, это просто не было предназначено для работы на предельной загрузке процессора, не было предназначенно для масштабирования (т.е. и на Flash 6 умельцы делали движки, которые могли собирать 10-20 треугольников в крутящуюся 3D-фиговину, но никто и никогда всерьёз не предлагал, а давайте теперь сделаем 1000-2000 полигонов хотя бы и забацаем Дум на флэше). Только с выпуском версии 9 скорость работы языка (интерпретатора, заметте) возрасла значительно. И теперь практически сравнима с работой скомпилированных проектов на Java.

Домашнее задание: подумать теперь почему такие популярные проекты как YouTube, Google, MySpace, MSN, а также сайты игр, написанных на том же DirectX и OpenGL (HalfLife, WarCraft, NeedForSpeed, уж им то, казалось бы сам бог велел) используют так много Флэша, а вот той же Java, или тем более DirectX вообще никакой попытки нет добавить.

По-моему, это очень плохо начинать разбираться с какой-нибудь технологией, пытаясь проецировать свои старые знания в совсем другой области и обижаться: вот там так просто было, а тут непонятно и вообще тормозит...
Критически надо подходить и гибче: ну, для чего-то же Вам понадобилось использовать Флэш, значит это даёт какие-то преимущеста, ну так и надо использовать по-максимуму именно преимущества, а не тыкаться в очевидные ограничения, которые есть, очевидно, продолжение этих самых преимуществ.

С графоманством надо завязывать. :)

zafod
23.05.2007, 11:57
Ну не знаю приятель, че та ты не в тему написал. Я же просто спросил как быстро отрисовать клипы на сцене. Если у тебя ник Дендроид, то это не значит, что ты можешь напрягать меня пустой болтовней, ты пади свой трактат еще и в ворде на ошибки проверил?
Ребята, без нудятины - подскажите как и что во флеше с отрисовкой или ссылки

Dendroid
23.05.2007, 12:13
Зря, попробуй прочитать ещё раз, полезно.
Отрисовывать быстро может помочь только разве что cacheAsBitmap. И Flash 9 (вместе с AS3) опять же.
Так понятно?

Но чтобы это с умом применить, нужно знать много всего во Флэше. Ты же даже конкретную задачу не описал. Что за клипы вообще?

zafod
23.05.2007, 13:12
Обычные movieClip я их загружаю из другого swf как клипы из shared lib просто клипы не smart, и все их пытаюсь аттачить ( около 100 ) в onEnterFrame. Что за прикол с cacheAsBitmap - рисовать как битмап?

etc
23.05.2007, 13:35
zafod получает плюс за наезды. Если вы не уважаете собеседников и то, что они пишут — мы это быстро решим.

screamge
23.05.2007, 13:59
у __etc прямо лозунг получился, не нужен тут онЕнтерФрейм, просто циклом пройдитесь по названиям и делайте аттач, он и грузит всё ваше приложение. Отрисовка в битмап убьёт все онрелизы, ролауты и прочие события клипов, если конечно они у вас есть. Но прежде чем прорисовывать в битмапу всё равно нужно аттачить.

zafod
23.05.2007, 14:22
Короче, спасибо за плюс. Я еще раз могу зарегиться если что. Нечево пусту писать - есть служба психологической поддержки, для тех, кто хочет выговориться.
Ну а как аттачить не в ЕтерФрейм?
Я просек, что можно аттачить не всегда. Короче аттач + кашЭзБитмап = прирост в 5,5 раза, чем кашЭзБитмап и гоу то _рут.
Скажите мне только как мне вернутся назад в тот фрейм, где я рисую?
Ссылку или исходник дайте

Dr.OH
23.05.2007, 14:59
1. можно аттачить как угодно - можно в цикле, можно при помощи setInterval(func, timeout, [params,...]), можно повесить на события... в общем миллион способов, но т.к. неизвестно, что тыхочешь получить, то посоветовать ничего не могу.
2. gotoAndPlay(frame_number) или gotoAndPlay("frame_anchor")... и что за goto _root?
если ты пытаешься писать что-то наподобие прог из DirectX, то можешь сразу забить - Flash для этого не предназначен и искренне советую тебе пойти купить книжку "Flash за 7 дней" и прочитать от корки до корки и только после этого задавать вопросы.

chingachgoog
23.05.2007, 15:12
Отрисовка в битмап убьёт все онрелизы, ролауты и прочие события клипов, если конечно они у вас есть.

Не совсем так.
Если свойство мувика выставить в cacheAsBitmap=true, то интерактивность не потеряется.
см. еще тут
http://flasher.ru/forum/showthread.php?t=95803

zafod
23.05.2007, 15:13
А все, сам допер, даже ДиректХ пригодился, да тут принципы то оптимизации такие же. Culling, ocTree, порталы, только перенести на flash - довольно нетяжело. Все стало 64 fps.

zafod
23.05.2007, 15:15
А!!!! Перерисовку здесь можно организовать по буфферам. Нет, ребята, как ни крути а я привык бороться за каждый fps...

etc
23.05.2007, 15:19
31 fps — стандарт. Ни больше, ни меньше.

chingachgoog
23.05.2007, 15:19
А все, сам допер,... Все стало 64 fps.

Я бы на вашем месте повнимательнее прочитал сообщение №13

zafod
23.05.2007, 15:21
система проста - 10 разных клипов расположены в определенных частях сцены, если она статична, то раз их отрисовываем в beffer:MovieClip
buffer.cacheAsBitmap = true;
buffer вешаем на _root и крутимся в цикле ничего не перерисовывая.
Если один из 10 клипов изменился
buffer.attachMovie( этот клип, какое-то имя, его depth относительно родителя, {новые координаты?альфа?чтоугодно?});
buffer опять в битмап и кидаем на _root.
Реально скорость растет

zafod
23.05.2007, 15:24
fps++ пройден цикл до конца, бегает по 64 раза

zafod
23.05.2007, 15:28
сколько раз он у тебя пробежит цикл отрисовки в секунду, столько и будет у тебя фпс

screamge
23.05.2007, 15:29
Цикл должен бегать один раз. И на фпс при таком количестве клипов не влияет.

zafod
23.05.2007, 15:35
ну если у тебя noChanges в сцене он и не пойдет отрисовывать. Передвинул один клип - перерисовал этот кусок прям в битмапку. Не надо всю сцену по новой рисовать. Вот видимо в чем фишка cacheAsBitmap

zafod
23.05.2007, 15:51
ellapsed = getTimer() - oldTime;
это у нас время одного цикла в мс
тогда текущий fps по циклу
fps = 1000 / ellapsed;
ну и вот у меня в среднем при двух замещениях клипов бегает ellapsed = 18
fps в среднем 55,555

откуда здесь "не больше и не меньше 31"?