PDA

Просмотр полной версии : Тормоза после минутного таскания карты мышкой


oam333
05.04.2010, 16:26
Есть сервер, где картинки лежат с именем типа x46_y67.png, где x и y - требуемые для карты координаты.

Есть алгоритм:

I. Добавление тайлов.
1. Создаю основной пустой мувиклип.
2. При запуске swf создаю пустой массив (var tile_list: Array = [];) координат тайлов, которые будут подгружаться/удаляться на/с основной мувиклип.
3. При каждом отпускании мышки после перетаскивания карты делаю следующее:
- если двигали влево, то в цикле находим самый левый тайл каждой координаты "y" и смотрим, не пора ли нарисовать рядом с ним еще один;
- если пора, то - уменьшаю "икс"-овый номер тайла на единицу и записываю номер нового тайла так:
tx = tile_list[min].t_tx - 1; //min - номер найденного тайла в массиве
ty = tile_list[min].t_ty;
где tx и ty - часть имени тайла, который лежит по пути www.site.ru/x46_y67.png (т.е. в данном примере tx=46 и ty=67);
- после этого создаю в основном мувиклипе новый мувик для нового тайла и запоминаю его координаты в массив tile_list:
//min - номер найденного самого левого тайла в массиве
var mc:MovieClip = mc_map.createEmptyMovieClip("mc_tile_" + tx + "_" + ty, mc_map.getNextHighestDepth());
mc_map["mc_tile_"+tx+"_"+ty]._x = tile_list[min].t_x - 256; //"икс"-овая координата нового тайла
mc_map["mc_tile_"+tx+"_"+ty]._y = tile_list[min].t_y; //"игрек"-овая координата нового тайла
mc_map["mc_tile_"+tx+"_"+ty].loadMovie("http://site.ru/x"+tx+"_y"+ty+".png");
tile_list[i_tile] = new Object();
tile_list[i_tile].t_tx = tx; //часть имени файла тайла на сервере
tile_list[i_tile].t_ty = ty; //часть имени файла тайла на сервере
tile_list[i_tile].t_x = mc_map["mc_tile_"+tx+"_"+ty]._x; //
tile_list[i_tile].t_y = mc_map["mc_tile_"+tx+"_"+ty]._y;
i_tile++; //количество тайлов в массиве tile_list

После этого снова проверяем не надо ли еще добавить к левой части новый тайл. Если надо, то операция повторяется, если не надо, то таким же образом смотрим все остальные 3 стороны карты.

После того, как отрисовали, надо же удалить то, что вышло за пределы экрана, чтобы не тормозило ничего и память не кушало? Поэтому пишем вторую функцию, которая будет все это дело удалять:

II. Удаление тайлов.
Поиск вышедших за пределы экрана тайлов происходит примерно так же, как и выше, т.е. вышедшие за пределы вообразимой границы тайлы находятся 100%, в этом я уверен.
Последовательность удаления тайлов:
mc_map["mc_tile_"+tx+"_"+ty].removeMovieClip();
tile_list.splice(min,1); //min - номер тайла в массиве, который нужно удалить
//но после этого почему-то место в массиве становится "undefined"
//долго не стал разбираться почему это и создаю новый массив уже без этих "undefined"
var tmp_tile = null;
var tmp_tile: Array = [];
for (k = 0; k < tile_list.length; k++) {
if (tile_list[k] != undefined) {
tmp_tile.push(tile_list[k]);
}
}
tile_list = null;
tile_list = tmp_tile;
tmp_tile = null;

Это пример для удаления, если мы двигали в одну сторону. Примерно также делается для остальных трех сторон.
Создание и удаление тайлов вынес в две разные функции. Если закомментировать функцию удаления, то тормоза начинаются намного раньше и сильнее, чем если не комментировать.
Массивов больше нет никаких.

Теперь вопрос:
правильно ли я удаляю то, что создал? Потому что где-то после минутного таскания мышкой долго начинают отрисовываться вновь создаваемые тайлы и загрузка процессора под 100%. И с каждым последующим тасканием - все дольше и дольше.
Ощущение такое, что где-то что-то я не доудалил...

Добавлено через 42 минуты
Вопрос снят.
i_tile забыл уменьшать при удалении мувиков.

random13
05.04.2010, 17:28
а что за проект делаете, очень интерено, или это военная тайна?

oam333
05.04.2010, 17:47
а что за проект делаете, очень интерено, или это военная тайна?

карта города, ничего необычного

random13
05.04.2010, 17:59
а есть что посмотреть, если есть то мона и через личку если не хатите ссылки палить, я сам заинтересован проектом, счас делаю как раз веб карту с подобным функционалом, можно было бы пообщаться на эту тему

oam333
05.04.2010, 18:05
а есть что посмотреть, если есть то мона и через личку если не хатите ссылки палить, я сам заинтересован проектом, счас делаю как раз веб карту с подобным функционалом, можно было бы пообщаться на эту тему

см. личку

random13
05.04.2010, 18:07
странно но в личке пусто