forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Помогите оптимизировать ф-ю (http://forum.boolean.name/showthread.php?t=13070)

Mark Castle 03.08.2010 23:46

Помогите оптимизировать ф-ю
 
Граждане!у меня есть одна функция, которая сильно грузит игру, помогите пожалуйста её оптимизировать!Если можно, выложите свю версию, заранее спасибо!
Код:

Function update_friz()
For i = 1 To num
If abc(i)\times=0
        If (abc(i)\count%=1) Then
        Animate abc(i)\friz,1,0.2,1
        abc(i)\count%=0
        EndIf
                If (abc(i)\count=2) Then
                Animate abc(i)\friz,3,0.4,5
                pointer(abc(i)\friz,user)
                abc(i)\count=0
                EndIf
        If (abc(i)\count=3) And (health>health_die) Then
        pointer(abc(i)\friz,user)
        If AnimTime(abc(i)\friz)>13 Then
        If health>health_die Animate abc(i)\friz,1,0.4,6
        EndIf
If abc(i)\times2%=5 Then create_shot_f(EntityX(abc(i)\frizbox),EntityY(abc(i)\frizbox)+1,EntityZ(abc(i)\frizbox)):EmitSound sound10,abc(i)\friz:abc(i)\count_bull%=abc(i)\count_bull%-1:abc(i)\times2%=20
abc(i)\times2%=abc(i)\times2%-1
If abc(i)\count_bull=0 Then
If AnimTime(abc(i)\friz)>7 Then
EmitSound sound8,abc(i)\friz
        Animate abc(i)\friz,1,0.4,10
                abc(i)\count_bull%=8
        EndIf
EndIf
        EndIf
        EndIf
                If abc(i)\count=4 Then
                SeedRnd(MilliSecs())
                x1=Rnd(1,4)
                If x1=1 Then EmitSound sound2,abc(i)\friz
                If x1=2 Then EmitSound sound3,abc(i)\friz
                If x1=3 Then EmitSound sound4,abc(i)\friz
                If x1=4 Then EmitSound sound5,abc(i)\friz
                                EntityType abc(i)\frizbox,friz_d_type
                SeedRnd(MilliSecs())
                Animate abc(i)\friz,3,0.4,Rnd(11,13)
                abc(i)\count%=100
                abc(i)\times=abc(i)\times+1
                EndIf
               
                If (abc(i)\count=5) And (abc(i)\times%=0) Then
                U#=360
                pointer(abc(i)\friz,user)
                abc(i)\times1%=abc(i)\times1%+1
                If (180 - Abs(-DeltaYaw(abc(i)\frizbox,user))) < U# And EntityDistance(abc(i)\friz,user)<50 And EntityVisible(abc(i)\frizbox,user) And (abc(i)\times=0) Then
                If AnimTime(abc(i)\friz)>30 Then
                SeedRnd(MilliSecs())
                x=Rnd(1,2)
                If x=1 Then EmitSound sound7,abc(i)\friz Else EmitSound sound6,abc(i)\friz
                Animate abc(i)\friz,3,0.5,5
                EndIf               
                EndIf
                EndIf
               
If (180 - Abs(-DeltaYaw(abc(i)\frizbox,user))) < U# And EntityDistance(abc(i)\friz,user)<20 And EntityVisible(abc(i)\frizbox,user) And (abc(i)\times=0) Then
abc(i)\count=5
If abc(i)\times1%>170 Then abc(i)\count=3       
EndIf

Next
End Function


Reizel 04.08.2010 23:22

Ответ: Помогите оптимизировать ф-ю
 
ммм...дайте подумать!!!
Вот:
Function update_friz()
;//do nothing...
End Function

IGR 05.08.2010 22:01

Ответ: Помогите оптимизировать ф-ю
 
ага оптимайз !!

Цитата:

Function update_friz()
num = 1
For i = 1 To num
...
сорри за издевательство !! но врядли кто то станет копатся в этом !!

pax 06.08.2010 00:15

Ответ: Помогите оптимизировать ф-ю
 
Сначала научитесь правильно оформлять код чтобы он был читаем, потом можно и подумать ;)

tormoz 06.08.2010 02:19

Ответ: Помогите оптимизировать ф-ю
 
В коде нет затратных команд
раскрой вложенные функции

Mark Castle 09.08.2010 21:22

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

Сообщение от Павел (Сообщение 157318)
ммм...дайте подумать!!!
Вот:
Function update_friz()
;//do nothing...
End Function

function donothing not found. Че делать?

LLI.T.A.L.K.E.R. 09.08.2010 21:52

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

Сообщение от Mark Castle (Сообщение 157812)
function donothing not found. Че делать?

Извини, но это была насмешка.
do nothing с англ. переводится - ничего не делать...
Такой функции конечно нет, если её не дописать. Но всё же "ничего не делать" было предложено для прикола - вместо сложных вычислений, для ускорения - просто ничего не делать. :dontknow:
Это не было решение твоей проблемы.


Блин не знаю что такое abc(i)...
Но можно хотя бы создать переменную abcI=abc(i) - чтобы не повторять вычисление abc(i)
Коротко, например:
Код:

Function update_friz()
For i = 1 To num
abcI=abc(i)
If abcI\times=0
        If abcI\count%=1) Then
        Animate abcI\friz,1,0.2,1
        abcI\count%=0
        EndIf

В справочнике посмотрел - там Abs(number)
Use this command to return the absolute value of a number; meaning its positive value. A negative 3 would become a positive 3. If what you want is a number without a fraction (say, convert 3.1415 into 3) use the Int() command.

Miha 10.08.2010 10:02

Ответ: Помогите оптимизировать ф-ю
 
Функция Abs(int) возвращает абсолютное значение числа.
Т.е. Abs(-5) = 5
ЭЭЭ....:stop:
Чувак открой справочник команд и посмотри что делают непонятные тебе конструкции.
З.Ы. Начинай с For..Next

Mark Castle 10.08.2010 12:19

Ответ: Помогите оптимизировать ф-ю
 
Вы че?причем здесь abs???

LLI.T.A.L.K.E.R. 10.08.2010 15:44

Ответ: Помогите оптимизировать ф-ю
 
Abs, abc...
Ну главное что при "когда можно хотя бы создать переменную abcI=abc(i) - чтобы не повторять вычисление abc(i)" - не нужно каждый раз (в каждой строчке) "возвращать абсолютное значение числа."

С чем я ещё не знаком или подзабыл - кончено же смотрю index.htm


К abc(i)\friz это тоже относится..
Просто ввёл переменную abcFriz=abc(i)\friz и всё!
Т.е. не вычислять каждый раз одно и тоже!

Часть доработки:
Код:

Function update_friz()

For i = 1 To num

abcI=abc(i)
abcFriz=abcI\friz


If abcI\times=0
        If (abcI\count%=1) Then
        Animate abcFriz,1,0.2,1
        abcI\count%=0
        EndIf
                If (abcI\count=2) Then
                Animate abcFriz,3,0.4,5
                pointer(abcFriz,user)
                abcI\count=0
                EndIf
        If (abcI\count=3) And (health>health_die) Then
        pointer(abcFriz,user)
        If AnimTime(abcFriz)>13 Then
        If health>health_die Animate abcFriz,1,0.4,6
        EndIf
        If abcI\times2%=5 Then create_shot_f(EntityX(abcI\frizbox),EntityY(abcI\frizbox)+1,EntityZ(abcI\frizbox)):EmitSound sound10,abcFriz:abcI\count_bull%=abcI\count_bull%-1:abcI\times2%=20
        abcI\times2%=abcI\times2%-1
        If abcI\count_bull=0 Then
        If AnimTime(abcFriz)>7 Then
        EmitSound sound8,abcFriz
        Animate abcFriz,1,0.4,10
                abcI\count_bull%=8
        EndIf
EndIf


.Squid 10.08.2010 16:49

Ответ: Помогите оптимизировать ф-ю
 
LLI.T.A.L.K.E.R., выучи массивы и типы перед тем как советы давать. Ппц.

Spiderman 10.08.2010 17:19

Ответ: Помогите оптимизировать ф-ю
 
Если бы автор выложил весь код с медией было бы проще понять в каком месте можно спасти пару FPS

Уверен, что часть проверок можно было бы вынести из кучи и выполнять нерегулярно

Mark Castle 16.08.2010 18:14

Ответ: Помогите оптимизировать ф-ю
 
там оказалась другая фигня: при создании более 20 фрицов комп резко виснет.функция создания прилагается:
Код:

