![]() |
Реализую много травы
Доброго времени суток вам, товарищи! Вот, дело моего проэкта немного ковыряется, особенно после того, как школа кончилась. Хотел бы обсудить проблему, связанную с травой.
Хочу у себя в игре реализовать много травы. Но када её много, полезут тормоза и её надо будет как-то скрывать. Сначала я хотел скрывать её в зависимости от расстояния до камеры? но, учитывая, что травы у меня будет оо-о-очень много, а вычисление расстояния - это формула √(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 ? При таком количестве обьектов (позвольте догадаться- спрайты?) - производительность Блица сдохнет в мучительных конвульсиях. А трабла ведь решена годы назад! Карту на квадраты, в пределах квадратов траву в один сурфейс, и либо тупо автофейдить, либо использовать свой более оптимальныхз аналог ухода в ХайдЁнтити при отдалении. А то развели тут наркобизнес, понимаешь... )) |
Re: Реализую много травы
В-общем, действительно лушше на квады сделаю :)
|
Re: Реализую много травы
Незнаю как вы, но Дипломат говорит верно!
ЗЫ\ Я ето делаю просто, может показатся что несильно просто и быстро- но у меня нет СУПЕР гиганской базы и вот что я делаю: Я вмаксе ставлю всю трову куда мне надо, и потом соеденяю секции премерно 10 в один большой ТРАВ... Потом-же в блице гружу всю базу Анимом и нахожу всю ету растительность, трава распределена поименно, чем больше её размер тем дольше ана будет сохранятся в зоне видемости, а чем она менше и в зависимосте от настроек которые поставит Юзер- она прячется(действует безотказно, и скорость бешаная;)). Да ешо, если ты будеш делать чтото типа горной месности, то твоя трава будет тупо торчать на склонах(ели ты её конечно несобираешся по вектору выравнивать) И не советую юзать текстуру с альфой, лутше с маской(один куст с альфой = ~20 кустов с маской) |
Re: Реализую много травы
vlad, тут речь шла о Очень большой местности, а как нам известно блиц не может держать Огромное колличество объектов в памяти, поэтому их нужно загружать\выгружать из файлов содержащих о них информацию.
Насчёт склонов, он пошёл по другому пути, он как я понял собирается делать карту растительности: картинка с пикселями разных цветов, как уже было написано выше, она же должна быть пропорциональна карте высот 1 пиксель карты растительности на 1 пиксель карты высот, или 1 растительности на 4 высоты. Таким образом, будет трава расти не где угодно, а где "сказано" ;). |
Re: Реализую много травы
Господа! Ну так что же вы спорите? Создайте свою Очень Большую Местность, реализуйте алгоритм- благо он не сложен- и проверьте. Это сразу и навеки решит все вопросы.
;) Цитата:
|
Re: Реализую много травы
самое интересное что неподалеку есть аналогичная тема.
загрузите свою травяную карту в оперативку. загрузите модели травяного участка (квад 64 на 64) например. затем читая из оперативки (еще раз повторюсь что последовательное чтение из файла ради 9-16-25-36 и т.д. значений нерулит, а с seek-ами вы, господа, пожалуй возиться нестанете) вы ставите траву туда, куда надо. из оперативки считать 100, да хоть 1000, ето тьфу, ничто, вы даже задержки непочуствуете, объекты с травой кже загружены, и пресловутое копиентити - которе как известно геометрию некопирует (поетому очень быстрое) тормозить небудет, удаля то что уже ненужно - freeentity и всёёё. |
Re: Реализую много травы
Может проще будет создать n травяных кустов, по мере их выхода из зоны видимости помечать, как "свободные", и брать из списка "свободных" кусты для размещения на новом месте? Грубо говоря, перемещать всю траву вместе с игроком.
|
Re: Реализую много травы
2 Matt Merkulov: И ты, Брут! (с) :-)
2 HolyDel: Идея жизнеспособная, но что придётся делать, если твоим скопированным травяным участком придётся засадить не-плоскую-по-определению гору? ;) 2 Господа новички! Простите пожалуйста, но читать приводимые домыслы попросту надоело. Вот два примера, которые, надеюсь, разьяснят новичкам то, что всем остальным давно понятно и так. Сорри за сумбурность кода- я и так потратил на него 30 минут времени, которое мог потратить с заметно большей пользой, чем на демонстрации элементарных истин. Заметьте, что соотношение производительностей 1 к 2 (возможное отклонение зависит от соотношения производительностей процессор/виеокарта конкретной машины) не является константным. При увеличении площади участка отображаемой травы, различие производительностей первого и второго примера будет расти практически по экспотенте. Должен также заметить, что ускорить и первый, и второй пример можно приблизительно в полтора-два раза, что, впрочем, никак не повлияет на соотношение их производительностей. [blitz] ; Пример 1. "Многокустье" ;Инициализация графики Graphics3D 1024,768,32,1 ;Коллизия камера-уровень Const Env=1;окружение Const Unt=2;юнит Collisions Unt,Env,2,1 ;Камера. Она же игрок cam=CreateCamera() CameraRange Cam,0.5,257 PositionEntity Cam,128,2,128 EntityType Cam,Unt ;солнце Sun=CreateLight(1) TurnEntity Sun,45,45,0 LightColor Sun,250,200,150 ;Поле, по которому мы буем ходить Ground=CreatePlane() TexGround=CreateTexture(64,64,1) EntityTexture Ground,TexGround SetBuffer TextureBuffer(TexGround) For x=0 To 63 For y=0 To 63 Color Rnd(64),Rnd( 128 ),Rnd(32) Plot x,y Next Next ;небо, ограничивающее наше поле Sky=CreateSphere( 8 ) PositionEntity Sky,128,0,128 EntityType Sky,Env ScaleEntity Sky,128,128,128 FlipMesh Sky TexSky=CreateTexture(64,64,1) EntityTexture Sky,TexSky SetBuffer TextureBuffer(TexSky) For y=0 To 63 Color y*3,y*4,128+y*2 Line 0,y,63,y Next ;Модель куста травы MGrass=CreateCube() ScaleMesh MGrass,0.5,0.9,0.5 PositionMesh MGrass,0,1,0 EntityFX MGrass,16 TexGrass=CreateTexture(64,64,4) EntityTexture MGrass,TexGrass SetBuffer TextureBuffer(TexGrass) Col= 0 Shl 24 Or 0 Shl 16 Or 0 Shl 8 Or 0 Shl 0 For x=0 To 63 For y=0 To 63 WritePixel x,y,col Next Next For q=0 To 20 Color Rnd( 128 ),Rnd(255),Rnd(64) Line 20+Rnd(20),60,5+Rnd(55),5+Rnd(30) Next HideEntity MGrass ;создаём тип кустов травы Type Grass Field Model End Type ;создаём карту растительности Dim GrassMap(256,256),GrassOnMap(256,256) For i=0 To 256 For j=0 To 256 GrassMap(i,j)=1 Next Next ;Гл.Цикл SetBuffer BackBuffer() While Not KeyHit(1) ;Таймер If M<MilliSecs() Then M=M+40 If M+40<MilliSecs() Then M=MilliSecs()+40 ;игрок ходит If KeyDown(203) Then TurnEntity cam,0,5,0 If KeyDown(205) Then TurnEntity cam,0,-5,0 If KeyDown(200) Then MoveEntity cam,0,0,0.3 If KeyDown( 208 ) Then MoveEntity cam,0,0,-0.2 EndIf ;управление травой с некой периодичностью If GrassDelay<MilliSecs() Then GrassDelay=MilliSecs()+100 ;создание нужной травы PlayerX=EntityX(cam) PlayerZ=EntityZ(cam) For ScanX=PlayerX-32 To PlayerX+32 For ScanZ=PlayerZ-32 To PlayerZ+32 If ScanX>=0 And ScanZ>=0 And ScanX<=256 And ScanZ<=256 Then If GrassMap(ScanX,ScanZ)=1 And GrassOnMap(ScanX,ScanZ)=0 Then grs.grass=New grass grs\Model=CopyEntity(MGrass) ScaleEntity grs\Model,Rnd(2),Rnd(1),Rnd(2) PositionEntity grs\Model,ScanX,0,ScanZ GrassOnMap(ScanX,ScanZ)=1 NGrass=NGrass+1 EndIf EndIf Next Next ;удаление ненужной травы For grs.grass=Each grass If EntityDistance(grs\Model,cam)>32 Then GrassOnMap(EntityX(grs\Model),EntityZ(grs\Model))= 0 NGrass=NGrass-1 FreeEntity grs\Model Delete grs.grass EndIf Next EndIf ;Подсчёт FPS If MFPS<MilliSecs() Then MFPS=MilliSecs()+1000 CurrentFPS=FPS FPS=0 Else FPS=FPS+1 EndIf UpdateWorld() RenderWorld() Flip(0) Color 255,255,255 Locate 10,10 Print "FPS: "+CurrentFPS Print "Number of grass bushes: "+NGrass Print "Triangles in frame: "+TrisRendered() Wend End[/blitz] ==================================== [blitz] ;Пример 2. "Синглсёрфейс". ;Инициализация графики Graphics3D 1024,768,32,1 ;Коллизия камера-уровень Const Env=1;окружение Const Unt=2;юнит Collisions Unt,Env,2,1 ;Камера. Она же игрок cam=CreateCamera() CameraRange Cam,0.5,257 PositionEntity Cam,128,2,128 EntityType Cam,Unt ;солнце Sun=CreateLight(1) TurnEntity Sun,45,45,0 LightColor Sun,250,200,150 ;Поле, по которому мы буем ходить Ground=CreatePlane() TexGround=CreateTexture(64,64,1) EntityTexture Ground,TexGround SetBuffer TextureBuffer(TexGround) For x=0 To 63 For y=0 To 63 Color Rnd(64),Rnd( 128 ),Rnd(32) Plot x,y Next Next ;небо, ограничивающее наше поле Sky=CreateSphere( 8 ) PositionEntity Sky,128,0,128 EntityType Sky,Env ScaleEntity Sky,128,128,128 FlipMesh Sky TexSky=CreateTexture(64,64,1) EntityTexture Sky,TexSky SetBuffer TextureBuffer(TexSky) For y=0 To 63 Color y*3,y*4,128+y*2 Line 0,y,63,y Next ;Модель куста травы MGrass=CreateCube() ScaleMesh MGrass,0.5,0.9,0.5 PositionMesh MGrass,0,1,0 EntityFX MGrass,16 HideEntity MGrass ;создаём карту растительности Dim GrassMap(256,256),GrassClaster(16,16) ;создаём синглмешевую траву, разбитую на участки-кластеры For x=0 To 16 For z=0 To 16 NGrass=NGrass+1 GrassClaster(x,z)=CreateMesh() PositionEntity GrassClaster(x,z),x*16+8,0,z*16+8 EntityAutoFade GrassClaster(x,z),30,32 Next Next For x=0 To 256 For z=0 To 256 GrassMap(x,z)=1 If GrassMap(x,z)=1 Then TempGrass=CopyMesh(MGrass) ScaleMesh TempGrass,Rnd(2),Rnd(1),Rnd(2) PositionMesh TempGrass,x,0,z AddMesh TempGrass,GrassClaster(x/16,z/16) FreeEntity TempGrass EndIf Next Next TexGrass=CreateTexture(64,64,4) SetBuffer TextureBuffer(TexGrass) Col= 0 Shl 24 Or 0 Shl 16 Or 0 Shl 8 Or 0 Shl 0 For x=0 To 63 For y=0 To 63 WritePixel x,y,col Next Next For q=0 To 20 Color Rnd( 128 ),Rnd(255),Rnd(64) Line 20+Rnd(20),60,5+Rnd(55),5+Rnd(30) Next For x=0 To 16 For z=0 To 16 PositionMesh GrassClaster(x,z),-x*16-8,0,-z*16-8 EntityTexture GrassClaster(x,z),TexGrass Next Next ;Гл.Цикл SetBuffer BackBuffer() While Not KeyHit(1) ;Таймер If M<MilliSecs() Then M=M+40 If M+40<MilliSecs() Then M=MilliSecs()+40 ;игрок ходит If KeyDown(203) Then TurnEntity cam,0,5,0 If KeyDown(205) Then TurnEntity cam,0,-5,0 If KeyDown(200) Then MoveEntity cam,0,0,0.3 If KeyDown( 208 ) Then MoveEntity cam,0,0,-0.2 EndIf ;Подсчёт FPS If MFPS<MilliSecs() Then MFPS=MilliSecs()+1000 CurrentFPS=FPS FPS=0 Else FPS=FPS+1 EndIf UpdateWorld() RenderWorld() Flip(0) Color 255,255,255 Locate 10,10 Print "FPS: "+CurrentFPS Print "Number of grass bushes: "+NGrass Print "Triangles in frame: "+TrisRendered() Wend End[/blitz] Я сожалею, что мне пришлось выполнить ту небольшую и несложную работу, которую должен был выполнить автор темы, прежде, чем заводить сеё лишенное смысла и давно решенное обсуждение. Надеюсь, приведенные примеры кому-то действительно помогут. Удачи. --Добавлено-- Первый пример содержит баг: заметьте, что часть создаваемых в первом цикле вокруг игрока кустов тут же удаляется во втором. Полагаю, вы сумеете исправить его самостоятельно. Впрочем, на ФПС баг влияет незначительно, т.к. тормозит в первом примере далеко не только логика. |
Re: Реализую много травы
хаха, делай траву как в WOW-е и не будут тебя мучать тормоза
|
Часовой пояс GMT +4, время: 05:03. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot