![]() |
тормозит карта. ЦП проца под 40%
Добрый день.
Наклепал карту. Карта. Подгружаем объекты. Расставляем. ничего сложного. Приметив. И почему-то тормозит жутко. вот сайт http://onlinevdonsk.ru вот код. Код AS1/AS2:
Объекты создаем только на основе видимой части поля. Т.е. не все сразу, а только те, у кого координаты соответствуют видимой части поля. Раньше сразу все объекты грузились и создавалась вся карта. Объектов около 3500. Я видел флешки, где еще больше объектов было и ничего. В чем прокол мой? Или может как-то не так реализовал это? заранее спасибо :). Добавлено через 5 минут fps 24 стоит. В настройках. |
Ну первое что бросается в глаза - Вы по два раза загружаете xmlки. Фиг бы с ним, они возьмутся из кэша. НО - ведь при окончании загрузки выполняется обработчик. Т.е Вы ДВА раза запускаете bd_load_xml_map.onLoad, который ДВА же раза запускает creatObj();
Может я что-то упустил и это не так - проверьте трейсом в теле creatObj(); Добавлено через 7 минут Постойте, а это что такое? Цитата:
|
Я бы все в битмап рисовал и проверял по координатом клика нужно ли подсветит здание, или показать тул тип и тд. Ну а так я на сколько понял рисуется не только видимая часть карты а она просто постепенно отрисовывается)
|
ХитТест для [всех?] объектов 24 раза в секунду.... 40% говорите? Снимаю шляпу. Мне кажется, если б Вы нарисовали все эти объекты и перестали так упорно следить за их видимостью, всё бегало бы в разы живее.
|
За ними нужно следить только не так).
|
Цитата:
Цитата:
Я слежу за ними, чтобы видеть, какие объекты нужно отобразить в данный момент. И я слежу не за самими объектами, а смотрю координаты в массиве, пробегаюсь по массиву. И если координаты удовлетворяют нынешнему условию - то я вставляю объект. Если он вышел из зоны видимости - удаляется. Цитата:
Цитата:
setInterval - слежу за объектами, пробегаюсь по массиву, и смотрю какие объекты нужно создать в данный момент. Есть какой-нить другой способ? Ну вот смотрите. http://onlinevdonsk.ru/ Создаю сразу все объекты. Код AS1/AS2:
Смотрите как тормозит карта. Поэтому я и решил создавать только те объекты, которые попадают под видимую часть. Или как можно по другому? Как-нить облегчить можно вариант с "полной загрукой объектов" ?. Раньше глучило еще больше. Я уменьшил fps до 10, и убрал контур у объектов, стало бегать побыстрее. Но все равно тормозит :(. |
Я просил объяснить, что делает интервал два раза в секунду. Что делает onEnterFrame, в котором хиттест для всех объектов из хмлки. Мне, признаться, лень разбираться в таком многословном коде с кучей неизвестно что хранящих переменных. Если Вам лень пояснить свой код, то подождем энтузиастов.
Пока же у меня подозрение что интервал, следящий за объектами, надо заменить обработчиком onMouseMove, ибо только при движении мышки объекты смещаются - тогда и надо делать вычисления. То, что у Вас два раза грузится и обрабатывается хмлка, безусловно меркнет в свете вызова этой же функции creatObj два раза в секунду по интервалу. Вобщем чую подвох, но надо понять Вашу концепцию, чтобы чтото сказать о реализации. Объясните - подумаем. Прежде всего поясните "частые" функции. Зачем эти интервалы и onEnterFramе'ы в интервалах (!) Не вижу, как бы я применил их при создании такой карты. |
ну смотрите. Разберем первый код. Где есть обработчик.
исправили на один загрузчик. Код AS1/AS2:
Описываю функцию creatObj Код AS1/AS2:
Если же мы двигаем карту. То обработчик этот пробегается по загруженной xml, Код AS1/AS2:
находит объекты, которые попадают под объект mc_hittest. Код AS1/AS2:
Выведенным объектам присваиваем onEnterFrame, чтобы определить, вышли эти объекты за границу mc_hittest или нет. Когда они выходят - они удаляются. Код AS1/AS2:
Впринципе вы правы, можно заменить setInterval и условие определения двиганья карты на оператор onMouseMove. Упроститься код. ---------------------------------------------------------- Разберем второй код. где Создаются все объекты сразу и мы двигаем поле с объектами около 3000 штук. Там нету setInterval, нету onEnterFrame. Все просто. Подгрузили xml, swf. наклепали на всю карту объекты. При перетаскивании карты - тормозит дело. Можно как-нить облегчить? Вариант - bitmapData - предложили. Спасибо. Это на крайний случай, хочеться все-таки векторную карту. Добавлено через 10 минут Заменил на функцию onMouseMove. при простоит загрузка ЗП 4-5%. При перетаскивании под 50%!!! при реализации с setInterval. при простои 4-5%, а вот при перетаскивании всего 15%. Ммм.. с чем это связано? ПОлучается что при двигании мышкой мы чаще выполняем эту функцию, чем два раза в секунду (если учитывать прошлый код с setInterval) ? Добавлено через 12 минут можно попроваботь заменить onEnterFrame. Но на что? как еще проверять, ушли эти объекты с поля зрения или нет? |
Цитата:
|
Цитата:
|
Когда зум делаеш максимально отдаленный видно что
Код AS1/AS2:
|
Цитата:
http://onlinevdonsk.ru/ - карта с обработчиком. (где как раз и есть этот remove, работает вроде.) http://onlinevdonsk.ru/index_full_load.php - карта с полной загрузкой сразу всех объектов. Без обработчика. |
Там карта постепенно отрисовывается и старые обьекты каторые уже в незоны видимости остаются.
|
Вложений: 2
Вот скрины.
Переместились влево. Потом перемещаемся снова вправо, и видим что старых построик уже нету. |
По поводу двух последних карт - как я и говорил,полная карта бегает как бешеная, в то время как прорисовка жутко тормозит (только не надо руками двигать - из-за использования "два раза в секунду" вместо onMouseMove зрелище то еще, используйте кнопочки и увидите разницу).
Добавлено через 20 минут Я хочу сказать что цикл хитТест+удаление+аттач навряд ли занимает меньше времени, чем смещение нарисованных объектов. В любом случае, если Вам так хочется играться с видимостью/невидимостью, от хитТеста надо избавиться. Сравнение чисел всетаки быстрее - зачем нужен клип, с которым проводится хитТест чисел? Разве размеры Стейджа неизвестны? Сделайте простую проверку из блоков ()&&()&&() причем в первый блок поставить наиболее вероятное несовпадение)) , ну скажем _х < -_width, и такая проверка будет летать по сравнению с хитТестом. Но и это всеравно не оптимально(((( |
Цитата:
При полной загрузки, у меня лично тормозит жутко. А вот при видимости/невидимости - бегает еще нормально. Вот я просто зашол на http://onlinevdonsk.ru/index_full_load.php и проц под 30% сразу ушол, из-за чего? там же просто объекты и все. никаких hittest'ов, циклов и тд. нету. Ну, попробую избавить от хиттеста. Добавлено через 4 минуты Код карты http://onlinevdonsk.ru/index_full_load.php Код AS1/AS2:
Код карты http://onlinevdonsk.ru/ Код AS1/AS2:
вот смотрите. При полной прорисовки карты, она тормозит сильнее, чем если используем hittest и setInterval. Почему? |
При передвижении по карте стрелками она вообще не тормазит:) в варианте с полной прорисовкой.
|
Вот именно. Внимательно перечитайте.
|
Цитата:
А если попробовать, при клике использовать не Drag, а например, при клике включать функцию, которая двигала бы карту в ритм мышке. А когда отпустили клик, выключась функция. Будет шустрее работать? иль как? Добавлено через 43 секунды а вот скажите, столько загрузка ЦП у вас при открытой полной карты ? (полная загрузка карты которая). |
То что Вы описали и есть onMouseMove.
Не обещаю шустрость, но подумайте сами - если не будет при этом все удаляться/вычисляться/аттачится, если карта целиком нарисована и все. Просто двигаем. ?? Сейчас она "тормозит" очень ровно, а именно - перерисовывается 2 раза в секунду))))) Я уж не знаю что Вы там поменяли/не поменяли в коде, но 2 fps интервальные так и остались - когда таскаешь руками. Выбросьте все ненужное и посмотрите что будет с таким комплектом - onMouseMove включается после нажатия и работает до отпускания, так и таскаем. А карта не перерисовывается вообще. Нарисована сразу вся. Попробуйте. Я не даю никаких гарантий. Но Вы уже три раза меня не послушали, а я всё пишу и пишу))) Уважьте старика, сделайте примерчик)) Добавлено через 5 минут Забыл про загрузку ЦП отчитаться)) Когда захожу, прыгает с 4 на 28 и тут же скатывается до 9. Отличный результат. НО через полсекунды =) (я нимагу) - опять до 20 и вниз, и так два раза в секунду. Ну понятно, creatObj(); |
Код AS1/AS2:
добавил кодик setProperty("", _quality, "low"); стало еще полегче при перемещении. Но вот смотрите. В этой карте нету setInterval, onEnterFrame. При простои карты загрузки ЦП нету. Все правильно. Но вот стоит поводить мышкой по рабочей области ( просто поводить, никаких циклов на onMouseMOve нету), а почему тогда ЗП подлитает аж до 40-50% ? что ему не нравиться? Добавлено через 2 минуты замену starDrag() пока не трогаем. |
Потому что флеш рендерер перерисовываит 500 раз в секунду все обьекты на карте при startDrag()
|
Поражаюсь своему терпению... Но ведь это мои проблемы, что я плохо объясняю, да?
Попробуем Вашим способом, с картинками)) Код:
var loadListener:Object = new Object();qazwsx, это откуда такая информация? По-моему он перерисовывает точно в соответствии с заданным фпс флэшки. Именно поэтому и используют onMouseMove, что при движении мыши частота события гораздо выше чем фпс - но и тогда ПЕРЕРИСОВЫВАТЬ чаще чем фпс будет если только сказать об этом командой updateAfterEvent(). Добавлено через 26 минут Еще я бы настоятельно рекомендовал Вам оптимизировать код и не губить мой процессор и мои глаза. Если найдете время на обучение, почитайте вот эту темку - она в целом близка к Вашей, но я о другом - именно об оптимизации кода, начиная гдето со второй страницы http://flasher.ru/forum/showthread.php?t=117966&page=2 |
больше не буду губить ваш проц :).
буду капаться, спс за ссылку и инфу :) |
Не то чтобы флеш чтото делал в точности :D. Но очевидно что при заданом фпс и startDrag все тормазит, так зачем придератся?
|
к сожалению ссылки на карту не работают, так что посмотреть не могу. а так хотелось бы сравнить с моим творением
|
я бы вам посоветовал бы сделать карту на тайлах(tail), было бы намного удобнее и не тормозило бы совсем.
Идея такая создаете массив карты, типа Код AS1/AS2:
далее при перетаскивании клипа map, проверяя координаты map, расчитывая какие клипы удалять, а какие добавлять. вот так я это вижу... |
| Часовой пояс GMT +4, время: 05:59. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.