Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.02.2009, 18:25
Barzometr вне форума Посмотреть профиль Отправить личное сообщение для Barzometr Найти все сообщения от Barzometr
  № 1  
Ответить с цитированием
Barzometr

Регистрация: Jun 2004
Сообщений: 121
По умолчанию тормозит карта. ЦП проца под 40%

Добрый день.

Наклепал карту.

Карта. Подгружаем объекты. Расставляем.
ничего сложного. Приметив.

И почему-то тормозит жутко.

вот сайт http://onlinevdonsk.ru


вот код.

Код AS1/AS2:
 
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 стоит. В настройках.

Старый 26.02.2009, 22:43
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну первое что бросается в глаза - Вы по два раза загружаете xmlки. Фиг бы с ним, они возьмутся из кэша. НО - ведь при окончании загрузки выполняется обработчик. Т.е Вы ДВА раза запускаете bd_load_xml_map.onLoad, который ДВА же раза запускает creatObj();
Может я что-то упустил и это не так - проверьте трейсом в теле creatObj();

Добавлено через 7 минут
Постойте, а это что такое?
Цитата:
SI_reSize = setInterval(creatObj, 500);
Это "ничего сложного. Приметив."?? А в чем смысл этого примитива - следить за ресайзом Стейджа чтоли? Так ведь для этого событие Resize есть у стейджа. Или всё сложнее?)))) Объясните.
__________________
Reality.getBounds(this);

Старый 26.02.2009, 22:55
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 3  
Ответить с цитированием
qazwsx
Banned

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
Я бы все в битмап рисовал и проверял по координатом клика нужно ли подсветит здание, или показать тул тип и тд. Ну а так я на сколько понял рисуется не только видимая часть карты а она просто постепенно отрисовывается)

Старый 26.02.2009, 23:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
ХитТест для [всех?] объектов 24 раза в секунду.... 40% говорите? Снимаю шляпу. Мне кажется, если б Вы нарисовали все эти объекты и перестали так упорно следить за их видимостью, всё бегало бы в разы живее.
__________________
Reality.getBounds(this);

Старый 26.02.2009, 23:20
qazwsx вне форума Посмотреть профиль Найти все сообщения от qazwsx
  № 5  
Ответить с цитированием
qazwsx
Banned

Регистрация: Mar 2008
Адрес: Krasnoyarsk
Сообщений: 587
За ними нужно следить только не так).

Старый 27.02.2009, 00:12
Barzometr вне форума Посмотреть профиль Отправить личное сообщение для Barzometr Найти все сообщения от Barzometr
  № 6  
Ответить с цитированием
Barzometr

Регистрация: Jun 2004
Сообщений: 121
Цитата:
Сообщение от qazwsx Посмотреть сообщение
За ними нужно следить только не так).
неподскажите как?

Цитата:
Сообщение от Wolsh Посмотреть сообщение
ХитТест для [всех?] объектов 24 раза в секунду.... 40% говорите? Снимаю шляпу. Мне кажется, если б Вы нарисовали все эти объекты и перестали так упорно следить за их видимостью, всё бегало бы в разы живее.
Ну вот я сейчас уменьшил FPS до 10 и убрал контуры у объектов, загрузка ЦП в простои 10-12%, при перемещении 20-22%.

Я слежу за ними, чтобы видеть, какие объекты нужно отобразить в данный момент. И я слежу не за самими объектами, а смотрю координаты в массиве, пробегаюсь по массиву. И если координаты удовлетворяют нынешнему условию - то я вставляю объект. Если он вышел из зоны видимости - удаляется.


Цитата:
Сообщение от qazwsx Посмотреть сообщение
Я бы все в битмап рисовал и проверял по координатом клика нужно ли подсветит здание, или показать тул тип и тд. Ну а так я на сколько понял рисуется не только видимая часть карты а она просто постепенно отрисовывается)
в Битмап - это же растр получиться. Тогда при увеличении\уменьшении будут пиксели. Ну можно конечно, но это на крайний случай.

