Имеется в виду размер карты. Я создал триггер, который создаёт точку, проверяет текстуру земли, создаёт в точке объект (соответствующий местности), удаляет эту точку и перезапускает себя. Естественно, когда количество объектов каждого типа становится равным нужному числу, рекурсия прерывается, и триггер отключается.
На карте 64х64 всё действует идеально. Несколько секунд - и готово. Но когда я увеличил границы карты, то Warcraft стал просто вылетать, даже не успевая выдать ошибку.
Поставил после всех действий ожидание в 0 секунд - вылета не происходит, но объекты на карту ставятся очень долго. Например, около 1500 исполнений триггера при размерах карты 96х96 и количестве объектов 360 (18 видов по 20 штук). А карту и количество объектов и их типов я планирую расширять.
Существует ли способ обойтись без ожидания или вообще как-нибудь ускорить расстановку?

Принятый ответ

Maniac_91, фактически такая генерация и была придумана Нотчем для майнкрафта. Просто обычная система "биомов". Это кстати очень неплохо, ведь для каждого биома ты можешь подгружать свой пул декораций и так разнообразить визуальную составляющую игры.
Так же перед началом игры (после загрузки карты), можно сделать плашку "загрузки генерации", которая показывала бы пользователям % готовность генерации. А далее, таймерами или вейтами, выставлять "отдых" для варкрафта из-за нагрузки. Мол, каждые 1500 выполнений триггера - отдохни на секунду, хорош.
0
20
7 лет назад
0
выставь на другой карте нужный размер, скопируй туда триггер и посмотри, появится ли ошибка
0
18
7 лет назад
Отредактирован Maniac_91
0
ssbbssc, случилось то же самое - вылет игры.
С помощью сохранения через JNGP удалось добиться, чтобы не вылетало при размерах 160х160 без ожидания, но это пока что предел.
1
20
7 лет назад
1
Maniac_91, а если поиграть с ожиданием? Мол выставлять по 64x64 каждые пол секунды? И так в конце концов у тебя заполнится вся карта.
0
18
7 лет назад
0
DemonoiD, тогда нужно будет скопировать условия и пересчитать для каждого квадрата количество объектов. Например, всего 100 камней должно быть на карте. Из них 10 в в поле, 20 - в лесу, 30 - в пустыне и т.д. Делим карту на квадраты. И получается, что один кусок леса в одном квадрате, другой - в другом, причём они не равны. И надо переделать формулы таким образом, чтобы приблизительно равномерно всё было.
Совет полезный, и, если способов попроще не найдётся - придётся всё перерассчитывать, по ходу.
0
15
7 лет назад
0
Как я понял, Варик зависает из-за слишком большой нагрузки в один момент времени (т.к. по твоим словам с ожиданием ничего не вылетает)
Попробуй поставить таймер с периодом 0.001 сек, например.
2
20
7 лет назад
2
Maniac_91, фактически такая генерация и была придумана Нотчем для майнкрафта. Просто обычная система "биомов". Это кстати очень неплохо, ведь для каждого биома ты можешь подгружать свой пул декораций и так разнообразить визуальную составляющую игры.
Так же перед началом игры (после загрузки карты), можно сделать плашку "загрузки генерации", которая показывала бы пользователям % готовность генерации. А далее, таймерами или вейтами, выставлять "отдых" для варкрафта из-за нагрузки. Мол, каждые 1500 выполнений триггера - отдохни на секунду, хорош.
Принятый ответ
0
18
7 лет назад
Отредактирован Maniac_91
0
JackFastGame, так оно и есть, скорее всего.
DemonoiD, про генерацию в Майнкрафте не знал) Но именно так и делаю.
можно сделать плашку "загрузки генерации", которая показывала бы пользователям % готовность генерации.
Да, так я и планирую.
А далее, таймерами или вейтами, выставлять "отдых" для варкрафта из-за нагрузки.
Можно поставить условие:
если остаток (количество выполнений триггера / 1000) = 0, то ждать.
Надеюсь, это сработает. Завтра попробую так сделать.
0
20
7 лет назад
0
Maniac_91:
было бы интересно посмотреть на карту-пример
2
18
7 лет назад
2
DemonoiD, сработало)
Сделал ожидание каждые 100 выполнений триггера. Не очень тормозит, а главное - никаких вылетов)
ssbbssc, попозже скину карту в ЛС. Может, что-нибудь посоветуешь для оптимизации или какие-нибудь интересные идеи))
2
28
7 лет назад
Отредактирован nvc123
2
Maniac_91, твоя ошибка в том что на создание 1 объекта происходит много лишних действий с триггером(которые занимают большую часть времени)
в данном случае лучше всего генерировать объекты порциями(например по 200 точек на порцию) с помощью циклов и отделять порции друг от друга вейтами (для избежания лимита потока)
это будет выглядеть как то так:
integer i=0 
integer j=0
цикл1{
	set i=0
	цикл2{
		выход из цикла2 если (все точки обработаны или i==200)
		обработать точку с номером i+(j*200)
		set i=i+1
	}
	выход из цикла1 если все точки обработаны
	set j=j+1
	вейт(0.01)
}
0
18
7 лет назад
0
nvc123, перечитал статьи о потоках и их лимитах. Согласен, через цикл лучше. Переделал.
0
28
7 лет назад
0
Переделал.
работает нормально или баг остался?
0
18
7 лет назад
0
nvc123, всё работает нормально.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.