Function create_friz(x#,y#,z#,turn#)
        num%=num%+1
        abc(num)=New frizen
        abc(num)\friz=LoadAnimMesh("media\officer.b3d")
        abc(num)\frizbox=CreateSphere(2)
        ;EntityAlpha abc(num)\frizbox,0.00001
        PositionEntity abc(num)\frizbox,x#,y#+1.1,z#
        ScaleEntity abc(num)\friz,0.025,0.025,0.025
        ScaleEntity abc(num)\frizbox,0.35,0.8,0.3
        PositionEntity abc(num)\friz,x#,y#,z#
        TurnEntity  abc(num)\friz,0,turn#,0
        TurnEntity  abc(num)\frizbox,0,turn#,0
                                        ExtractAnimSeq(abc(num)\friz,1,32 ) ; 1- idle
                                        ExtractAnimSeq(abc(num)\friz,33,83 ) ; 2- look_around
                                        ExtractAnimSeq(abc(num)\friz,84,117 ) ; 3- walk
                                        ExtractAnimSeq(abc(num)\friz,118,134 ) ; 4- run
                                        ExtractAnimSeq(abc(num)\friz,135,150 ) ; 5- arm
                                        ExtractAnimSeq(abc(num)\friz,150,159 ) ; 6- shoot_forward
                                        ExtractAnimSeq(abc(num)\friz,161,181 ) ; 7- disarm
                                        ExtractAnimSeq(abc(num)\friz,182,197 ) ; 8- shoot_down
                                        ExtractAnimSeq(abc(num)\friz,198,213 ) ; 9- shoot_up
                                        ExtractAnimSeq(abc(num)\friz,214,239 ) ; 10- reload
                                        ExtractAnimSeq(abc(num)\friz,240,270 ) ; 11- die1
                                        ExtractAnimSeq(abc(num)\friz,271,311 ) ; 12- die2
                                        ExtractAnimSeq(abc(num)\friz,312,325 ) ; 13- die3
                                        EntityType abc(num)\frizbox,friz_type
                                        EntityParent abc(num)\friz,abc(num)\frizbox
                                        abc(num)\count_bull%=8
                                        abc(num)\times1%=1
                                        abc(num)\times2%=5
                                        abc(num)\count=1
End Function


Nuprahtor 16.08.2010 18:35

Ответ: Помогите оптимизировать ф-ю
 
Код:

ExtractAnimSeq(abc(num)\friz,1,32 ) ; 1- idle
                                        ExtractAnimSeq(abc(num)\friz,33,83 ) ; 2- look_around
                                        ExtractAnimSeq(abc(num)\friz,84,117 ) ; 3- walk
                                        ExtractAnimSeq(abc(num)\friz,118,134 ) ; 4- run
                                        ExtractAnimSeq(abc(num)\friz,135,150 ) ; 5- arm
                                        ExtractAnimSeq(abc(num)\friz,150,159 ) ; 6- shoot_forward
                                        ExtractAnimSeq(abc(num)\friz,161,181 ) ; 7- disarm
                                        ExtractAnimSeq(abc(num)\friz,182,197 ) ; 8- shoot_down
                                        ExtractAnimSeq(abc(num)\friz,198,213 ) ; 9- shoot_up
                                        ExtractAnimSeq(abc(num)\friz,214,239 ) ; 10- reload
                                        ExtractAnimSeq(abc(num)\friz,240,270 ) ; 11- die1
                                        ExtractAnimSeq(abc(num)\friz,271,311 ) ; 12- die2
                                        ExtractAnimSeq(abc(num)\friz,312,325 ) ; 13- die3
                                        EntityType abc(num)\frizbox,friz_type

Вот это нужно выполнять один раз за игру. А так при каждом создании врага снова загружается анимация

Mark Castle 16.08.2010 18:42

Ответ: Помогите оптимизировать ф-ю
 
и где ж мне его так надо написать?

Nuprahtor 16.08.2010 18:44

Ответ: Помогите оптимизировать ф-ю
 
Перепутал с LoadAnimSeq
С ExtractAmimSeq не работал, так что хз...

Mark Castle 16.08.2010 18:46

Ответ: Помогите оптимизировать ф-ю
 
это по идее тоже самое, только где мне его написать???

Nuprahtor 16.08.2010 18:49

Ответ: Помогите оптимизировать ф-ю
 
LoadAnimSeq загружает анимацию модели из файла
ExtractAnimSeq берет анимацию из уже загруженной модели.
Давным давно я при загрузке игры загружал ресурсы в глобалы ( :) )
И была функция, которая грузила модель, а также анимации к этой модели.
Функция выполнялась один раз при старте игры.

Mark Castle 16.08.2010 18:59

Ответ: Помогите оптимизировать ф-ю
 
как бы ты написал этот кусок?

