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

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


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

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