Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D

Ответ
 
Опции темы
Старый 22.02.2009, 19:21   #1
CRASHER
Разработчик
 
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений
(для 36 пользователей)
Оптимизация кода, помохите

Значит есть кучка ботов ну допустим 20. Как для каждого найти ближайшее расстояние до врага. Я то спосб знаю только он мне не очень нравится. Все боты забиты в типы и при каждом обновлении каждый из ботов проверяет всех остальных ботов какой к ниму ближе, путём: если дистанс < Предедущий дистанс, тогда цель берём эту, если нет то предыдущую. Не знаю лучший ли это способ. Но он меня не устраивает. Если кто знае лучше подскажите пжаласта
(Offline)
 
Ответить с цитированием
Старый 22.02.2009, 19:28   #2
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Оптимизация кода, помохите

20 это очень мало. 400 получений дистанции на цикл это очень немного.

вот если бы их было хотя-бы сотни 3.
вообще проще всего использовать регулярную сетку. т.е. беш все поле скажем на 100 ячеек. каждый цикл засовываеш в ячейку указатель на бота. и сравниваеш расстояние не со всеми ботами, а только с теми, что в ближайших ячейках.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (22.02.2009)
Старый 22.02.2009, 21:14   #3
jimon
 
Сообщений: n/a
Ответ: Оптимизация кода, помохите

CRASHER
получение дистанции в квадрате это всего два умножения и одна сума
когда арифметических операций перевалит за 50-100 тыс за один цикл - тогда волноватся надо

ps. регулярная сетка для этого дела рулит
 
Ответить с цитированием
Старый 22.02.2009, 22:14   #4
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Ответ: Оптимизация кода, помохите

на такие операции применяй таймер
скажем делай такой прогон по всем ботам раз в 500 мс

и не нужно заморачиваться со всякими сетками, деревьями и тд
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (22.02.2009)
Старый 22.02.2009, 22:23   #5
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Оптимизация кода, помохите

Ты неправ, деревья руляд аццки!
Хотя и каждый кадр делать обчсёт непрактично.
__________________
(Offline)
 
Ответить с цитированием
Старый 22.02.2009, 23:15   #6
CRASHER
Разработчик
 
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений
(для 36 пользователей)
Ответ: Оптимизация кода, помохите

Не застрелите за приметив моего кода.
Вот где то, подправил где то подрихсштаврировал,наложил таймер.
как отцените?

Graphics3D 800,600,32
SetBuffer BackBuffer()

pxCreateWorld(0, "key")
pxSetGravity(0, -10, 0)

;;;Creat

light=CreateLight() 
RotateEntity light,90,0,0 

Global camera=CreateCamera ()
PositionEntity (camera,0,5,-20)

plane=CreatePlane()
ground_tex=LoadTexture("terrain1.jpg")
EntityTexture plane,ground_tex 
EntityType plane,1

Global gPivot1,gPivot2,Yster#

Const FrandT=1,VragT=2,NeteralT=3

Global Cubek=CreateCube()
EntityPickMode(Cubek,3)

Global Newtime,jump,chislo1,inval,Kdown,zoom#=1,MouseMove=1,znam#=5,ShootTime=115,Razbros#=1,chek=0
Global prob,prob2

gPivot1 = CreatePivot()
gPivot2 = CreatePivot()

For i=1 To 50
    ;SeedRnd MilliSecs()
    Slot=100
    CreateBot(Rnd(-Slot,Slot),2,Rnd(-Slot,Slot),1)
    CreateBot(Rnd(-Slot,Slot),2,Rnd(-Slot,Slot),2)
Next

Collisions(2,1,2,3)



;_____________________________________________________________________________________________________
While Not KeyHit(1)

old=MilliSecs()

Collisions(2,1,2,3)

pxRenderPhysic(90,1)

If KeyHit(3) PositionEntity(Cubek,Rnd(-50,50),0,Rnd(-50,50))

mys#=MouseYSpeed()
mxs#=MouseXSpeed()
mzs#=MouseZSpeed()

If MouseHit (2) zoom=1:znam=5