Nuprahtor 16.08.2010 19:05

Ответ: Помогите оптимизировать ф-ю
 
Код:

Function LoadModels()
model = LoadModel = bla bla bla;
an1 = ExtractAnimSeq (model, 1,20)
an2 = ExtractAnimSeq (model, 21,40)
End Function

Вот такой вот псевдокод
И эту функцию вызываем один раз в игре.

Mark Castle 16.08.2010 19:31

Ответ: Помогите оптимизировать ф-ю
 
не работает!не вижу модели!это код загрузки фрица:
Код:

Function create_friz(x#,y#,z#,turn#)
        num%=num%+1
        abc(num)=New frizen
;        abc(num)\friz=LoadAnimMesh("media\officer.b3d")
        abc(num)\friz=frize
        abc(num)\frizbox=CreateSphere()
          EntityAlpha abc(num)\frizbox,0.00001
        PositionEntity abc(num)\frizbox,x#,y#+1.1,z#
        ScaleEntity abc(num)\friz,0.025,0.025,0.025
        ScaleEntity abc(num)\frizbox,0.35,0.8,0.3
        PositionEntity abc(num)\friz,x#,y#,z#
        TurnEntity  abc(num)\friz,0,turn#,0
        TurnEntity  abc(num)\frizbox,0,turn#,0
                                        EntityType abc(num)\frizbox,friz_type
                                        EntityParent abc(num)\friz,abc(num)\frizbox
                                        abc(num)\count_bull%=8
                                        abc(num)\times1%=1
                                        abc(num)\times2%=5
                                        abc(num)\count=1
End Function

а это код который в начале игры:
Код:

Function load_model()
frize=LoadAnimMesh("media\officer.b3d")
                                        ExtractAnimSeq(frize,1,32 ) ; 1- idle
                                        ExtractAnimSeq(frize,33,83 ) ; 2- look_around
                                        ExtractAnimSeq(frize,84,117 ) ; 3- walk
                                        ExtractAnimSeq(frize,118,134 ) ; 4- run
                                        ExtractAnimSeq(frize,135,150 ) ; 5- arm
                                        ExtractAnimSeq(frize,150,159 ) ; 6- shoot_forward
                                        ExtractAnimSeq(frize,161,181 ) ; 7- disarm
                                        ExtractAnimSeq(frize,182,197 ) ; 8- shoot_down
                                        ExtractAnimSeq(frize,198,213 ) ; 9- shoot_up
                                        ExtractAnimSeq(frize,214,239 ) ; 10- reload
                                        ExtractAnimSeq(frize,240,270 ) ; 11- die1
                                        ExtractAnimSeq(frize,271,311 ) ; 12- die2
                                        ExtractAnimSeq(frize,312,325 ) ; 13- die3
End Function

че делать?

Nuprahtor 16.08.2010 19:36

Ответ: Помогите оптимизировать ф-ю
 
Тут нужны опытные блитцеры, я с блица перешел на unity, где все уже за меня сделано, и забыл синтаксис блитца ^_^
По идее
Код:

frize=LoadAnimMesh("media\officer.b3d")
frize должна быть глобальной.
Код:

abc(num)\friz = frize

Mark Castle 16.08.2010 19:39

Ответ: Помогите оптимизировать ф-ю
 
так так вроде и есть!

tormoz 16.08.2010 22:49

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

abc(num)\friz=LoadAnimMesh("media\officer.b3d")
abc(num)\friz=frize
:super: :wild:

Mark Castle 16.08.2010 22:59

Ответ: Помогите оптимизировать ф-ю
 
а что это меняет?

GoddoG 16.08.2010 23:40

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

не работает!не вижу модели!это код загрузки фрица:
EntityAlpha abc(num)\frizbox,0.00001 ?:cool:

ABTOMAT 17.08.2010 00:07

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

Сообщение от Mark Castle (Сообщение 158671)
а что это меняет?

Цитата:

abc(num)\friz=LoadAnimMesh("media\officer.b3d")
abc(num)\friz=frize
LoadAnimMesh грузит модельку с винчестера с текстурами и т.д. Что уже само по себе дело небыстрое. Поэтому правильно, славно загружать модельку один раз в начале проги, а потом, когда надо создать монстра (ну, или для чего там эта моделька) при помощи CopyEntity копируют заранее загруженную модельку. Копируется вся анимация и т.д., кроме того - это в сотни раз быстрее, чем её заново грузить.

Вот этот пост сделал меня задуматься:
http://forum.boolean.name/showpost.p...12&postcount=6
Вы нас так тонко троллите или действительно не понимаете сарказма(всё должно стать ясно даже если просто перевести название предложенной функции на русский язык)?

tormoz 17.08.2010 00:36

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

Сообщение от ABTOMAT (Сообщение 158679)
LoadAnimMesh грузит модельку с винчестера с текстурами и т.д. Что уже само по себе дело небыстрое. Поэтому правильно, славно загружать модельку один раз в начале проги, а потом, когда надо создать монстра (ну, или для чего там эта моделька) при помощи CopyEntity копируют заранее загруженную модельку. Копируется вся анимация и т.д., кроме того - это в сотни раз быстрее, чем её заново грузить.

еще раз посмотри
он грузит модель в переменную, а потом приравнивает ее к другой
скорее всего в ней в этот момент ничего нет

и ваще, нахрена вам дебаггер ?

Mark Castle 17.08.2010 00:39

Ответ: Помогите оптимизировать ф-ю
 
тонко троллим)

