Пятница, 29 Ноября 2024, 19:46

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Различные поведения связанные с большим массивом.
CupuycДата: Среда, 09 Мая 2012, 18:10 | Сообщение # 1
участник
Сейчас нет на сайте
Массив очень удобный способ хранения данных, именно его мы выбрали для хранения ландшафта нашей игры. Я бы хотел иметь возможность работать с ним для работы поведения вроде физики жидкостей или роста деревьев. Для подобных поведений, однако, прежде чем что-то перезаписывать в массиве, следует проверять нужно ли что-то делать и подходит ли место для того, чтобы туда, скажем, текла вода. Существует функция "For each element", она перебирает массив и находит нужные места в данных.
Однако, карта (А следственно и массив) большая, постоянно или часто использовать "For each element", значит обречь игрока на низкую производительность, что естественно недопустимо. Обойтись без таких поведений сложно, игровой мир будет не слишком "живым".
Можно ли попросить подсказать какое-то решение по данной проблеме? Я считаю это важный момент, а наши идеи и практические пробы, пока ничего толком и не дали. Не хотелось бы засиживаться на этом этапе.


Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass
allxumukДата: Среда, 09 Мая 2012, 18:32 | Сообщение # 2
старожил
Сейчас нет на сайте
Quote (Cupuyc)
обречь игрока на низкую производительность

Насколько падает производительность? По-моему, когда я последний раз пользовался функцией For each element она тупила и работала не корректно. Попробуй простые циклы For. Один цикл для строк (Y), и внутри него цикл для колонок (X).


Любой дурак может написать программу, которую поймёт компилятор.
Хорошие программисты пишут программы, которые смогут понять другие программисты.
CupuycДата: Среда, 09 Мая 2012, 18:54 | Сообщение # 3
участник
Сейчас нет на сайте
Quote
Насколько падает производительность? По-моему, когда я последний раз пользовался функцией For each element она тупила и работала не корректно.

Прилично падает, на 30-40%(( Но поведение ведет себя правильно.
Quote
Попробуй простые циклы For. Один цикл для строк (Y), и внутри него цикл для колонок (X).

Хм, всмысле? Это ведь тоже перебор, тоже постоянный, я такой принцип в инвентаре использую, чтобы проверять свободное пространство. Только с массивом Array.currentX\Y\Z, а тут в петле loopindex("x\y"). Тут не другую форму перебора надо брать, а что-то другое придумать, я просто немного в тупике, а вопрос стоит довольно остро((


Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass


Сообщение отредактировал Cupuyc - Среда, 09 Мая 2012, 18:58
allxumukДата: Среда, 09 Мая 2012, 19:17 | Сообщение # 4
старожил
Сейчас нет на сайте
Тогда нужно перебирать не всё. Отсеивать незадействованные участки как-то. Собственно здесь циклы и помогут, проверять не весь массив сразу, а только нужную часть.

Любой дурак может написать программу, которую поймёт компилятор.
Хорошие программисты пишут программы, которые смогут понять другие программисты.
CupuycДата: Среда, 09 Мая 2012, 19:28 | Сообщение # 5
участник
Сейчас нет на сайте
Quote
Собственно здесь циклы и помогут, проверять не весь массив сразу, а только нужную часть.

Ты понял чего я хочу, а также чего мне нехватает смекалки додумать, понятно, на блюдичке никто не подаст, но я надеялся хотя-бы на небольшую наводку. Нужен алгоритм, он может работать и в цикле, но каков же будет его принцип? x)


Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass
allxumukДата: Среда, 09 Мая 2012, 19:32 | Сообщение # 6
старожил
Сейчас нет на сайте
Пока могу ответить только 42. Для более точного ответа, нужно знать вопрос. Как происходит игра, как рассматривается карта, как она сейчас обрабатывается...

Любой дурак может написать программу, которую поймёт компилятор.
Хорошие программисты пишут программы, которые смогут понять другие программисты.
CupuycДата: Среда, 09 Мая 2012, 19:47 | Сообщение # 7
участник
Сейчас нет на сайте
А мне кажется, что тут всё достаточно ясно. Есть двухмерный массив, в котором если есть блок то значение не равно нулю, там будет айди блока. Мы делали прииииииимерно так: Если "For each element" перебирая находит в массиве блок воды, то он проверяет рядом свободное пространство и заполняет его водой.
Повторю: Я не хочу перебирать весь массив, машину это грузит, нет ли идей как подойти к делу мягче. Только не предлагайте обрабатывать такие поведения только в пределах экрана.


Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass


Сообщение отредактировал Cupuyc - Среда, 09 Мая 2012, 19:52
allxumukДата: Среда, 09 Мая 2012, 19:59 | Сообщение # 8
старожил
Сейчас нет на сайте
Quote (Cupuyc)
Если "For each element" перебирая находит в массиве блок воды

Проще пойти "от обратного" и проверить не все ячейки массива, а всю воду. Воды наверняка меньше, чем остальных ячеек. Т.к. игра у вас завязана на массив, думаю по координатам спрайта "с водой" можно вычислить ячейку, в которой он лежит.


Любой дурак может написать программу, которую поймёт компилятор.
Хорошие программисты пишут программы, которые смогут понять другие программисты.
CupuycДата: Среда, 09 Мая 2012, 20:11 | Сообщение # 9
участник
Сейчас нет на сайте
Дело в том, что не везде где вода - спрайт. Если бы у нас так было, то компьютер не выдержал бы таких нагрузок. Количество блоков формирующих ландшафт - огромно. Именно поэтому нам и нужен массив вообще) Спрайты, в рамках нашей системы, создаются только в пределах экрана и удаляются за его пределами, с учетом зуммирования и размеров окна. Только так, мы можем сделать, чтобы не кушать зря ресурсы компьютера. Следовательно, не всё так просто.
Использовать "спрайт" воды для выявления количества и расположения блоков воды - нам недоступно.

Добавлено (09.05.2012, 20:11)
---------------------------------------------
Хотя, гипотетически, ход ваших мыслей верен. Даже за то, что вы задумались, вам уже спасибо.


Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass


Сообщение отредактировал Cupuyc - Среда, 09 Мая 2012, 20:10
allxumukДата: Среда, 09 Мая 2012, 20:15 | Сообщение # 10
старожил
Сейчас нет на сайте
Хм, да это проблема. Тогда продолжим мозговой штурм (очень полезная штука, рекомендую).
Что если массовый просчёт карты проводить только в начале уровня. При этом записать информацию о ячейках с водой в другой массив. Ячейки этого, отдельного, массива заменят спрайты. А дальше, как в прошлом варианте.


Любой дурак может написать программу, которую поймёт компилятор.
Хорошие программисты пишут программы, которые смогут понять другие программисты.
CupuycДата: Среда, 09 Мая 2012, 20:26 | Сообщение # 11
участник
Сейчас нет на сайте
Так, использовать массив такой же размерности не целесообразно, т.к. перебирать его, это почти тоже самое. Верно то, что тут нужно менять организацию данных. Пойду напрягу свой глупый мозг для реализиации. Еще раз спасибо, ваша идея видимо именно то, что нужно))

Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass


Сообщение отредактировал Cupuyc - Среда, 09 Мая 2012, 20:28
allxumukДата: Среда, 09 Мая 2012, 20:28 | Сообщение # 12
старожил
Сейчас нет на сайте
Quote (Cupuyc)
Так, использовать массив такой же размерности не целесообразно, т.к. перебирать его, это почти тоже самое.

Не той же размерности. Просто в 2 строки записать X и Y ячеей с водой.


Любой дурак может написать программу, которую поймёт компилятор.
Хорошие программисты пишут программы, которые смогут понять другие программисты.
CupuycДата: Среда, 09 Мая 2012, 20:29 | Сообщение # 13
участник
Сейчас нет на сайте
Да, я вас понял))

Законопослушно-добрый паладин. Блог ЭпикДаст VK
Stone Sour - Through Glass
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг