forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Веселые секреты (http://forum.boolean.name/showthread.php?t=152)

Diplomat 30.09.2005 17:46

Вложений: 2
Доброе время суток всем желающим написать на Блице Варкрафт-4!
So, не растекаясь мыслию по древу, сразу к примеру. :)

В прикрепленном архиве два .ББ файла: "1" и "2" соответственно, запустив которые можно посмотреть демку террана с лесом и летающей сверху камерой. Всё почти как в стратегиях, только нет орков и камера управляется клавишами управления курсора.
Файл "1" демонстрирует "принципиально простой", иначе- "классический"- метод реализации этого-самого леса.
Файл "2" демонстрирует "принципиально правильный" метод.
Понять чем они отличаются просто: первый у меня выдает 70ФПС когда в кадре нет вообще ничего и 40- когда в кадре много деревьев. Кроме того, он может просто заглючить на некоторых машинах (глюк Блица с террайнами) и исправить это будет невозможно. Никак.
Второй выдает соответсвенно 3000 и 150 ФПС, никогда не заглючит и если убрать деревья, станет видно, что террайн освещается заметно красивее. Недостатка два: тоннельный эффект на деревьях и долгая генерация террайна.

P.S. 2Новички: Комментов в примерах необходимый минимум. Однако, не смотря на внешнюю навороченность, даже во втором примере код предельно прост и требует лишь внимательного прочтения. Обратите внимание на алгоритмы соединения мешей, рендер-твининга и генерации террайна. Удачи! :ok:

Diplomat 01.10.2005 20:03

Что, так плохо, что ни у кого даже ругательных комментариев не возникло?
Как демка-то? Показатели ФПС как, меняются от способа оптимизации?
Шо ж вы так пассивно? :)

SubZer0 01.10.2005 20:18

в первом примере все работает довольно нормально ФПС у меня 40 даже если ничего в экране нет, а если на гору заберешься, чтоб много деревьев в экране было, то до 20 опускается...

второй пример работает принципиально быстрей, только глючит неимоверно, типа кадры прокрутятся быстро, а потом машина ждет до конца секунды... и так каждую секунду... и ФПС прыгает с 50 до 30 (причем прыгает по 5 раз в секунду).

:)

jimon 01.10.2005 20:18

чет терейн тормозной... :))

МА-ЛА-ДЕЦ ;)

вообщем а чембы ненаписать функцию гемора... ой... generate :) типа ланджафта ?
ну чтобы типа... типа генерить типа ланджафт из типа типа... короче картинки типа под типа названием в типа карта типа высот... :lol:

ps. злостный пост но БЕЗ ОФФТОПА Я НАПИСАЛ! :rolleyes:

alcosholik 01.10.2005 20:45

Во втором исходнике при медленном поворачивании камеры деревья, которые находятся рядом, "мелькают": как будто верхушка одного дерева вдруг оказывается скрыта другим деревом, хотя последнее находится дальше.
Но я не исключаю, что это все из-за моих тупых дров для видяхи.

Diplomat 01.10.2005 21:24

Цитата:

второй пример работает принципиально быстрей, только глючит неимоверно
Хм, так быть не должно. Не должно...
Знаешь, попробуй может вот какие варианты:
1. уменьшить количество деревьев в два раза (в обоих примерах для чистоты эксперимента): Если компьютер не очень крутой, то при ФПС<10-20 твиннинг и таймер обновления камеры будут глючить;
2. убрать вообще задержку "Delay 20" в модуле обновления камеры (тоже в обоих примерах);
3. снести к чертям рендер-твининг во втором примере (убрать CaptureWorld() и поставить просто "RenderWorld()" вместо RenderWorld(Twining/100))
Если всё это не поможет- значит или код косой, или железо... :SOS:

Цитата:

вообщем а чембы ненаписать функцию гемора...
:)) Что, прям чтоб и хейтмапы сам генерил? А генератор колормапов уже есть.

Цитата:

как будто верхушка одного дерева вдруг оказывается скрыта другим деревом, хотя последнее находится дальше.
Не, это не у тебя. Это классический ДиректХ-овский тоннельный эффект. Если использовать на деревьях маск-текстуры вместо текстур с альфаканалом- он исчезнет. Просто модельек деревьев других не было. :)

axel186 02.10.2005 00:17

ОГО!!! :blink: ПРИКОЛЬНО!!! ОСОБЕНО ТУМАН МЕЖДУ ДЕРЕВЬЯМИ ПОНРАВИЛСЯ!!
Жалько только что у меня комп тупой, подвисает всё

jimon 02.10.2005 15:09

а у меня скорость держится такая как указал дипломат

хотя процесор в несколько раз тормознее :lol:
глюков ненайдено - видяха XFX 6600GT , дрова 77.72

Жека 03.10.2005 20:26

Интересный примерчик.

Дома у меня оба примера работали одинаково медленно - около 20 кадров.
Это на Celeron 433, 224 Mb ОЗУ, GF2MX200 64 Mb

На более крутом компе -AMD Sempron 2600+, 512 Mb ОЗУ, RADEON9550 128 Mb- 2 пример быстрее:
в 1ом примере: 40 кадров ВСЕГДА - странно... так не должно быть по-мойму...
во 2ом: 80-110 кадров, если камера смотрит только на поле, и больше 1000, если в пустоту.