Цитата:
Сообщение от Wolsh Посмотреть сообщение
Ну первое что бросается в глаза - Вы по два раза загружаете xmlки. Фиг бы с ним, они возьмутся из кэша. НО - ведь при окончании загрузки выполняется обработчик. Т.е Вы ДВА раза запускаете bd_load_xml_map.onLoad, который ДВА же раза запускает creatObj();
Может я что-то упустил и это не так - проверьте трейсом в теле creatObj();

Добавлено через 7 минут
Постойте, а это что такое?
Это "ничего сложного. Приметив."?? А в чем смысл этого примитива - следить за ресайзом Стейджа чтоли? Так ведь для этого событие Resize есть у стейджа. Или всё сложнее?)))) Объясните.
Ну.. то что он два раза выполняет creatObj(), эт да . Но все равно объкты создались по одному экземлпяру. И не все объекты, а только те которые попадают под условие - hitTest.
setInterval - слежу за объектами, пробегаюсь по массиву, и смотрю какие объекты нужно создать в данный момент.

Есть какой-нить другой способ?





Ну вот смотрите.
http://onlinevdonsk.ru/

Создаю сразу все объекты.

Код AS1/AS2:
 
//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, и убрал контур у объектов, стало бегать побыстрее. Но все равно тормозит .

Старый 27.02.2009, 01:52
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я просил объяснить, что делает интервал два раза в секунду. Что делает onEnterFrame, в котором хиттест для всех объектов из хмлки. Мне, признаться, лень разбираться в таком многословном коде с кучей неизвестно что хранящих переменных. Если Вам лень пояснить свой код, то подождем энтузиастов.
Пока же у меня подозрение что интервал, следящий за объектами, надо заменить обработчиком onMouseMove, ибо только при движении мышки объекты смещаются - тогда и надо делать вычисления.
То, что у Вас два раза грузится и обрабатывается хмлка, безусловно меркнет в свете вызова этой же функции creatObj два раза в секунду по интервалу. Вобщем чую подвох, но надо понять Вашу концепцию, чтобы чтото сказать о реализации. Объясните - подумаем. Прежде всего поясните "частые" функции. Зачем эти интервалы и onEnterFramе'ы в интервалах (!) Не вижу, как бы я применил их при создании такой карты.
__________________
Reality.getBounds(this);

Старый 27.02.2009, 02:54
Barzometr вне форума Посмотреть профиль Отправить личное сообщение для Barzometr Найти все сообщения от Barzometr
  № 8  
Ответить с цитированием
Barzometr

Регистрация: Jun 2004
Сообщений: 121
ну смотрите. Разберем первый код. Где есть обработчик.

исправили на один загрузчик.

Код AS1/AS2:
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

Код AS1/AS2:
 
 
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,

Код AS1/AS2:
for (i=0; i<_root.bd_xml_swf_street.length; i++) {


находит объекты, которые попадают под объект mc_hittest.

Код AS1/AS2:
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 или нет. Когда они выходят - они удаляются.

Код AS1/AS2:
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. Но на что? как еще проверять, ушли эти объекты с поля зрения или нет?

Старый 27.02.2009, 03:09
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 9  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Мне, признаться, лень разбираться в таком многословном коде с кучей неизвестно что хранящих переменных.
Но все равно, ты герой. Я когда вижу в коде конструкции типа _root.map.map2.array_swf[tmp_street[0]] сразу бросаю в нем разбираться.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 27.02.2009, 11:44
Barzometr вне форума Посмотреть профиль Отправить личное сообщение для Barzometr Найти все сообщения от Barzometr
  № 10  
Ответить с цитированием
Barzometr

Регистрация: Jun 2004
Сообщений: 121
Цитата:
Сообщение от iNils Посмотреть сообщение
Но все равно, ты герой. Я когда вижу в коде конструкции типа _root.map.map2.array_swf[tmp_street[0]] сразу бросаю в нем разбираться.

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:50.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 06:50.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.