If mzs>0.5 
zoom=zoom+0.3
znam=znam+0.5
EndIf

If mzs<-0.5 
zoom=zoom-0.3
znam=znam-0.5
EndIf

If MouseHit (1) 
    CreatPulet(camera)
    Time=MilliSecs()
EndIf
If MilliSecs()>Time+ShootTime
    If MouseDown (1) 
        Razbros=Razbros+0.2
        If Razbros>3 Razbros=3
        CreatPulet(camera)
    Else
        Razbros=Razbros-0.2
        If Razbros<1 Razbros=1
    EndIf    
    Time=MilliSecs()                
EndIf

If zoom<1 zoom=1

CameraZoom camera,zoom

If KeyDown(32)=True Then MoveEntity camera,0.2,0,0
If KeyDown(30)=True Then MoveEntity camera,-0.2,0,0 
If KeyDown(31)=True Then MoveEntity camera,0,0,-0.2 
If KeyDown(17)=True Then MoveEntity camera,0,0,0.2 

oldtime=MilliSecs()

UpdatePulet()

;chek=chek+1
;If chek=2
    ;chek=0
    UpdateTurnBot()
;EndIf

Gravitate()

Update_user(camera,mxs,mys)

Newtime=MilliSecs()-oldtime

chek=chek+1

UpdateWorld()
RenderWorld

Text 10,10, "poprobo="+poprobo
Text 10,20, "Newtime="+Newtime
Text 10,30, "FPS="+stp2
If chek=20     
    chek=0
    stp2=stp
EndIf

Flip
now=MilliSecs()-old
stp=1000/now
Wend

;-----------------------------------------------------------------------------------------------------
End

Type GravEnt
    Field a#
    Field v#
    Field GravSP
    Field GravEntity
End Type

Type BotType
    Field Mesh
    Field Target
    Field HeandBon
    Field Belong
    Field PivTarget
    Field Dulo
End Type 

Type TPulet
    Field Ent
    Field VZ#,VY#
    Field a#
    Field Time
    Field Pula
    Field spP
    Field SlaveSurf,SlaveMesh
End Type

