|
22.02.2009, 19:21
|
#1
|
Разработчик
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений (для 36 пользователей)
|
Оптимизация кода, помохите
Значит есть кучка ботов ну допустим 20. Как для каждого найти ближайшее расстояние до врага. Я то спосб знаю только он мне не очень нравится. Все боты забиты в типы и при каждом обновлении каждый из ботов проверяет всех остальных ботов какой к ниму ближе, путём: если дистанс < Предедущий дистанс, тогда цель берём эту, если нет то предыдущую. Не знаю лучший ли это способ. Но он меня не устраивает. Если кто знае лучше подскажите пжаласта
|
(Offline)
|
|
22.02.2009, 19:28
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Оптимизация кода, помохите
20 это очень мало. 400 получений дистанции на цикл это очень немного.
вот если бы их было хотя-бы сотни 3.
вообще проще всего использовать регулярную сетку. т.е. беш все поле скажем на 100 ячеек. каждый цикл засовываеш в ячейку указатель на бота. и сравниваеш расстояние не со всеми ботами, а только с теми, что в ближайших ячейках.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.02.2009, 21:14
|
#3
|
|
Ответ: Оптимизация кода, помохите
CRASHER
получение дистанции в квадрате это всего два умножения и одна сума
когда арифметических операций перевалит за 50-100 тыс за один цикл - тогда волноватся надо
ps. регулярная сетка для этого дела рулит
|
|
|
22.02.2009, 22:14
|
#4
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Ответ: Оптимизация кода, помохите
на такие операции применяй таймер
скажем делай такой прогон по всем ботам раз в 500 мс
и не нужно заморачиваться со всякими сетками, деревьями и тд
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.02.2009, 22:23
|
#5
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Оптимизация кода, помохите
Ты неправ, деревья руляд аццки!
Хотя и каждый кадр делать обчсёт непрактично.
__________________
|
(Offline)
|
|
22.02.2009, 23:15
|
#6
|
Разработчик
Регистрация: 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)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:45.
|