![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jun 2004
Сообщений: 121
|
Добрый день.
Наклепал карту. Карта. Подгружаем объекты. Расставляем. ничего сложного. Приметив. И почему-то тормозит жутко. вот сайт http://onlinevdonsk.ru вот код. var mouseListener:Object = new Object(); mouseListener.onMouseWheel = function(delta:Number) { _root.zoom_obj.zoom._x += delta; if (_root.zoom_obj.zoom._x+delta>100) { _root.zoom_obj.zoom._x = 100; } if (_root.zoom_obj.zoom._x+delta<10) { _root.zoom_obj.zoom._x = 10; } }; Mouse.addListener(mouseListener); var loadListener:Object = new Object(); loadListener.onLoadComplete = function(target_mc:MovieClip):Void { bd_load_xml_street.load("street.xml"); bd_load_xml_map.load("map.xml"); }; var mcLoader:MovieClipLoader = new MovieClipLoader(); mcLoader.addListener(loadListener); mcLoader.loadClip("street.swf", _root.map.map2.array_swf); mcLoader.loadClip("map.swf", _root.map.map2.map_swf); var bd_load_xml_street = new XML(); bd_load_xml_street.onLoad = function() { tmp_street = String(bd_load_xml_street.firstChild); _root.bd_xml_swf_street = new Array(); _root.bd_xml_swf_street = tmp_street.split("\r\n"); _root.saveX = -10; _root.saveX = -10; creatObj(); SI_reSize = setInterval(creatObj, 500); }; var bd_load_xml_map = new XML(); bd_load_xml_map.onLoad = function() { tmp_map = String(bd_load_xml_map.firstChild); _root.bd_xml_swf_map = new Array(); _root.bd_xml_swf_map = tmp_map.split("\r\n"); _root.saveX = -10; _root.saveX = -10; creatObj(); }; creatObj = function () { if ((_root.map.map2._x != _root.saveX) or (_root.map.map2._y != _root.saveY) or (_root.map._xscale != _root.saveXs) or (_root.map._yscale != _root.saveYs)) { _root.mc_hittest._width = Stage.width+210; _root.mc_hittest._height = Stage.height+210; _root.line_interface2._y = Stage.height-15; _root.scroll_interface2._y = Stage.height-15; _root.line_interface._x = Stage.width-17; _root.scroll_interface._x = Stage.width-17; for (i=0; i<_root.bd_xml_swf_street.length; i++) { tmp_street = _root.bd_xml_swf_street[i].split("|"); if (_root.mc_hittest.hitTest((Math.ceil(Number(tmp_street[1])+_root.map.map2._x+340)), Math.ceil((Number(tmp_street[2])+_root.map.map2._y+185)))) { _root.map.map2.array_swf.attachMovie(tmp_street[0], tmp_street[0], i); _root.map.map2.array_swf[tmp_street[0]]._x = tmp_street[1]; _root.map.map2.array_swf[tmp_street[0]]._y = tmp_street[2]; _root.map.map2.array_swf[tmp_street[0]].onEnterFrame = function() { if (!_root.mc_hittest.hitTest(this)) { removeMovieClip(this); } }; } } for (i=0; i<_root.bd_xml_swf_map.length; i++) { tmp_map = _root.bd_xml_swf_map[i].split("|"); if (_root.mc_hittest.hitTest((Math.ceil(Number(tmp_map[1])+_root.map.map2._x+340)), Math.ceil((Number(tmp_map[2])+_root.map.map2._y+185)))) { _root.map.map2.map_swf.attachMovie(tmp_map[0], tmp_map[0], i); _root.map.map2.map_swf[tmp_map[0]]._x = tmp_map[1]; _root.map.map2.map_swf[tmp_map[0]]._y = tmp_map[2]; _root.map.map2.map_swf[tmp_map[0]].onEnterFrame = function() { if (!_root.mc_hittest.hitTest(this)) { removeMovieClip(this); } }; } } } _root.saveX = _root.map.map2._x; _root.saveY = _root.map.map2._y; _root.saveXs = _root.map._xscale; _root.saveYs = _root.map._yscale; }; _root.onMouseDown = function() { startDrag(_root.map.map2); }; _root.onMouseUp = function() { stopDrag(); }; stop(); Объекты создаем только на основе видимой части поля. Т.е. не все сразу, а только те, у кого координаты соответствуют видимой части поля. Раньше сразу все объекты грузились и создавалась вся карта. Объектов около 3500. Я видел флешки, где еще больше объектов было и ничего. В чем прокол мой? Или может как-то не так реализовал это? заранее спасибо .Добавлено через 5 минут fps 24 стоит. В настройках. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну первое что бросается в глаза - Вы по два раза загружаете xmlки. Фиг бы с ним, они возьмутся из кэша. НО - ведь при окончании загрузки выполняется обработчик. Т.е Вы ДВА раза запускаете bd_load_xml_map.onLoad, который ДВА же раза запускает creatObj();
Может я что-то упустил и это не так - проверьте трейсом в теле creatObj(); Добавлено через 7 минут Постойте, а это что такое? Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Banned
Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
Я бы все в битмап рисовал и проверял по координатом клика нужно ли подсветит здание, или показать тул тип и тд. Ну а так я на сколько понял рисуется не только видимая часть карты а она просто постепенно отрисовывается)
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
ХитТест для [всех?] объектов 24 раза в секунду.... 40% говорите? Снимаю шляпу. Мне кажется, если б Вы нарисовали все эти объекты и перестали так упорно следить за их видимостью, всё бегало бы в разы живее.
__________________
Reality.getBounds(this); |
|
|||||
|
Banned
Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
|
За ними нужно следить только не так).
|
|
|||||
|
Регистрация: Jun 2004
Сообщений: 121
|
неподскажите как?
![]() Цитата:
Я слежу за ними, чтобы видеть, какие объекты нужно отобразить в данный момент. И я слежу не за самими объектами, а смотрю координаты в массиве, пробегаюсь по массиву. И если координаты удовлетворяют нынешнему условию - то я вставляю объект. Если он вышел из зоны видимости - удаляется. Цитата:
![]() Цитата:
. Но все равно объкты создались по одному экземлпяру. И не все объекты, а только те которые попадают под условие - hitTest.setInterval - слежу за объектами, пробегаюсь по массиву, и смотрю какие объекты нужно создать в данный момент. Есть какой-нить другой способ? Ну вот смотрите. http://onlinevdonsk.ru/ Создаю сразу все объекты. //Stage.scaleMode = "noScale" //Stage.align = "TL"; var mouseListener:Object = new Object(); mouseListener.onMouseWheel = function(delta:Number) { _root.zoom_obj.zoom._x += delta; if (_root.zoom_obj.zoom._x+delta>100) { _root.zoom_obj.zoom._x = 100; } if (_root.zoom_obj.zoom._x+delta<10) { _root.zoom_obj.zoom._x = 10; } }; Mouse.addListener(mouseListener); var loadListener:Object = new Object(); loadListener.onLoadComplete = function(target_mc:MovieClip):Void { bd_load_xml_street.load("street.xml"); bd_load_xml_map.load("map.xml"); }; var mcLoader:MovieClipLoader = new MovieClipLoader(); mcLoader.addListener(loadListener); mcLoader.loadClip("street.swf", _root.map.map2.array_swf); mcLoader.loadClip("map.swf", _root.map.map2.map_swf); var bd_load_xml_street = new XML(); bd_load_xml_street.onLoad = function() { tmp_street = String(bd_load_xml_street.firstChild); _root.bd_xml_swf_street = new Array(); _root.bd_xml_swf_street = tmp_street.split("\r\n"); creatObj(); }; var bd_load_xml_map = new XML(); bd_load_xml_map.onLoad = function() { tmp_map = String(bd_load_xml_map.firstChild); _root.bd_xml_swf_map = new Array(); _root.bd_xml_swf_map = tmp_map.split("\r\n"); creatObj2(); }; creatObj = function () { for (i=0; i<_root.bd_xml_swf_street.length; i++) { tmp_street = _root.bd_xml_swf_street[i].split("|"); _root.map.map2.array_swf.attachMovie(tmp_street[0], tmp_street[0], i); _root.map.map2.array_swf[tmp_street[0]]._x = tmp_street[1]; _root.map.map2.array_swf[tmp_street[0]]._y = tmp_street[2]; } }; creatObj2 = function () { for (i=0; i<_root.bd_xml_swf_map.length; i++) { tmp_map = _root.bd_xml_swf_map[i].split("|"); _root.map.map2.map_swf.attachMovie(tmp_map[0], tmp_map[0], i); _root.map.map2.map_swf[tmp_map[0]]._x = tmp_map[1]; _root.map.map2.map_swf[tmp_map[0]]._y = tmp_map[2]; } }; _root.map.map2.attachMovie("title_new", "title_new", 10); _root.map.map2["title_new"]._visible = false; scroll; function enter_object(n) { _root.map.map2["title_new"]._visible = true; _root.map.map2["title_new"]._x = n._x; _root.map.map2["title_new"]._y = n._y; _root.map.map2["title_new"].txt.text = n.st; } _root.onMouseDown = function() { startDrag(_root.map.map2); }; _root.onMouseUp = function() { stopDrag(); }; goObj = function (street) { for (i=0; i<_root.bd_xml_swf_street.length; i++) { tmp_street = _root.bd_xml_swf_street[i].split("|"); if (tmp_street[0] == street) { _root.zoom_obj.zoom._x = Math.ceil(_root.zoom_obj.zoom._x); import mx.transitions.Tween; var xTween:Tween; var yTween:Tween; xTween = new Tween(_root.map.map2.array_swf._parent, '_x', mx.transitions.easing.None.easeNone, _root.map.map2.array_swf._parent._x, _root.map.map2.array_swf._x+Stage.width/2-_root.map.map2.array_swf._x-tmp_street[1]-350, 1, true); yTween = new Tween(_root.map.map2.array_swf._parent, '_y', mx.transitions.easing.None.easeNone, _root.map.map2.array_swf._parent._y, _root.map.map2.array_swf._y+Stage.height/2-_root.map.map2.array_swf._y-tmp_street[2]-200, 1, true); xTween.onMotionFinished = function() { xTween.stop(); _root.num_zoom = 100; _root.time_zoom = setInterval(zoomObj_finish, 10); }; _root.map.map2["title_new"]._visible = true; _root.map.map2["title_new"]._x = tmp_street[1]; _root.map.map2["title_new"]._y = tmp_street[2]; _root.map.map2["title_new"].txt.text = _root.name_firma; } } }; zoomObj_start = function () { _root.zoom_obj.zoom._x = Math.ceil(_root.zoom_obj.zoom._x); if (_root.zoom_obj.zoom._x != _root.num_zoom) { if (_root.zoom_obj.zoom._x>_root.num_zoom) { _root.zoom_obj.zoom._x--; } else { _root.zoom_obj.zoom._x++; } } else { _root.goObj(_root.sel_street); clearInterval(_root.time_zoom); } }; zoomObj_finish = function () { _root.zoom_obj.zoom._x = Math.ceil(_root.zoom_obj.zoom._x); if (_root.zoom_obj.zoom._x != _root.num_zoom) { if (_root.zoom_obj.zoom._x>_root.num_zoom) { _root.zoom_obj.zoom._x--; } else { _root.zoom_obj.zoom._x++; } } else { clearInterval(_root.time_zoom); } }; setFlashParam = function (street, name_firma) { _root.zoom_obj.zoom._x = Math.ceil(_root.zoom_obj.zoom._x); clearInterval(_root.time_zoom); _root.name_firma = name_firma; _root.sel_street = street; _root.num_zoom = 33; _root.time_zoom = setInterval(zoomObj_start, 10); }; var methodName = "setFlashParam"; var instance = null; var method = setFlashParam; var wasSuccessful = flash.external.ExternalInterface.addCallback(methodName, instance, method); stop(); Смотрите как тормозит карта. Поэтому я и решил создавать только те объекты, которые попадают под видимую часть. Или как можно по другому? Как-нить облегчить можно вариант с "полной загрукой объектов" ?. Раньше глучило еще больше. Я уменьшил fps до 10, и убрал контур у объектов, стало бегать побыстрее. Но все равно тормозит . |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я просил объяснить, что делает интервал два раза в секунду. Что делает onEnterFrame, в котором хиттест для всех объектов из хмлки. Мне, признаться, лень разбираться в таком многословном коде с кучей неизвестно что хранящих переменных. Если Вам лень пояснить свой код, то подождем энтузиастов.
Пока же у меня подозрение что интервал, следящий за объектами, надо заменить обработчиком onMouseMove, ибо только при движении мышки объекты смещаются - тогда и надо делать вычисления. То, что у Вас два раза грузится и обрабатывается хмлка, безусловно меркнет в свете вызова этой же функции creatObj два раза в секунду по интервалу. Вобщем чую подвох, но надо понять Вашу концепцию, чтобы чтото сказать о реализации. Объясните - подумаем. Прежде всего поясните "частые" функции. Зачем эти интервалы и onEnterFramе'ы в интервалах (!) Не вижу, как бы я применил их при создании такой карты.
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Jun 2004
Сообщений: 121
|
ну смотрите. Разберем первый код. Где есть обработчик.
исправили на один загрузчик. var loadListener:Object = new Object(); loadListener.onLoadComplete = function(target_mc:MovieClip):Void { bd_load_xml_street.load("street.xml"); }; var mcLoader:MovieClipLoader = new MovieClipLoader(); mcLoader.addListener(loadListener); mcLoader.loadClip("street.swf", _root.map.map2.array_swf); var bd_load_xml_street = new XML(); bd_load_xml_street.onLoad = function() { tmp_street = String(bd_load_xml_street.firstChild); _root.bd_xml_swf_street = new Array(); _root.bd_xml_swf_street = tmp_street.split("\r\n"); _root.saveX = -10; _root.saveX = -10; creatObj(); SI_reSize = setInterval(creatObj, 500); }; Описываю функцию creatObj creatObj = function () { if ((_root.map.map2._x != _root.saveX) or (_root.map.map2._y != _root.saveY) or (_root.map._xscale != _root.saveXs) or (_root.map._yscale != _root.saveYs)) { _root.mc_hittest._width = Stage.width+210; _root.mc_hittest._height = Stage.height+210; _root.line_interface2._y = Stage.height-15; _root.scroll_interface2._y = Stage.height-15; _root.line_interface._x = Stage.width-17; _root.scroll_interface._x = Stage.width-17; for (i=0; i<_root.bd_xml_swf_street.length; i++) { tmp_street = _root.bd_xml_swf_street[i].split("|"); if (_root.mc_hittest.hitTest((Math.ceil(Number(tmp_street[1])+_root.map.map2._x+340)), Math.ceil((Number(tmp_street[2])+_root.map.map2._y+185)))) { _root.map.map2.array_swf.attachMovie(tmp_street[0], tmp_street[0], i); _root.map.map2.array_swf[tmp_street[0]]._x = tmp_street[1]; _root.map.map2.array_swf[tmp_street[0]]._y = tmp_street[2]; _root.map.map2.array_swf[tmp_street[0]].onEnterFrame = function() { if (!_root.mc_hittest.hitTest(this)) { removeMovieClip(this); } }; } } } _root.saveX = _root.map.map2._x; _root.saveY = _root.map.map2._y; _root.saveXs = _root.map._xscale; _root.saveYs = _root.map._yscale; }; Если же мы двигаем карту. То обработчик этот пробегается по загруженной xml, находит объекты, которые попадают под объект mc_hittest. if (_root.mc_hittest.hitTest((Math.ceil(Number(tmp_street[1])+_root.map.map2._x+340)), Math.ceil((Number(tmp_street[2])+_root.map.map2._y+185)))) { Выведенным объектам присваиваем onEnterFrame, чтобы определить, вышли эти объекты за границу mc_hittest или нет. Когда они выходят - они удаляются. Впринципе вы правы, можно заменить setInterval и условие определения двиганья карты на оператор onMouseMove. Упроститься код. ---------------------------------------------------------- Разберем второй код. где Создаются все объекты сразу и мы двигаем поле с объектами около 3000 штук. Там нету setInterval, нету onEnterFrame. Все просто. Подгрузили xml, swf. наклепали на всю карту объекты. При перетаскивании карты - тормозит дело. Можно как-нить облегчить? Вариант - bitmapData - предложили. Спасибо. Это на крайний случай, хочеться все-таки векторную карту. Добавлено через 10 минут Заменил на функцию onMouseMove. при простоит загрузка ЗП 4-5%. При перетаскивании под 50%!!! при реализации с setInterval. при простои 4-5%, а вот при перетаскивании всего 15%. Ммм.. с чем это связано? ПОлучается что при двигании мышкой мы чаще выполняем эту функцию, чем два раза в секунду (если учитывать прошлый код с setInterval) ? Добавлено через 12 минут можно попроваботь заменить onEnterFrame. Но на что? как еще проверять, ушли эти объекты с поля зрения или нет? |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
Я когда вижу в коде конструкции типа _root.map.map2.array_swf[tmp_street[0]] сразу бросаю в нем разбираться. |
|
|||||
|
Регистрация: Jun 2004
Сообщений: 121
|
Цитата:
![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 06:50. |
|
|
« Предыдущая тема | Следующая тема » |
|
|