Function Update_user(camera,mxs#,mys#)

Predel=30
If mys>Predel Then mys=Predel
If mys<-Predel Then mys=-Predel
If mxs>Predel Then mxs=Predel
If mxs<-Predel Then mxs=-Predel
If MouseMove=1
TurnEntity camera,mys/znam,0,0
TurnEntity camera,0,-mxs/znam,0,1
EndIf


u#=80
MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
HidePointer
If Abs(EntityPitch#(camera))>u# RotateEntity camera,(u#)*Sgn(EntityPitch#(camera)),EntityYaw(camera),0

End Function

Function CreatPulet(entity)

    Time=MilliSecs()
    plt.TPulet=New TPulet
    plt\Pula=CreatePivot()
    plt\VZ=6
    plt\SlaveSurf=CreateCube(plt\Pula)
        
    ScaleEntity (plt\SlaveSurf,0.01,0.03,5)
    EntityFX plt\SlaveSurf,1
    EntityColor(plt\SlaveSurf,255,220,0)
    EntityAlpha(plt\SlaveSurf,0.9)
    
    SeedRnd MilliSecs()
        
    PlusY#=Rnd(-Razbros,Razbros)
    PlusX#=Rnd(-Razbros,Razbros)
    
    TFormPoint (1,-1,0,entity,0)
    
    PositionEntity(plt\Pula,TFormedX(),TFormedY(),TFormedZ())
    RotateEntity(plt\Pula,EntityPitch(entity)+PlusX,EntityYaw(entity)+PlusY,EntityRoll(entity),0)

    
End Function
Function UpdatePulet()
    
    For plt.TPulet= Each TPulet        
        
        FreeEntity(plt\spP)
        Local distan#=EntityDistance(plt\Pula,camera)
        If distan>600 test=1
        If distan>50        
            ScaleEntity (plt\SlaveSurf,distan/(1800-distan/3),distan/(1800-distan/3),5)
        EndIf
        MoveEntity plt\Pula,0,0,plt\VZ
        plt\spP=CreatePivot()
        RotateEntity(plt\spP,EntityPitch(plt\Pula),EntityYaw(plt\Pula),EntityRoll(plt\Pula),0)
        PositionEntity(plt\spP,EntityX(plt\Pula,1),EntityY(plt\Pula,1),EntityZ(plt\Pula,1))
        MoveEntity plt\spP,0,0,plt\VZ    
        If test=0
            test=LinePick(EntityX(plt\Pula,1),EntityY(plt\Pula,1),EntityZ(plt\Pula,1),EntityX (plt\Pula,1)-EntityX(plt\spP,1),EntityY(plt\Pula,1)-EntityY(plt\spP,1),EntityZ(plt\Pula,1)-EntityZ(plt\spP,1))
            ;If Not test=0 Stop
            ;For Mn.Mishen=Each Mishen
            ;    If test=Mn\Entity EntityColor(Mn\Entity,255,0,0)
            ;Next                
        EndIf
        plt\a=plt\a+0.0002                
        plt\VY=plt\VY+plt\a/2
        If plt\VY>20 plt\VY=20
        MoveEntity plt\Pula,0,-plt\VY,0
        
        If test>0
            test=0 
            FreeEntity(plt\spP)
            FreeEntity(plt\Pula)
            Delete plt
        EndIf        
    Next
End Function

Function CreateBot(X,Y,Z,Belong)
    
    Bot.BotType=New BotType
    Bot\Mesh=CreateSphere(3)
    Bot\HeandBon=CreateSphere(3)
    Bot\Dulo=CreateSphere(3)
    Bot\PivTarget=CreatePivot()
    Bot\Belong=Belong
    If Bot\Belong=2    EntityColor (Bot\Mesh,255,0,0)
    
    EntityPickMode(Bot\Mesh,1)
    
    ScaleEntity(Bot\HeandBon,0.5,0.5,0.5)
    ScaleEntity(Bot\Dulo,0.1,0.1,0.1)
    
    PositionEntity(Bot\Mesh,X,Y,Z)    
    
    TFormPoint(0,5,0,Bot\Mesh,0)
    PositionEntity(Bot\HeandBon,TFormedX(),TFormedY(),TFormedZ())    
    RotateEntity(Bot\HeandBon,0,90,0)
    
    TFormPoint(0,0,2,Bot\HeandBon,0)
    PositionEntity(Bot\Dulo,TFormedX(),TFormedY(),TFormedZ())        
    
    EntityParent(Bot\HeandBon,Bot\Mesh)
    EntityParent(Bot\Dulo,Bot\HeandBon)
    
    NewGravEnt(Bot\Mesh,1)
    
End Function

Function UpdateBot()

    ;For Bot.BotType=Each BotType
        
        
        UpdateTurnBot();Target)
        
        
    ;Next

End Function


Function UpdateTurnBot();Target=0)

    For Bot.BotType=Each BotType        
        
        ;Bot\Target=Target
        
        Bot\Target=LineOfSight3D(Bot\Mesh,500,300,Bot\Belong,Bot\Target);,Cubek)
        
        If Bot\Target=0            
            PositionEntity(Bot\PivTarget,EntityX(Bot\Dulo,1),EntityY(Bot\Dulo,1),EntityZ(Bot\Dulo,1))
        Else                                
            PositionEntity(Bot\PivTarget,EntityX(Bot\Target,1),EntityY(Bot\Target,1),EntityZ(Bot\Target,1))
        EndIf
        track_YR_Smooth(Bot\Mesh,Bot\PivTarget,5)
        track_ZR_Smooth(Bot\HeandBon,Bot\PivTarget,5)        
        
    Next

End Function

Function NewGravEnt(entity,radius)

    grv.GravEnt= New GravEnt
    grv\GravEntity=entity
    
    EntityParent(grv\GravEntity,grv\GravSP)
    EntityType grv\GravEntity,2
    EntityRadius(grv\GravEntity,radius)
    
End Function