Mark Castle 17.08.2010 01:00

Ответ: Помогите оптимизировать ф-ю
 
а ведь кстати, все равно глючит!

tormoz 17.08.2010 01:26

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

Сообщение от Mark Castle (Сообщение 158688)
а ведь кстати, все равно глючит!

Код:

Function create_friz(x#,y#,z#,turn#)
        num%=num%+1
        abc(num)=New frizen
;        abc(num)\friz=LoadAnimMesh("media\officer.b3d")
        ExtractAnimSeq(abc(num)\friz,1,32 ) ; 1- idle
                                        ExtractAnimSeq(abc(num)\friz,33,83 ) ; 2- look_around
                                        ExtractAnimSeq(abc(num)\friz,84,117 ) ; 3- walk
                                        ExtractAnimSeq(abc(num)\friz,118,134 ) ; 4- run
                                        ExtractAnimSeq(abc(num)\friz,135,150 ) ; 5- arm
                                        ExtractAnimSeq(abc(num)\friz,150,159 ) ; 6- shoot_forward
                                        ExtractAnimSeq(abc(num)\friz,161,181 ) ; 7- disarm
                                        ExtractAnimSeq(abc(num)\friz,182,197 ) ; 8- shoot_down
                                        ExtractAnimSeq(abc(num)\friz,198,213 ) ; 9- shoot_up
                                        ExtractAnimSeq(abc(num)\friz,214,239 ) ; 10- reload
                                        ExtractAnimSeq(abc(num)\friz,240,270 ) ; 11- die1
                                        ExtractAnimSeq(abc(num)\friz,271,311 ) ; 12- die2
                                        ExtractAnimSeq(abc(num)\friz,312,325 ) ; 13- die3

        abc(num)\frizbox=CreateSphere()
          EntityAlpha abc(num)\frizbox,0.00001
        PositionEntity abc(num)\frizbox,x#,y#+1.1,z#
        ScaleEntity abc(num)\friz,0.025,0.025,0.025
        ScaleEntity abc(num)\frizbox,0.35,0.8,0.3
        PositionEntity abc(num)\friz,x#,y#,z#
        TurnEntity  abc(num)\friz,0,turn#,0
        TurnEntity  abc(num)\frizbox,0,turn#,0
                                        EntityType abc(num)\frizbox,friz_type
                                        EntityParent abc(num)\friz,abc(num)\frizbox
                                        abc(num)\count_bull%=8
                                        abc(num)\times1%=1
                                        abc(num)\times2%=5
                                        abc(num)\count=1
End Function

это выкинь

Function load_model()

ABTOMAT 17.08.2010 03:24

Ответ: Помогите оптимизировать ф-ю
 
Цитата:

Сообщение от tormoz (Сообщение 158684)
еще раз посмотри
он грузит модель в переменную, а потом приравнивает ее к другой
скорее всего в ней в этот момент ничего нет

и ваще, нахрена вам дебаггер ?

там закомменчена загрузка в оригинале, раскомменчено присовение
видимо, автор пытался таким образом дебажить
сначала тоже хотел выкакать кирпичей по этому поводу
Цитата:

; abc(num)\friz=LoadAnimMesh("media\officer.b3d")
abc(num)\friz=frize

Mark Castle 21.08.2010 01:59

Ответ: Помогите оптимизировать ф-ю
 
есть один небольшой нюанс: оно начинает глючить тогда, когда я поворачиваюсь лицом к модели, а если нет, то все нормально. что это может быть?


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

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