Просмотр полной версии : тормозит карта. ЦП проца под 40%
Barzometr
26.02.2009, 18:25
Добрый день.
Наклепал карту.
Карта. Подгружаем объекты. Расставляем.
ничего сложного. Приметив.
И почему-то тормозит жутко.
вот сайт 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 стоит. В настройках.
Ну первое что бросается в глаза - Вы по два раза загружаете xmlки. Фиг бы с ним, они возьмутся из кэша. НО - ведь при окончании загрузки выполняется обработчик. Т.е Вы ДВА раза запускаете bd_load_xml_map.onLoad, который ДВА же раза запускает creatObj();
Может я что-то упустил и это не так - проверьте трейсом в теле creatObj();
Добавлено через 7 минут
Постойте, а это что такое?
SI_reSize = setInterval(creatObj, 500);Это "ничего сложного. Приметив."?? А в чем смысл этого примитива - следить за ресайзом Стейджа чтоли? Так ведь для этого событие Resize есть у стейджа. Или всё сложнее?)))) Объясните.
Я бы все в битмап рисовал и проверял по координатом клика нужно ли подсветит здание, или показать тул тип и тд. Ну а так я на сколько понял рисуется не только видимая часть карты а она просто постепенно отрисовывается)
ХитТест для [всех?] объектов 24 раза в секунду.... 40% говорите? Снимаю шляпу. Мне кажется, если б Вы нарисовали все эти объекты и перестали так упорно следить за их видимостью, всё бегало бы в разы живее.
За ними нужно следить только не так).
Barzometr
27.02.2009, 00:12
За ними нужно следить только не так).
неподскажите как? :)
ХитТест для [всех?] объектов 24 раза в секунду.... 40% говорите? Снимаю шляпу. Мне кажется, если б Вы нарисовали все эти объекты и перестали так упорно следить за их видимостью, всё бегало бы в разы живее.
Ну вот я сейчас уменьшил FPS до 10 и убрал контуры у объектов, загрузка ЦП в простои 10-12%, при перемещении 20-22%.
Я слежу за ними, чтобы видеть, какие объекты нужно отобразить в данный момент. И я слежу не за самими объектами, а смотрю координаты в массиве, пробегаюсь по массиву. И если координаты удовлетворяют нынешнему условию - то я вставляю объект. Если он вышел из зоны видимости - удаляется.
Я бы все в битмап рисовал и проверял по координатом клика нужно ли подсветит здание, или показать тул тип и тд. Ну а так я на сколько понял рисуется не только видимая часть карты а она просто постепенно отрисовывается)
в Битмап - это же растр получиться. Тогда при увеличении\уменьшении будут пиксели. Ну можно конечно, но это на крайний случай. :)
Ну первое что бросается в глаза - Вы по два раза загружаете xmlки. Фиг бы с ним, они возьмутся из кэша. НО - ведь при окончании загрузки выполняется обработчик. Т.е Вы ДВА раза запускаете bd_load_xml_map.onLoad, который ДВА же раза запускает creatObj();
Может я что-то упустил и это не так - проверьте трейсом в теле creatObj();
Добавлено через 7 минут
Постойте, а это что такое?
Это "ничего сложного. Приметив."?? А в чем смысл этого примитива - следить за ресайзом Стейджа чтоли? Так ведь для этого событие Resize есть у стейджа. Или всё сложнее?)))) Объясните.
Ну.. то что он два раза выполняет creatObj(), эт да :). Но все равно объкты создались по одному экземлпяру. И не все объекты, а только те которые попадают под условие - 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, и убрал контур у объектов, стало бегать побыстрее. Но все равно тормозит :(.
Я просил объяснить, что делает интервал два раза в секунду. Что делает onEnterFrame, в котором хиттест для всех объектов из хмлки. Мне, признаться, лень разбираться в таком многословном коде с кучей неизвестно что хранящих переменных. Если Вам лень пояснить свой код, то подождем энтузиастов.
Пока же у меня подозрение что интервал, следящий за объектами, надо заменить обработчиком onMouseMove, ибо только при движении мышки объекты смещаются - тогда и надо делать вычисления.
То, что у Вас два раза грузится и обрабатывается хмлка, безусловно меркнет в свете вызова этой же функции creatObj два раза в секунду по интервалу. Вобщем чую подвох, но надо понять Вашу концепцию, чтобы чтото сказать о реализации. Объясните - подумаем. Прежде всего поясните "частые" функции. Зачем эти интервалы и onEnterFramе'ы в интервалах (!) Не вижу, как бы я применил их при создании такой карты.
Barzometr
27.02.2009, 02:54
ну смотрите. Разберем первый код. Где есть обработчик.
исправили на один загрузчик.
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
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,
for (i=0; i<_root.bd_xml_swf_street.length; i++) {
находит объекты, которые попадают под объект 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 или нет. Когда они выходят - они удаляются.
if (!_root.mc_hittest.hitTest(this)) {
removeMovieClip(this);
}
Впринципе вы правы, можно заменить setInterval и условие определения двиганья карты на оператор onMouseMove. Упроститься код.
----------------------------------------------------------
Разберем второй код. где Создаются все объекты сразу и мы двигаем поле с объектами около 3000 штук.
Там нету setInterval, нету onEnterFrame. Все просто. Подгрузили xml, swf. наклепали на всю карту объекты.
При перетаскивании карты - тормозит дело. Можно как-нить облегчить?
Вариант - bitmapData - предложили. Спасибо. Это на крайний случай, хочеться все-таки векторную карту.
Добавлено через 10 минут
Заменил на функцию onMouseMove.
при простоит загрузка ЗП 4-5%. При перетаскивании под 50%!!!
при реализации с setInterval. при простои 4-5%, а вот при перетаскивании всего 15%.
Ммм.. с чем это связано? ПОлучается что при двигании мышкой мы чаще выполняем эту функцию, чем два раза в секунду (если учитывать прошлый код с setInterval) ?
Добавлено через 12 минут
можно попроваботь заменить onEnterFrame. Но на что? как еще проверять, ушли эти объекты с поля зрения или нет?
Мне, признаться, лень разбираться в таком многословном коде с кучей неизвестно что хранящих переменных.Но все равно, ты герой.:D Я когда вижу в коде конструкции типа _root.map.map2.array_swf[tmp_street[0]] сразу бросаю в нем разбираться.
Barzometr
27.02.2009, 11:44
Но все равно, ты герой.:D Я когда вижу в коде конструкции типа _root.map.map2.array_swf[tmp_street[0]] сразу бросаю в нем разбираться.
:rolleyes:
Когда зум делаеш максимально отдаленный видно что
if (!_root.mc_hittest.hitTest(this)) {
removeMovieClip(this);
}
не работает
Barzometr
27.02.2009, 12:07
Когда зум делаеш максимально отдаленный видно что
if (!_root.mc_hittest.hitTest(this)) {
removeMovieClip(this);
}
не работает
Была залита карта с полной загрузкой без обработчика. сейчас залил оба варианта. Смотрим разницу.
http://onlinevdonsk.ru/ - карта с обработчиком. (где как раз и есть этот remove, работает вроде.)
http://onlinevdonsk.ru/index_full_load.php - карта с полной загрузкой сразу всех объектов. Без обработчика.
Там карта постепенно отрисовывается и старые обьекты каторые уже в незоны видимости остаются.
Barzometr
27.02.2009, 12:29
Вот скрины.
Переместились влево. Потом перемещаемся снова вправо, и видим что старых построик уже нету.
По поводу двух последних карт - как я и говорил,полная карта бегает как бешеная, в то время как прорисовка жутко тормозит (только не надо руками двигать - из-за использования "два раза в секунду" вместо onMouseMove зрелище то еще, используйте кнопочки и увидите разницу).
Добавлено через 20 минут
Я хочу сказать что цикл хитТест+удаление+аттач навряд ли занимает меньше времени, чем смещение нарисованных объектов.
В любом случае, если Вам так хочется играться с видимостью/невидимостью, от хитТеста надо избавиться. Сравнение чисел всетаки быстрее - зачем нужен клип, с которым проводится хитТест чисел? Разве размеры Стейджа неизвестны? Сделайте простую проверку из блоков ()&&()&&() причем в первый блок поставить наиболее вероятное несовпадение)) , ну скажем _х < -_width, и такая проверка будет летать по сравнению с хитТестом. Но и это всеравно не оптимально((((
Barzometr
27.02.2009, 15:27
По поводу двух последних карт - как я и говорил,полная карта бегает как бешеная, в то время как прорисовка жутко тормозит (только не надо руками двигать - из-за использования "два раза в секунду" вместо onMouseMove зрелище то еще, используйте кнопочки и увидите разницу).
Добавлено через 20 минут
Я хочу сказать что цикл хитТест+удаление+аттач навряд ли занимает меньше времени, чем смещение нарисованных объектов.
В любом случае, если Вам так хочется играться с видимостью/невидимостью, от хитТеста надо избавиться. Сравнение чисел всетаки быстрее - зачем нужен клип, с которым проводится хитТест чисел? Разве размеры Стейджа неизвестны? Сделайте простую проверку из блоков ()&&()&&() причем в первый блок поставить наиболее вероятное несовпадение)) , ну скажем _х < -_width, и такая проверка будет летать по сравнению с хитТестом. Но и это всеравно не оптимально((((
Вы хотите сказать, у вас http://onlinevdonsk.ru/index_full_load.php эта бегает быстрее, чем http://onlinevdonsk.ru/ ?
При полной загрузки, у меня лично тормозит жутко. А вот при видимости/невидимости - бегает еще нормально.
Вот я просто зашол на http://onlinevdonsk.ru/index_full_load.php и проц под 30% сразу ушол, из-за чего? там же просто объекты и все. никаких hittest'ов, циклов и тд. нету.
Ну, попробую избавить от хиттеста.
Добавлено через 4 минуты
Код карты http://onlinevdonsk.ru/index_full_load.php
//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();
Код карты http://onlinevdonsk.ru/
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 = 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;
};
_root.onMouseDown = function() {
startDrag(_root.map.map2);
};
_root.onMouseUp = function() {
stopDrag();
};
stop();
Добавлено через 5 минут
вот смотрите.
При полной прорисовки карты, она тормозит сильнее, чем если используем hittest и setInterval.
Почему?
При передвижении по карте стрелками она вообще не тормазит:) в варианте с полной прорисовкой.
Вот именно. Внимательно перечитайте.
Barzometr
27.02.2009, 16:24
Вот именно. Внимательно перечитайте.
но стрелки - не модно :).
А если попробовать, при клике использовать не Drag, а например, при клике включать функцию, которая двигала бы карту в ритм мышке. А когда отпустили клик, выключась функция. Будет шустрее работать? иль как?
Добавлено через 43 секунды
а вот скажите, столько загрузка ЦП у вас при открытой полной карты ? (полная загрузка карты которая).
То что Вы описали и есть onMouseMove.
Не обещаю шустрость, но подумайте сами - если не будет при этом все удаляться/вычисляться/аттачится, если карта целиком нарисована и все. Просто двигаем. ??
Сейчас она "тормозит" очень ровно, а именно - перерисовывается 2 раза в секунду))))) Я уж не знаю что Вы там поменяли/не поменяли в коде, но 2 fps интервальные так и остались - когда таскаешь руками. Выбросьте все ненужное и посмотрите что будет с таким комплектом - onMouseMove включается после нажатия и работает до отпускания, так и таскаем. А карта не перерисовывается вообще. Нарисована сразу вся. Попробуйте. Я не даю никаких гарантий. Но Вы уже три раза меня не послушали, а я всё пишу и пишу))) Уважьте старика, сделайте примерчик))
Добавлено через 5 минут
Забыл про загрузку ЦП отчитаться))
Когда захожу, прыгает с 4 на 28 и тут же скатывается до 9. Отличный результат. НО через полсекунды =) (я нимагу) - опять до 20 и вниз, и так два раза в секунду. Ну понятно, creatObj();
Barzometr
28.02.2009, 03:12
//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() {
setProperty("", _quality, "low");
startDrag(_root.map.map2);
};
_root.onMouseUp = function() {
setProperty("", _quality, "medium");
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();
код карты http://onlinevdonsk.ru/index_full_load.php
добавил кодик setProperty("", _quality, "low"); стало еще полегче при перемещении.
Но вот смотрите. В этой карте нету setInterval, onEnterFrame.
При простои карты загрузки ЦП нету. Все правильно. Но вот стоит поводить мышкой по рабочей области ( просто поводить, никаких циклов на onMouseMOve нету), а почему тогда ЗП подлитает аж до 40-50% ? что ему не нравиться?
Добавлено через 2 минуты
замену starDrag() пока не трогаем.
Потому что флеш рендерер перерисовываит 500 раз в секунду все обьекты на карте при startDrag()
Поражаюсь своему терпению... Но ведь это мои проблемы, что я плохо объясняю, да?
Попробуем Вашим способом, с картинками))
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");
};
// Итак при загрузке какого-либо клипа mcLoaderом мы сразу загружаем две хмлки
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(loadListener);
// Ну и (конечно же, чтоб не создавать лишний Объект)) мы грузим СРАЗУ ДВА клипа
// загрузчиком mcLoader. Таким образом, мы получаем ДВА события Complete
// и соответственно ДВА вызова loadListener.onComplete
// и соответственно ДВА раза загрузим по две хмлки
// и каждая из них при каждой своей загрузке вызовет creatObj или creatObj2
// которые наттачат все объекты на карту. Ну и что что два раза?
// Зато график загрузки ЦП будет красивый, с холмиками))
mcLoader.loadClip("street.swf", _root.map.map2.array_swf);
mcLoader.loadClip("map.swf", _root.map.map2.map_swf);
Добавлено через 5 минут
qazwsx, это откуда такая информация? По-моему он перерисовывает точно в соответствии с заданным фпс флэшки. Именно поэтому и используют onMouseMove, что при движении мыши частота события гораздо выше чем фпс - но и тогда ПЕРЕРИСОВЫВАТЬ чаще чем фпс будет если только сказать об этом командой updateAfterEvent().
Добавлено через 26 минут
Еще я бы настоятельно рекомендовал Вам оптимизировать код и не губить мой процессор и мои глаза.
Если найдете время на обучение, почитайте вот эту темку - она в целом близка к Вашей, но я о другом - именно об оптимизации кода, начиная гдето со второй страницы
http://flasher.ru/forum/showthread.php?t=117966&page=2
Barzometr
28.02.2009, 18:10
больше не буду губить ваш проц :).
буду капаться, спс за ссылку и инфу :)
Не то чтобы флеш чтото делал в точности :D. Но очевидно что при заданом фпс и startDrag все тормазит, так зачем придератся?
к сожалению ссылки на карту не работают, так что посмотреть не могу. а так хотелось бы сравнить с моим творением (http://sykt.komimap.ru)
я бы вам посоветовал бы сделать карту на тайлах(tail), было бы намного удобнее и не тормозило бы совсем.
Идея такая
создаете массив карты, типа
var mymap = [
[1, 2, 3, 4, 5, 6, 7, 8, 0],
[1, 2, 3, 4, 5, 6, 7, 8, 0],
[1, 2, 3, 4, 5, 6, 7, 8, 0],
[1, 2, 3, 4, 5, 6, 7, 8, 0],
[1, 2, 3, 4, 5, 6, 7, 8, 0]
]
создаете один большой клип называете его map
далее при перетаскивании клипа map, проверяя координаты map, расчитывая какие клипы удалять, а какие добавлять.
вот так я это вижу...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.