Function Gravitate()
    For grv.GravEnt= Each GravEnt
    If jump=1 grv\v=-1
    If Not EntityCollided (grv\GravEntity,1)        
        grv\a=grv\a+0.003                
        grv\v=grv\v+grv\a/2
        If grv\v>2 grv\v=2
        MoveEntity grv\GravEntity,0,-grv\v,0
    Else
        grv\a=0
        grv\v=0
    EndIf
    Next
End Function

Function  track_YR_Smooth(e1,e2,smothness#=1.0)
    PositionEntity gPivot1,EntityX(e1),EntityY(e1),EntityZ(e1)
    PointEntity gPivot1,e2    
    RotateEntity e1, 0,curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0    
End Function

Function  track_ZR_Smooth(e1,e2,smothness#=1.0)
    PositionEntity gPivot1,EntityX(e1,1),EntityY(e1,1),EntityZ(e1,1)
    PointEntity gPivot1,e2    
    RotateEntity e1,curveAngle#(EntityPitch(gPivot1),EntityPitch(e1),smothness#),0,0
End Function

Function curveangle#( newangle#,oldangle#,increments#)
    If increments>1        
        If (oldangle+360)-newangle<newangle-oldangle 
            oldangle=360+oldangle
        End If
        If (newangle+360)-oldangle<oldangle-newangle 
            newangle=360+newangle
        End If
        oldangle=oldangle-(oldangle-newangle)/increments
    End If
    If increments<=1 
        Return newangle
    End If
    Return oldangle

End Function

Function LineOfSight3D(observer,viewrange#=10.0,viewangle# = 90.0,MyBelong,target=0)

    ;distance between observer and target
    
    ;check if the target is within viewrange 
    ;If dist<=viewrange
    ;Local target
    
    If chek=5 ;target=0
        Local dist#=viewangle
        
        For Bot.BotType=Each BotType
            If MyBelong<>Bot\Belong
                If target<>Bot\Mesh    
                    Mtarget=Bot\Mesh;Cubek;EntityPick(observer,viewrange)                    
                    Local dist2#= EntityDistance(observer,Mtarget)                                    
                    If dist2<dist 
                    dist=dist2
                        
                        target=Bot\Mesh
                    EndIf
                    
                EndIf
            EndIf
        Next    
    EndIf
    ;target=Cubek
    If target<>0
    
    ;If Belong<>
    dist# = EntityDistance(observer,target)
                
            If dist<=viewrange
            ;observer vector
            TFormVector 0,0,1,observer,0
            Local ox# = TFormedX()
            Local oy# = TFormedY()
            Local oz# = TFormedZ()
        
            ;pick vector
            Local dx# = (EntityX(target,True)-EntityX(observer,True))/dist#
            Local dy# = (EntityY(target,True)-EntityY(observer,True))/dist#
            Local dz# = (EntityZ(target,True)-EntityZ(observer,True))/dist#
            
            ;dot product
            Local dot# = ox*dx + oy*dy + oz*dz
            ;prov=Cos(viewangle/2.0)
            ;Stop
            ;check if the target is within the viewangle
            If dot => Cos(viewangle/2.0)
                ;If EntityPick(observer,viewrange) Stop
                ; check if something is blocking the view
                
                If LinePick(EntityX(observer,True),EntityY(observer,True),EntityZ(observer,True),dx*viewrange,dy*viewrange,dz*viewrange,0.01)=target
                    ; observer can see target
                    
                    Return target
                    
                End If
            End If
        EndIf
    End If

    ; observer cannot see target    
    Return False

End Function
В функции LineOfSight3D
содержится ента сшумасшедсшая проверка
Код чтоб просто запустить на блитзе. Я его не редактировал, не уберал что то типо ;LA LA TRALLALA.

Последний раз редактировалось Magus, 23.02.2009 в 00:08.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
оптимизация трафика для пользователей abcdef Наш форум 0 07.12.2008 16:20
оптимизация цикла snikers BlitzMax 4 29.09.2008 14:26
Оптимизация J2ME приложений johnk JAVA Micro Edition 1 10.11.2007 19:12
оптимизация коннекта impersonalis 2D-программирование 4 11.12.2006 01:18
Оптимизация своей картостройки New 3D-программирование 7 16.09.2006 08:41


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com