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

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

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

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 04.04.2009, 15:50   #1
ratttx
AnyKey`щик
 
Регистрация: 04.04.2009
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Не могу понять, как оптимизировать, то, что написал....

Добрые люди! Хелп! Столкнулся с такой проблемой.....
Я пишу игрушку шутер сетевую - пока что разрабатываю сетевой коннект через UDP. При смене координат игрока - их пересылают на другой компьютер... (игрок 1 шагнул на шаг "мувЕНТИТИ ххх,0,0,1" - отсылается УДП пакет с новыми координатами игрока) НО!!!! Когда у нас добавляются боты, игроки начинают бегать - то СИНХРОНИЗАЦИЯ Между компьютерами теряется (Целая орда сетевых пакетов - во всяком случае я на это грешу...) Может кто подскажет, способ, или ошибку, почему 2 2-х ядерных компа, не могут осилить 2-х игроков и 10 ботов(запуск 1 бота русская буква "х").... Где моя логика не верна? П.С. - при запуске - может потребовать текстуры - их можно просто отключить. П.С. - игра должна получиться интересной )
Const in_port=53424
Const out_port=53425
Global Stream_1=CreateUDPStream(out_port)
Global Stream_2=CreateUDPStream(in_port)
Type PL
Field IP
Field X
Field Y
Field NAPR
Field LIVE
Field ARMOR
Field mesh
End Type

Type BOT
Field botID
Field botHOST$
Field X$
Field Y$
Field NAPR$
Field LIVE
Field ARMOR
Field mesh
End Type


Global IN1$, IN2$, IN3$, IN4$, IN5$, IN6$, IN7$, IN8$, IN9$,IN10$
Global OUT1$, OUT2$, OUT3$, OUT4$, OUT5$, OUT6$, OUT7$, OUT8$, OUT9$,OUT10$
Global op_ip$
Global bike,izm
Graphics3D 800,600,32,2
SetBuffer BackBuffer()
;iip$=Input$("1) ya. 2) mom ")
op_ip$=Input$("Konnect IP ")
myIP$=Input$("MY IP ")

;If iip= 2 Then op_ip$ ="192.168.0.2"
;If iip= 1 Then op_ip$ ="192.168.0.3"
;-----------------myIP
;If iip=1 Then myIP$ ="192.168.0.2"
;If iip=2 Then myIP$ ="192.168.0.3"
myIP$=Int_IP(myIP$)
op_ip$=Int_IP(op_ip$)
SeedRnd (MilliSecs())
;================================================= ============================
bike=CreateSphere()
ScaleMesh bike,2,2,2
PositionEntity bike,0,1,0
camera=CreateCamera(bike)
TurnEntity camera,45,0,0
PositionEntity camera,0,20,-30
PointEntity camera,bike
light=CreateLight()
TurnEntity light,45,45,0

P.PL = New PL
P\IP$ = myIP$
P\X =EntityX#(bike)
P\Y =EntityY#(bike)
P\NAPR =EntityYaw#(bike)
P\LIVE =100
P\ARMOR =0

;================================================= ============================
grid_tex=LoadTexture( "towerz.bmp" )

ScaleTexture grid_tex,10,10
grid_plane=CreatePlane()
EntityTexture grid_plane,grid_tex









;opovewau -o vxode
WriteLine Stream_1,"VXOD" ;PLAYER \ bot
WriteLine Stream_1,name$ ;PLAYER NAME \bot ID
WriteLine Stream_1,myIP$ ;PLAYER IP
WriteLine Stream_1,"OTKLIK" ;KOMANDA
WriteLine Stream_1,EntityX#(bike) ;X
WriteLine Stream_1,EntityY#(bike);Y
WriteLine Stream_1,EntityYaw#(bike) ;NAPR
WriteLine Stream_1,""
WriteLine Stream_1,""
WriteLine Stream_1,""
SendUDPMsg Stream_1,op_ip$,in_port
;============








While Not KeyHit(1)
izm=False
FPS=FPS+1
If FPStime<MilliSecs() Then
FPSsave=FPS
FPS=0
FPStime=MilliSecs()+1000
End If






Gosub BOT
Gosub OBRABin

Gosub UPR ;Ypravlenie - otsilka novix koordinat



RenderWorld
Text 1,1, "x1= "+IN1$
Text 10,10, "x2 "+IN2$
Text 10,20, "x3= "+IN3$
Text 10,30, "x4= "+IN4$
Text 10,40, "x5= "+IN5$
Text 10,50, "x6= "+IN6$
Text 10,60, "x7= "+IN7$
Text 10,70, "x8= "+IN8$
Text 10,80, "x9= "+IN9$
Text 10,90, "x10= "+IN10$
Text 10,100, "fps= "+ FPSsave
Text 10,110, "myIP= "+ myIP$
Text 10,120, "B\x= "+tttt
Text 10,130, "b\y= "+tttt2
Text 10,140, "b\yaw= "+tttt3
Text 10,150, "bot max= "+BOTmax


Flip
Wend
;----------------------------------------------
.UPR
izm=False
If KeyDown(30) Then
TurnEntity bike,0,1,0 ;levo
izm =True
End If
If KeyDown(32) Then
TurnEntity bike,0,-1,0 ;pravo
izm =True
End If
If KeyDown(17) Then
MoveEntity bike,0,0,1 ;pered
izm =True
End If
If KeyDown(31) Then
MoveEntity bike,0,0,-1 ;zad
izm =True
End If
If KeyHit(26)And BOTmax<400 Then BOTmax=BOTmax+1


If izm=True
WriteLine Stream_1,"PLAYER" ;PLAYER \ bot
WriteLine Stream_1," " ;PLAYER NAME \bot ID
WriteLine Stream_1,myIP$ ;PLAYER IP
WriteLine Stream_1,"KOORDINATI" ;KOMANDA
WriteLine Stream_1,EntityX#(bike) ;X
WriteLine Stream_1,EntityZ#(bike) ;Y
WriteLine Stream_1,EntityYaw#(bike) ;NAPR
WriteLine Stream_1," "
WriteLine Stream_1," "
WriteLine Stream_1," "
For P.PL = Each PL
If P\IP$ <>myIP$ Then SendUDPMsg Stream_1,P\IP$,in_port
Next
End If

Return

;---------------------------------------------
.OBRABin
IN1$="" IN2$="" IN3$="" IN4$="" IN5$="" IN6$="" IN7$="" IN8$="" IN9$="" IN10$=""
If RecvUDPMsg(Stream_2) Then
IN1$=ReadLine$(Stream_2) ;PLAYER \ bot
IN2$=ReadLine$(Stream_2) ;PLAYER NAME \bot ID
IN3$=ReadLine$(Stream_2) ;PLAYER IP
IN4$=ReadLine$(Stream_2) ;KOMANDA
IN5$=ReadLine$(Stream_2) ;X
IN6$=ReadLine$(Stream_2) ;Y
IN7$=ReadLine$(Stream_2) ;NAPR
IN8$=ReadLine$(Stream_2)
IN9$=ReadLine$(Stream_2)
IN10$=ReadLine$(Stream_2)
EndIf

If IN1$="VXOD" Then
;proverka na est' li takou' pleer?
For P.PL = Each PL
If P\IP$ =IN3$ Then Return
Next

P.PL = New PL
P\IP$ = IN3$
P\X =Float(IN5$)
P\Y =Float(IN6$)
P\NAPR =Float(IN7$)
P\LIVE =100
P\ARMOR =0
P\mesh=CreateCube()
ScaleMesh P\mesh,2,2,2
PositionEntity P\mesh,Float(IN5$),Float(IN6$),0


;-
WriteLine Stream_1,"VXOD" ;PLAYER \ bot
WriteLine Stream_1,name$ ;PLAYER NAME \bot ID
WriteLine Stream_1,myIP$ ;PLAYER IP
WriteLine Stream_1,"OTKLIK" ;KOMANDA
WriteLine Stream_1,EntityX#(bike) ;X
WriteLine Stream_1,EntityY#(bike) ;Y
WriteLine Stream_1,EntityYaw#(bike) ;NAPR
WriteLine Stream_1,""
WriteLine Stream_1,""
WriteLine Stream_1,""
SendUDPMsg Stream_1,IN3$,in_port
;-
WriteLine Stream_1,IN1$ ;PLAYER \ bot
WriteLine Stream_1,IN2$ ;PLAYER NAME \bot ID
WriteLine Stream_1,IN3$ ;PLAYER IP
WriteLine Stream_1,IN4$ ;KOMANDA
WriteLine Stream_1,IN5$ ;X
WriteLine Stream_1,IN6$ ;Y
WriteLine Stream_1,IN7$ ;NAPR
WriteLine Stream_1,IN8$
WriteLine Stream_1,IN9$
WriteLine Stream_1,IN10$
For P.PL = Each PL
If (P\IP$ <>myIP$) And (P\IP$<>IN3$) Then SendUDPMsg Stream_1,P\IP$,in_port
Next


End If

If (IN1$="PLAYER") And (IN4$="KOORDINATI") Then
For P.PL = Each PL
If IN3$=P\IP$ Then
P\X=Float(IN5$)
P\Y= Float(IN6$)
P\NAPR=Float(IN7$)
PositionEntity P\mesh,Float(IN5$),0,Float(IN6$),0
RotateEntity P\mesh,0,Float(IN7$),0
EndIf

Next
End If


If (IN1$="BOT") And (IN4$="BOT KOORD") Then
flag=False
For B.BOT = Each BOT ;esli bot suw'estvyet - prinimaem novie koordinati
If IN2$=B\botID$ Then
B\X=Float(IN5$)
B\Y= Float(IN6$)
B\NAPR=Float(IN7$)
PositionEntity B\mesh,B\X,0,B\Y,0
RotateEntity B\mesh,0,B\NAPR,0
flag=True
EndIf
Next

If flag=False Then ;esli takogo imeni bota net - sozdaem ego
B.BOT = New BOT
B\botID$ = IN2$
B\botHOST=IN3$
B\mesh =CreateCube()
;grid_tex=LoadTexture( "heightmap.BMP" )
;ScaleTexture grid_tex,10,10
;EntityTexture B\mesh,grid_tex
EntityColor B\mesh,Rnd(250),Rnd(250),Rnd(250)
B\X =Float(IN5$)
B\Y =Float(IN6$)
B\NAPR =Float(IN7$)
B\LIVE =100
B\ARMOR =0
botNUM=botNUM+1
PositionEntity B\mesh,Float(IN5$),Float(IN6$),0,0
RotateEntity B\mesh,0,Float(IN7$),0
End If



End If




Return
;------------------------------------------------------------
.BOT
;sizdau bota
If botNUM<BOTmax Then
B.BOT = New BOT
B\botID$ = Rnd(30000)
B\botHOST$="MY"
B\mesh =CreateCube()
grid_tex=LoadTexture( "heightmap.BMP" )
ScaleTexture grid_tex,10,10
EntityTexture B\mesh,grid_tex
B\X =EntityX#(B\mesh)
B\Y =EntityY#(B\mesh)
B\NAPR =EntityYaw#(B\mesh)
B\LIVE =100
B\ARMOR =0
botNUM=botNUM+1
End If

If botNUM>0 Then
For B.BOT = Each BOT


If B\botHOST="MY" Then

MoveEntity B\mesh,0,0,0.5
TurnEntity B\mesh,0,Rnd(-40,40),0
B\X$ =EntityX(B\mesh)
B\Y$ =EntityY(B\mesh)
B\NAPR$ =EntityYaw(B\mesh)
tttt=EntityX(B\mesh)
tttt2 =EntityZ(B\mesh)
tttt3 =EntityYaw(B\mesh)

WriteLine Stream_1,"BOT" ;PLAYER \ bot
WriteLine Stream_1,B\botID$ ;PLAYER NAME \bot ID
WriteLine Stream_1,myIP$ ;PLAYER IP
WriteLine Stream_1,"BOT KOORD" ;KOMANDA
WriteLine Stream_1,EntityX(B\mesh) ;X
WriteLine Stream_1,EntityZ(B\mesh) ;Y
WriteLine Stream_1,EntityYaw(B\mesh) ;NAPR
WriteLine Stream_1," "
WriteLine Stream_1," "
WriteLine Stream_1," "
For P.PL = Each PL
If (P\IP$ <>myIP$) Then SendUDPMsg Stream_1,P\IP$,in_port
Next
End If
Next

End If

Return
;---------------------------
;.OBRABout
;If izm=True
; WriteLine Stream_1,OUT1$ ;PLAYER \ bot
; WriteLine Stream_1,OUT2$ ;PLAYER NAME \bot ID
; WriteLine Stream_1,OUT3$ ;PLAYER IP
; WriteLine Stream_1,OUT4$ ;KOMANDA
; WriteLine Stream_1,OUT5$ ;X
; WriteLine Stream_1,OUT6$ ;Y
; WriteLine Stream_1,OUT7$ ;NAPR
; WriteLine Stream_1,OUT8$
; WriteLine Stream_1,OUT9$
; WriteLine Stream_1,OUT10$
; SendUDPMsg Stream_1,op_ip$,in_port
; End If

Return



Function Int_IP(IP$)
d1%=Left(IP$,Instr(IP$,".")-1):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
d2%=Left(IP$,Instr(IP$,".")-1):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
d3%=Left(IP$,Instr(IP$,".")-1):IP$=Right(IP$,Len(IP$)-Instr(IP$,"."))
d4%=IP$
Return (d1 Shl 24) + (d2 Shl 16) + (d3 Shl 8 ) +d4
End Function


End
(Offline)
 
Ответить с цитированием
Старый 04.04.2009, 16:39   #2
ratttx
AnyKey`щик
 