Во втором примере при движении или повороте текстура земли размазывается (рябь какая-то), после остановки нормальной становится. Деревья тоже "мелькают"...

ПС: я не понял, зачем нужен флаг 256 для текстуры детализации.
Пробовал убрать флаг вообще - рябь исчезает, но и вид немного другой...

Diplomat 03.10.2005 23:15

Ну, на слабых компах 20ФПС выводится по той простой, что счетчик ФПС возвращает данные 10 раз в секунду, округляя точность 10 да еще и завышает на 10ФПС... Зачем? Раньше юзал для техданных- потом забыл исправить. :)
Корректно получать данные о ФПС можно заменив его код на следующий:
Код:

;FPS counter
FPS=FPS+1
If mFPS<MilliSecs() Then
        mFPS=MilliSecs()+1000
        MaxFPS=FPS
        FPS=0
EndIf

А неизвестный флаг "256" значит, что у тебя неновая версия то ли Блица, то ли хелпов. И артефакты изображения могут быть связаны миенно с этим. ;)
Эта фича по определению- "складирует текстуру в видеопамять". А по сути- она выключает мипмаппинг (размытие) текстур, что очень важно при изображении детайлмаппов на террайнах итп... Ну, 20% ФПС жреть... :)

pax 06.10.2005 10:44

На моей машине (Celeron D 2400 / GF MX400 64MB / 512MB Dual) FPS примерно 20(на горе)-40(просто на карте) во втором примере.

Если установить режим цвета в 16 бит то FPS вырастает до 35-55 соответственно.

Без твининга FPS вырастает на 5-10 к/с, но зато дергается камера (надо написать функцию обработки камеры)

А в общем примерчик неплохой :)

pax 06.10.2005 10:52

Кстати при флаге 256 (Store texture in vram) выключается мипмеппинг текстур, а следовательно и их сглаживание. В этом режиме (256) у меня пример 2 работает чуть медленнее.

pax 06.10.2005 20:47

Вложений: 2
Цитата:

вообщем а чембы ненаписать функцию гемора... ой... generate типа ланджафта ?
ну чтобы типа... типа генерить типа ланджафт из типа типа... короче картинки типа под типа названием в типа карта типа высот...

Вот повозился немного сегодня и сделал процедурку генерации террейна:
Код:

Function GenerateTerrain%(SizeX#,SizeZ#,MaxHeight#,HeightMapFile$,Detail,VertexColorsMap$="")
;#Region Собственно генератор террейна
        Local StepX#=SizeX#/Float#(Detail)
        Local StepZ#=SizeZ#/Float#(Detail)
        Local Mesh%=CreateMesh()
        Local Surface%=CreateSurface(Mesh)
        Local X#,Z#,H#,K#=3*255
        Local I#,J#

        Local HeightImage%=LoadImage(HeightMapFile$)
        ResizeImage(HeightImage%,Detail+1,Detail+1);Это проще чем изобретать алготитм сглаживания поверхности
       
;Расположение вертексов
        SetBuffer ImageBuffer(HeightImage%)
        For I=0 To Detail
 X=-SizeX#/2+I*StepX#
 For J=0 To Detail
        GetColor(I,J)
        H#=(ColorRed()+ColorGreen()+ColorBlue())/K ;H = 0 .. 1
        Z=SizeZ#/2-J*StepZ#
        AddVertex(Surface,X,MaxHeight#*H,Z,I/Float#(Detail),J/Float#(Detail))
 Next
        Next
        SetBuffer BackBuffer()
        FreeImage(HeightImage%)
       
;Создание поверхности
        For I=0 To Detail-1
 For J=0 To Detail-1
        AddTriangle (Surface%,I+(Detail+1)*J,I+(Detail+1)*(J+1),I+1+(Detail+1)*(J+1))
        AddTriangle (Surface%,I+(Detail+1)*J,I+1+(Detail+1)*(J+1),I+1+(Detail+1)*J)
 Next
        Next
;#End Region

;#Region Раскрашивание вертексов
        If VertexColorsMap$<>"" Then
 Local ColorImage%
 EntityFX Mesh%,2;Использование режима 'use vertex colors instead of brush color'
 ColorImage%=LoadImage(VertexColorsMap$)
 ResizeImage(ColorImage%,Detail+1,Detail+1);Это чтобы упростить нахождение цвета вертекса
 SetBuffer ImageBuffer(ColorImage%)
 For I=0 To Detail
        For J=0 To Detail
  GetColor(I,J)
  VertexColor(Surface%,J+(Detail+1)*I,ColorRed(),ColorGreen(),ColorBlue())
        Next
 Next
 SetBuffer BackBuffer()
 FreeImage(ColorImage%)
        EndIf
        UpdateNormals(Mesh%)
        Return Mesh%
;#End Region       
End Function

Вот и все. :)

А это измененный код примера...

pax 06.10.2005 22:55

Цитата:

вообщем а чембы ненаписать функцию гемора... ой... generate типа ланджафт


Не забываем писать закрывающие теги ;)

pax 06.10.2005 23:13

Просто соединение с инетом через мабильник и часто глючит, по этому сообщение не полностью дошло!:'((


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot