Select Language
Суббота, 04.05.2024, 02:15
Какой движок вы используете.
Всего ответов: 396


Принцип построения графика.
01.04.2008, 09:11
Здравствуй Кодер, в этой тренировочной статье ты узнаешь об одном из принципов построения временных графиков.

Зачем это нужно, и где применить? Есть проекты, разного «калибра», и порой отладка и замеры, во время разработки сложных алгоритмов и технологий. Замерить можно что угодно: используемую память; загрузку процессора; временные затраты на определённый участок программы; и т.п. помогают для принятия решения: приемлемы ли временные затраты на расчёты или слишком затратные, а может рендер перегружен? wink И т.п.
Также каждый может найти и другое применение, зависящее от ситуации и потребностей в проекте.

И так, что из себя представляет временной график:

Рассмотрим на примере процентной загруженности процессора по времени:


Жёлтым цветом – процентная шкала.
Синим цветом – временная шкала.
Зелёным цветом – ломаная графика.

В данном случае, график постоянно смещается в позиции – влево.
В этом заложен основной принцип реализации графика.
Учитывая в данном примере всего 23 временных участка, обновление данных графика не ведётся каждый цикл, поэтому будет использоваться таймер, по прохождению которого, будет вноситься новое данное, последнего значения. Но т.к. в период от последнего обновления и текущего, проходит больше одного цикла, то нужно вычислить общее арифметическое данное за этот период.



И так, рассмотрим вариант с использованием массива.

Здесь мы немножко увеличим частоту обновления, но и уплотним график.
gLine#[44]
Индекс массива – временной параметр.
Значение переменной – процентный параметр.

Также нам необходимо знать индекс параметра, который мы будем изменять следующим, введём переменную:
gLastL%

И ещё один параметр, который ведёт количество циклов изменений текущего данного:
gTiks%

В примере приведена реализация слежки активности перемещения курсора мыши, по окну приложения:

Graphics 412,220,32,2
SetBuffer BackBuffer()
ClsColor 50,50,50
 
SetFont LoadFont("Tahoma",12,1)
 
Dim gLine#(44)
Local gLastL%
Local gTiks%
Local gLast#
 
 
 
Repeat
        CurMS=MilliSecs()
       
        IKhEsc=KeyHit(1)
        mXSp=MouseXSpeed()
        mYSp=MouseYSpeed()
       
       
        gLine(gLastL) = gLine(gLastL) + Abs(mXSp) + Abs(mYSp)
        gTiks=gTiks+1
       
        If CurMS-tLastRefMouseActivity>20
                tLastRefMouseActivity=CurMS
               
                gLine(gLastL)= gLine(gLastL) / Float(gTiks)
                gLine(gLastL)= gLine(gLastL)*.3 + gLast*.7
                gLast=gLine(gLastL)
               
                If gLine(gLastL)>100 gLine(gLastL)=100
               
                gLastL = (gLastL + 1) Mod 45
                gLine(gLastL) = 0
                gTiks=0
        EndIf
       
       
        Cls
                Origin 160,60
               
                Color 192,64,0
                Line 0,0,0,102
                Line 0,104,92,104
               
                Color 70,60,50
                Text -24,0,"100",0,1
                Text -10,104,"0",0,1
               
                Color 255,128,0
                For n=1 To 43
                        Line n*2, 100-gLine((n+gLastL) Mod 45), (n+1)*2, 100-gLine((n+gLastL+1) Mod 45)
                Next
        Flip
       
       
        If IKhEsc End
Forever

Пример выполнен на Blitz3D, но по этой ссылке, версия на BlitzMax.
Также по этой ссылке, откомпиленая версия. (47Kb)

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

И так, за счёт дополнительной переменной (gLastL%), принцип смещения графика был зацикленным. Есть ещё один из способов: смещение массива, в этом способе, все кроме первого, данного в массиве, перемещались на один индекс ранее, а последний, заполнялся новым данным. Такой метод менее шустр, и скорость смещения будет зависеть от количества переменных в массиве. Поэтому пришли к более быстрому способу: заполнять данными следующую переменную от последней изменённой, а рендер производить не от первого в массиве, а от следующего от текущего изменяемого (это будет самым «старым» данным).
Также в этом примере немножко сглажено изменение нового данного, исходя из прошлого.

Общая картинка несёт информацию активности использования мышки, например в РТС, это будет = активности игрока, а в FPS – холеричности игрока. Но подобная информация, в общем, является бесполезной.
Если вы не собираете онлайн информацию, об игроке для анализа. Чтобы вычислить, скучал ли игрок в определённом участке игры; что его тревожит; или, когда он начинает играть активнее, и т.п.
Разработчики из Valve, начиная с Half-Life 2: Episode I, собирали подобную информацию, для анализа поведения игрока. Исходя из совокупной подобной информации, можно вычислить, было игроку слишком сложно, или он был озадачен, в некоторых ситуациях игры. После анализа информации, разработчики могли взять что-то на заметку, и в схожих ситуациях, поступить по другому, добавить Action’а в игру, или заставить игрока «поактивничать», а может и упростить. wink



Чтож, вот и весь принцип построения временных графиков, статья вышла весьма короткой, и заключается в разборе Кодером, выше приведённого кода.
Почему статья тренировочная? – основной принцип начинающего кодера – найти статейку и сделать игру. Считая что, прочитав комментарии к строкам кода, он поймёт принцип и построение алгоритмов, в то время, заблуждаясь, что Он обучается. Тут же абсолютно бессмысленный кусочек кода, который не внедришь в игру – за не надобностью. Даёт возможность понять принципы построения временных графиков. Вынуждая кодера, самостоятельно разобрать код, и понять его принципы, для построения графиков с ведением уже необходимой для него информации в приложении.

Последующие мои статейки, будут в подобной тренировочной форме.



Спасибо за уделённое время.
Шустрых алгоритмов, и активного Творчества.
Комментарии: 2 | Рейтинг: 5.0/1 | Автор: Максим Михеев

Всего комментариев: 2
27.05.2008, 07:06
2. HolyDel [Материал]
MoKa, я жутко извнияюсь, но сетку лучше сохранить в имагу (текстуру) и рисовать ее (квад). а то твой график щас половину фпс зажрет )))
Ответ: Ну на БМ он не сожрёт половину, вообще мизерно скушает, но всё-же ты от части и прав, но в случае с БМ, тут дело такое что это не 2д пиксели, там линии и так рисуются квадами, и как-бы это и так работает хорошо (на Б3Д, да это будет подтормаживать).

20.04.2008, 14:27
1. Stealth (Stealth) [Материал]
В принципе графики - нужная вещь, когда тестишь свою игру. Я часто создавал графики в углу экрана, для замера скоростей, кадров, времени кадра, ускорения... высоты...
Но для полной картины лучше не использовать сглаживание графика, тогда видно все как есть. Сглаживание редко необходимо если тестишь игру, резкие скачки могут быть не так заметны.
Ответ: Полностью согласен. Это лишь в редких случаях применимо.

Xors3D
Оффициальный сайт Xors3D
Русскоязычный форум
И многое другое!

Locations of visitors to this page


Онлайн: 1
Гостей: 1
Пользователей: 0
© MoKa 2024
Karnao.ru Rubux Software - PhysX Wrapper & Xors3D Blitz3D.at.ua Blitz Et Cetera Boolean Community