Регистрация: 04.04.2009
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Не могу понять, как оптимизировать, то, что написал....

Я вот просто никак не могу понять, если взять например любую сетевую стратегию, то в ней в постоянном движении окола 300 юнитов.... Каким образом они пересылают по сети координаты каждого юнита?
Сорри народ, за корявость , я выложил мокрую версию - но она у меня последняя..... П.с. если я выложил сообщение не в той теме - извините.
(Offline)
 
Ответить с цитированием
Старый 04.04.2009, 23:43   #3
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Не могу понять, как оптимизировать, то, что написал....

ratttx, код я не смотрел (не могу), но дам вот несколько советов:
Первое это посылка данных не постоянная, представь что произойдёт если ты будешь посылать каждый цикл пакет с позицией, во первых он не дойдёт за длину цикла, во вторых это будет вот такая орда неактуальной информации..
Посылать пакеты нужно переодически (по прохождению времени, можно период сделать отличающимся, для оптимизации трафика).
Второе, когда я давно делал по сети перемещение игроков, и у меня было очень много объектов, которые были интерактивны (просты шарики, толкались игроками), задача была сделать клиент и сервер так, чтобы интерактивность с близстоящими шариками считалась на клиентах, и посылались дальше. Таким образом мы имели постоянную динамику того, что и где считается, если к шарику близко разные игроки, то тут уже считает сервер, таким образом клиент посылал много информации, поэтому я сделал систему индексов и категорий.
Посылал данные пакуя, к примеру первый Int значил категорию, это мог быть объекты, или игроки, или клиентский пакет. Вторая Int обозначала Index, тоесть на сервере и клиентах, у каждого эллемента который мог синхронизироваться и менять свои параметры зависимо от пакетов, имел свой уникальный ID, обычно это просто как массив. В одной категории, не могло быть 2 объекта с одинаковым ID. Далее после двух первых Int шёл третий, он обозначал индекс значения пакета, к примеру это жизнь, или позиция и т.д. далее конец пакета - это значения, которые уже ввезде были разные, и менялись в зависимости от категории и функции пакета.
Такая организация передачи данных дала мне возможность снять нагрузку просчёта мира с сервера, и рассеять её по актуальным клиентам. Но тут важный моммент что от разниц ping'а у клиентов, зависел игровой процесс..

Вообще совет тебе, продумай логику передачи данных, просто разбери сперва какие функции передачи данных у тебя есть, а затем разбери всё по косточкам, что нужно передаватЬ, как передавать/принимать, как исполнять и т.д. и т.п.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
3dr1aN (06.04.2009), newman (05.04.2009)
Старый 05.04.2009, 03:15   #4
ratttx
AnyKey`щик
 
Регистрация: 04.04.2009
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Не могу понять, как оптимизировать, то, что написал....

Пасиба за ответ! Индексирование у маня как раз есть )) Нагрузку я распределяю целеком между компами... Т.к. у меня каждый клиент - одновременно сарвер, а сервер является таким же клиентом. (По такой же системе сделан SKYPE) Я сегодня целый день размышлял именно на тему этого борохла ненужной информации и пришел к выводу, что мой обработчик пакетов за один цикл (1 ФПС) обрабатывает 1 пакет.... - А этих пакетов в 100 раз больше, проблема почти решена. Можно по подробнее про
Посылать пакеты нужно переодически (по прохождению времени, можно период сделать отличающимся, для оптимизации трафика).
Как оптимизировать так, что бы игроки не телепортировались? (Если от точки а - до точки б пропушен 1 или несколько шагов - игрок сразу перепрыгнет это расстояние)
(Offline)
 
Ответить с цитированием
Старый 05.04.2009, 03:18   #5
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Не могу понять, как оптимизировать, то, что написал....

в процессе ожидания пакета - экстраполяция
после - интерполяция и вновь экстра
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 05.04.2009, 18:14   #6
Артем Валерьевич
Бывалый
 
Аватар для Артем Валерьевич
 
Регистрация: 25.12.2007
Адрес: г. Краснодар
Сообщений: 894
Написано 421 полезных сообщений
(для 1,079 пользователей)
Ответ: Не могу понять, как оптимизировать, то, что написал....

код глянул, вопрос : чему равно значение переменной бот макс изначально?
по идее наверно должно быть нуль.
но значения я неувидел
(Offline)
 
Ответить с цитированием
Старый 05.04.2009, 19:17   #7
ratttx
AnyKey`щик
 
Регистрация: 04.04.2009
Сообщений: 4
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Не могу понять, как оптимизировать, то, что написал....

по дефауту 0. Я его не прописывал.
в процессе ожидания пакета - экстраполяция
после - интерполяция и вновь экстра
В нашем случае это мало применимо....
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять в чем ошибка KAK? TAK! MidletPascal 13 03.04.2009 15:01
Написал функцию гравитации X Y Z TEHb08 Blitz3D 0 05.01.2009 04:06
Странную балладу тут написал BoB Личное творчество 3 02.09.2008 21:02
не могу понять в чем прикол @lexxx Основной форум 30 03.12.2007 23:41
Нужна помощь. Оптимизировать код для создания мидлета. MA©TEP™ Основной форум 4 02.03.2007 12:21


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


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