![]() |
Реализую много травы
Доброго времени суток вам, товарищи! Вот, дело моего проэкта немного ковыряется, особенно после того, как школа кончилась. Хотел бы обсудить проблему, связанную с травой.
Хочу у себя в игре реализовать много травы. Но када её много, полезут тормоза и её надо будет как-то скрывать. Сначала я хотел скрывать её в зависимости от расстояния до камеры? но, учитывая, что травы у меня будет оо-о-очень много, а вычисление расстояния - это формула √(x2-x1) ² + (y2-y1)², если вычислять много раз - будут тормоза. Думаю сделать так: создаём якорь (пивот), к которому привязаны кустики травы и рассчитываем расстояние только до него а не до каждой травинки по-отдельности и в зависимости от этого скрываем или показываем всё привязанное к данному якорю вместе, таким образом уменьшая вычисления. Примерная схема сего: ![]() Вопрос: будет ли от этого толк? |
Re: Реализую много травы
Толк будет лишь в вычеслении, трисы же разумеется остануться прежними.
Толк будет, небольшой. Ещё сделай вот что: Не каждый цикл, а каждый период времени для каждого пучка, рандомно от 500 до 1000, каждый этот период проверяй, на дистанцию до пучка, и почему время разнобойное, это для того что-бы не в один моммент проверять для всех травинок, этим ты разгружаешь один моммент, растягивая его на относительно постоянное, и меньшее лагование =) А плавное скрывание, используя альфу каждый цикл. ЗЫ, конопля внизу? О чём игра? ;) |
Re: Реализую много травы
Дык мне и нужен толк в вычислении :) А можно ли вычислять отдельно для каждого кустика и сильно ли это повлияет на производительность?
З.Ы. когда рисовал, то рисовал просто кустик, а щас глянул - еонопля 100%ная :-) |
Re: Реализую много травы
Global time=Millisecs()
цикл:.... ..... if Millisecs()-time>1000(в зависемости от динамики игры, если медленная то +-5000) Update_trava() time=Millisecs() EndIf И будет тебе счастье! |
Re: Реализую много травы
vlad, Update_trava() - это вычисление по каждому кусту, я так понял?
|
Re: Реализую много травы
Это сама функция вычесленимй, а что там решать тебе.
Отвечу прямо, толк в вычислениях относительно 1 пивота к которому привязано например 8 пучков травы, есть. Производительность вырастит в ~8 раз. :) |
Re: Реализую много травы
ну вы паритесь а команда EntityAutoFade нафига? Вроде именно для этого ;)
|
Re: Реализую много травы
Ой она же ужасно тормозная! Не навижу эту команду, лчше сделать ручками =)
|
Re: Реализую много травы
Дык может математику в длл перегнать? Так то толк будет вроде.
|
Re: Реализую много травы
Ну там математики не очень много.
Ещё совет про траву, лучше не создавать сначала, и скрывать\показывать. А перемещать, тоесть, те что уже не видишь перемещать или срывать, если перемещать, то на место где должна быть видна другая трава. |
Re: Реализую много травы
В-общем, почитал, что вы написали и придаумал такой алгоритм:
Файл, отвечающий за расстановку травы - есть черно-белое изображение. Где оно светлое - там есть трава, где оно тёмное - там её нет, а где оно серое - по степени светлости пикселя вычисляем, много ли на это место ставить траы. Алгоритм в общих чертах: 1. Стартует игрок. 2. вокруг игрока на дистанцию, на которой показываем траву, читаем пиксели на карте покрытия травой. 3. Соответственно этому по координатам, соостветствующим этим пихселям, расставляем траву - на белых пикселях больше, на серых - меньше, на чёрных - не ставим: ![]() 4. Обновление травы. Если игрок переместился так, что какой-то куст стал от него слишком далёким, то помечаем его как невидимый. Если появилась клетка, где надо поствить траву, то мы не создаём её, а перемещаем самый дальний невидимый куст - и так по циклу. |
Re: Реализую много травы
читать из тексы???
каждый тик???? много пикселей (в радиусе)????? етож будет тормозить. |
Re: Реализую много травы
Значит предлагаю такую версию:
Если мир огромный, то карт травы будет немало, и трава соответственно разная. Значит, картинок будет не одна, придерживайся 128х128, для быстрого считывания, формат пнг. Далее, при загрузки сектора (сектор примерно 1х1 км, и на каждый сектор своя карта травы), так вот при загрузки, читаем пиксели всей карты, они могут быть (я делал так), разных цветов, например: Чёрный - ничего. Зелёный - Зелёная трава. Жёлтый - пустынная. Поносовый - Болотная. И т.п. И читая все кипсели, просто переносим в массив: Dim SecGrass%(128,128) (x,z) Каждый цвет имеет свой индекс, например, если нету травы (чёрный), то 0, если зелёная - 1, ну и т.д. Далее уже исходя из массива, отрисовывать траву по алгоритму, скрыть, или перместить, или ещё чё ;) |
Re: Реализую много травы
Мдя.....а не проще весь километр травы вогнать в один сурфейс и не париться? - тормозов не будет гарантированно! но зато появиться тоннельный эффект если будешь юзать траву с альфаканалом..... - в этом случае лучше юзать маску.
ЗЫ Занятное чтиво....если почитать со стороны юзверя то разговор получается двусмысленным.....=) Даже название топика "Реализую много травы" - сбивает с толку....=))) |
Re: Реализую много травы
Цитата:
Тут народ радостно теоретизирует, причём изначально весь разговор не имеет ничего общего с кодоприменительной практикой на Блице. Читать из тексы- тормозить будет? Ну ессно будет. А они всю математику на Пуребасик перенесут- и не будет. Гы. Гы! Гы-гы-гыгыгы! А кто-нибудь задумался о том, сколько отдельных траво-ёнтитей с их пивотами поддержки нужно для засаживания газоном площадки хотя бы 64х64 ? При таком количестве обьектов (позвольте догадаться- спрайты?) - производительность Блица сдохнет в мучительных конвульсиях. А трабла ведь решена годы назад! Карту на квадраты, в пределах квадратов траву в один сурфейс, и либо тупо автофейдить, либо использовать свой более оптимальныхз аналог ухода в ХайдЁнтити при отдалении. А то развели тут наркобизнес, понимаешь... )) |
Часовой пояс GMT +4, время: 01:18. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot