Online RPG <-- Viel zu langsam

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Kryan

Betreff: Online RPG <-- Viel zu langsam

BeitragMo, Mai 10, 2004 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
hab mal n kleines on line rpg programmiert
nun habe ich gemerkt, dass es ziemlich schnell war ohne client
als dann aber ein client kam, dann ging es ganz ganz langsam...
Hier der Code: [AUSKLAPPEN]

Global answer$
Graphics 640,480,16,2
Global playerID
StartNetGame()
SetBuffer BaCKBuffer()
heroX=320
heroY=240
Const PHRASE=15
Repeat
 Cls
 Text 200,180,scx
 Text 200,200,scy
 answ=OwnInput(1,1,">>",60)
 If KeyDown(200) Then
   heroY=heroY-5
   moved=1
   If heroY<40+scy Then scy=scy-5
 End If
 If KeyDown(208) Then
   heroY=heroY+5
   moved=1
   If heroY>440+scy Then scy=scy+5
 End If
 If KeyDown(203) Then
   heroX=heroX-5
   moved=1
   If heroX<40+scx Then scx=scx-5
 End If
 If KeyDown(205) Then
   heroX=heroX+5
   moved=1
   If heroX>600+scx Then scx=scx+5
 End If
 If answ=13 Then
   blcklen=Len(answer$)
   blck1$=Mid$(answer$,1,20)
   blck2$=Mid$(answer$,20,20)
   blck3$=Mid$(answer$,40,20)
   answer$=""
 End If
 If blcklen>40 Then
   Text heroX-scx,heroY-60-scy,blck1$,1,1
   SendNetMsg PHRASE,heroX-scx,playerid
   SendNetMsg PHRASE,heroY-60-scy,playerid
   SendNetMsg PHRASE,blck1$,playerid
   Text heroX-scx,heroY-40-scy,blck2$,1,1
   SendNetMsg PHRASE,heroX-sc,playerid
   SendNetMsg PHRASE,heroY-40-scy,playerid
   SendNetMsg PHRASE,blck2$,playerid
   Text heroX-scx,heroY-20-scy,blck3$,1,1
   SendNetMsg PHRASE,heroX-scx,playerid
   SendNetMsg PHRASE,heroY-20-scy,playerid
   SendNetMsg PHRASE,blck3$,playerid
 ElseIf blcklen>20 Then
   Text heroX-scx,heroY-40-scy,blck1$,1,1
   SendNetMsg PHRASE,heroX-scx,playerid
   SendNetMsg PHRASE,heroY-40-scy,playerid
   SendNetMsg PHRASE,blck1$,playerid
   Text heroX-scx,heroY-20-scy,blck2$,1,1
   SendNetMsg PHRASE,heroX-scx,playerid
   SendNetMsg PHRASE,heroY-20-scy,playerid
   SendNetMsg PHRASE,blck2$,playerid
 ElseIf blcklen>0 Then
   Text heroX-scX,heroY-20-scY,blck1$,1,1
   SendNetMsg PHRASE,heroX-scx,playerid
   SendNetMsg PHRASE,heroY-20-scy,playerid
   SendNetMsg PHRASE,blck1$,playerid
 End If
 Oval heroX-scx,heroY-scy,20,20,0
 Plot 400-scx,400-scy
  SendNetMsg CIRCLE,heroX-scx,playerid
  SendNetMsg CIRCLE,heroy-scy,playerid
 IF RECVNETMSG() THEN
  msgType=NETMSGTYPE()
   Select msgType
   CAse PHRASE
    texx=NetMsgData$()
    RecvNetMsg
    texy=NetMsgData$()
    RecvNetMsg
    textext$=NetMsgData$()
    Text texx-scx,texy-scy,texttext$
   CAse CIRCLE
    cirx=NetMsgData$()
    RecvNetMsg
    ciry=NetMsgData$()
    Oval cirx-scx,ciry-scy,20,20,0
  END Select
 END IF
 Flip
Until KeyHit(1)
Function OwnInput(x,y,frage$,maxlen)
 get_key=GetKey()
 get_chr$=Chr$(get_key)
 If get_key=>32 ANd Len(answer$)<maxlen And get_key<256 Then answer$=answer$+get_chr
 If get_key=8 THen answer$=Left$(answer$,Len(answer$))
 If get_key=13 Then Return 13
 If get_key=4 Then  answer$=""
 Text x,y,frage$
 Text x+StringWidth(frage$)+16,y,answer$
End Function
Function StartNetGame()
Print "Drücken Sie [1], um ein Spiel zu erstellen."
Print "Drücken Sie [2], um an einem Spiel teilzunehmen."

Wahl = Input("Ihre Wahl: ")
Name$ = "test"

If Wahl=2 Then IP$ = Input("IP-Adresse des Hosts:")
If Wahl=1 Then Spiel = HostNetGame(Name$)
If Wahl=2 Then Spiel = JoinNetGame(Name$, IP$)
If Spiel=0
Print("Fehler beim Starten eines Netzwerk-Spiels!")
WaitKey()
End
EndIf

If Spiel=1 Then Print("Spiel als Client gestartet.")
If Spiel=2 Then Print("Spiel als Host gestartet.")

playerID = CreateNetPlayer(Rand(50000))

If RecvNetMsg() = 1 Then Position$ = NetMsgData$()
End Function
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

Dreamora

BeitragMo, Mai 10, 2004 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
so geht das nicht sorry

du musst alle daten als 1 packet senden. sonst steht das programm durchgehend weil es irgendwas empfängt oder sendet.

Markus2

BeitragMo, Mai 10, 2004 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
... immer nur Daten senden die sich auch verändert haben ...

Mattis_the_brain

BeitragDi, Mai 11, 2004 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sag erst mal nur:
Arrow daten nur senden wenn sie wirklich gebraucht werden
Arrow nur daten einlesen wenn welche da sind
Arrow UDP verwenden!!!
 

Omenaton_2

BeitragDi, Mai 11, 2004 10:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier sind paar interessante Links zu diesem Thema die ein wenig Hintergrundinformationen liefern:

http://www.freeworldonline.com

http://www.mmorpgce.com

(Ich glaube das sind 2 erstaunliche Beispiele dafür, daß man in BB3D ein MMORPG machen kann. Die Grafiken sind leider schlecht, aber das liegt nur an dem fehlenden Talent der Grafiker. Wenn 1-2 professionelle Grafiker dafür was machen würden, könnte es richtig gut werden.)
 

Dreamora

BeitragDi, Mai 11, 2004 14:08
Antworten mit Zitat
Benutzer-Profile anzeigen
letzteres wieder vergessen. Es is zwar ein Beispiel dafür dass es gehen kann aber nur weil es cheatet. heisst es macht alles clientseitig und hat echt miesen code
 

Omenaton_2

BeitragDi, Mai 11, 2004 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Dreamora, das Problem mit Client-seitig ist, daß es Cheatern Tür und Tor öffnet oder was anderes ?
 

Dreamora

BeitragDi, Mai 11, 2004 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Es öffnet Cheatern tür und Tor und nebenher wirds nicht funktionieren in der Realität.

Weil im Internet hast du Pings. Da kommt dann automatisch das Problem: "Bei mir habe ich ihn getroffen - Aber er war schon weiter nur wusste das mein pc nicht"


deshalb sind kollisionen und dergleichen auf dem server zu bestimmen so dass solche unterschiede keine unterschiedlichen Resultate hervorrufen können

Kryan

BeitragDi, Mai 11, 2004 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, das war mir auch klar, nur weiß ich überhaupt nicht wie ich das machen soll
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!
 

cyby

BeitragDi, Mai 11, 2004 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,

ich habe das Problem selber auch das das alles sehr sehr langsam ist, ich sende nur wenn es auch nötig ist und habe ein paar andere Sachen beachtet, doch mit 2 Player sind das dann nur noch so 5 FPS !
Das ganze ist nur ein TestCode , deswegen noch total verbuggt und ist nur zum testen des speeds und optimieren da......
Code: [AUSKLAPPEN]
AppTitle "RPG Online"

;############################# load_data1.bb ###############################


;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< spiel start ect.
Global wahl ;1 = host ;2 = client
Global name$ ;name der spiele sitzung
Global Spiel ;zum starten das hostest und clients
Global ip$ ;ip-adresse
Global SpielerNr ;die spieler nummer von einem wo erstellt wird



;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< chat
Global antwort$,backtime = MilliSecs()
Global antwort_weggehen1 = MilliSecs()
Global antwort_nummer1 = 0;0 = kein text ;1 = text
Global antwort_weggehen2 = MilliSecs()
Global antwort_nummer2 = 0;0 = kein text ;1 = text
Global message_test = MilliSecs()
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< player
;<<<<<<<<<<<<<<<<<<<<<<<< type

Type player
 Field nachricht1$
 Field nachricht2$
 Field name$
 Field x
 Field y
End Type

;<<<<<<<<<<<<<<<<<<<<<<<< player1 - man selber

Global player1.player = New player
player1\x = 200;x possition des player1
player1\y = 200;y possition des player1

Global x1;damit nicht immer gesendet wird...
Global y1;damit nicht immer gesendet wird...
;<<<<<<<<<<<<<<<<<<<<<<<< player2 - der andere
Global player2.player = New player
player2\x = 200
player2\y = 200

;################################################################## LOGIN
;abfrage ob man host oder Client sein will
Print "Drücken Sie [1], um ein Spiel zu erstellen."
Print "Drücken Sie [2], um an einem Spiel teilzunehmen."

Wahl = Input("Ihre Wahl: ")
Name$ = "test"

If Wahl=2 Then IP$ = Input("IP-Adresse des Hosts:")
If Wahl=1 Then Spiel = HostNetGame(Name$)
If Wahl=2 Then Spiel = JoinNetGame(Name$, IP$)

;wenn das spiel nicht gestartet werden konnte
If Spiel=0
Print("Fehler beim Starten eines Netzwerk-Spiels!")
WaitKey()
End
EndIf

If Spiel=1 Then Print("Spiel als Client gestartet.")
If Spiel=2 Then Print("Spiel als Host gestartet.")

player1\name = Input("Spielername: ")
SpielerNr = CreateNetPlayer(player1\name)

If RecvNetMsg() = 1 Then Position$ = NetMsgData$()

;#########################################################################
;###################### DAS GAME SELBER ##################################
;#########################################################################
Graphics 640,480,16,2
SetBuffer BackBuffer()

Global loop_speed = MilliSecs()
Global senden_max = MilliSecs() ; nur 35/sec possition senden

Repeat
 Cls

 draw_player()
 player1()
 input_game()
 ui_game()
 senden()
 empfangen()


 loop = loop + 1
 If MilliSecs()-loop_speed>1000 Then fps = loop : loop = 0 : loop_speed = MilliSecs()
 Text 0,0,"loop: "+fps
 
 Flip
Until KeyHit(1)
StopNetGame()
End

;################################################ senden
Function senden()

 ;player position
 If MilliSecs()-senden_max>1000/25 Then
 senden_max = MilliSecs()
 If (player1\x <> X1) Or (player1\y <> Y1) Then
  Position$ = LSet(Str$(player1\x),4) + "," + LSet(Str$(player1\y),4)
  SendNetMsg 1, Position , SpielerNr, 0
  X1=player1\x
  Y1=player1\y
 EndIf
 EndIf
 ;chatnachrichten
 If KeyHit(28) then
   Position$ = LSet(Str$(player1\nachricht1),len(player1\nachricht1)) + "," + LSet(Str$(player1\nachricht2),len(player1\nachricht2))
  SendNetMsg 2,position, SpielerNr,0
 EndIf

End Function
;################################################ empfangen
Function empfangen()

 ; player daten empfangen
  While RecvNetMsg() = 1
  Select NetMsgType()
  Case 1 ; playerposition
  Position$ = NetMsgData$()
  player2\x = Int(Position$)
  player2\y = Int( Mid$(Position$, Instr(Position,",") +1) )
  player2\name = NetPlayerName(netmsgfrom())
  Case 2 ; chatnachrichten
  Position$ = NetMsgData$()
  player2\nachricht1 = Position$
  player2\nachricht2 = Mid$(Position$, Instr(Position,","))
  End select
  wend

End Function
;################################################ draw_player
Function draw_player()

 ;<<<<<<<<<<<<<<<<<<<<< player2
 ;player zeichnen
 Color 0,0,255
 Rect player2\x,player2\y,32,32
 ;name vom player 2
 Color 0,255,0
 Text player2\x+16,player2\y,player2\name,1

 ;<<<<<<<<<<<<<<<<<<<<< player1
 ;player zeichnen
 Color 255,0,0
 Rect player1\x,player1\y,32,32
 ;name von player1
 Color 0,255,0
 Text player1\x+16,player1\y,player1\name,1

End Function
;################################################ player1
Function player1()

player_key()

End Function
;################################################ player_key
Function player_key()

If KeyDown(200) Then player1\y = player1\y - 2
If KeyDown(208) Then player1\y = player1\y + 2
If KeyDown(203) Then player1\x = player1\x - 2
If KeyDown(205) Then player1\x = player1\x + 2

End Function
;########################## input.bb ##################################
Function input_game()

Color 0,0,255
Rect 0,578,672,24;eingabe

;newinput
befehl$ = newinput$(0,580,">>", 80)
If Not befehl$ = ""
antwort = ""
player1\nachricht1 = Mid(befehl,1,40)
player1\nachricht2 = Mid(befehl,41,40)
antwort_nummer1 = 1
antwort_weggehen1 = MilliSecs()
EndIf


draw_text()

End Function

;############################### draw_text()
function draw_text()

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< player1
Color 255,0,0
Text player1\x+16,player1\y-40,player1\nachricht1,1
Text player1\x+16,player1\y-20,player1\nachricht2,1
;damit die antwort in 10sec verschwindet
If antwort_nummer = 1 And MilliSecs()-antwort_weggehen > 10000 Then
player1\nachricht1 = ""
player1\nachricht2 = ""
antwort_nummer1 = 0
antwort_weggehen1 = MilliSecs()
EndIf
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< player2
Color 255,0,0
Text player2\x+16,player2\y-40,player2\nachricht1,1
Text player2\x+16,player2\y-20,player2\nachricht2,1
;damit die antwort in 10sec verschwindet
;If antwort_nummer = 1 And MilliSecs()-antwort_weggehen > 10000 Then
;player2\nachricht1 = ""
;player2\nachricht2 = ""
;antwort_nummer2 = 0
;antwort_weggehen2 = MilliSecs()
;EndIf

End function
;############################### newinput()

Function newinput$(x1,y1,frage$,maxl)
a = GetKey()
If a => 32 And a <= 255 And Len(antwort$) <= maxl-1 Then antwort$ = antwort$ + Chr$(a)
If KeyDown(28) Then Return antwort$
If KeyDown(14) And Len(antwort$) > 0 And MilliSecs()-backtime > 125  Then
antwort$ = Left(antwort$,(Len(antwort$)-1))
backtime = MilliSecs()
End If

Color 255,255,255
Text x1,y1, frage$ + antwort$ + "_"
End Function
;####################### ui_game.bb ###################################
Function ui_game()
;menü
Color 0,255,0
Rect 672,0,128,600

End function


Ich denke UDP wäre da schon besser, leider läuft das UDP nur bei sehr sehr wenigen Leuten .... gibt es denn da was besonderes zu beachten ?
Danke für Antworten !

cu
cyby

// edit
gerade einen allgemeinen tip von j0k3 bekommen, die playerpossition nur alle 35mal/sec zu senden, ich habe 25 genommen da es so auch gut aussieht, mal schauen ob es ein paar FPS hochgebracht hat wenn man es über i-net testet.........
 

Dreamora

BeitragDi, Mai 11, 2004 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
rofl

Playerposi musst du im allerbesten fall 25 mal pro sekunde senden ... tendenz 15-20 mal ... Smile

kannst ja überlegen wie viel zeit zwischen dem senden bleibt bei 25x ( -> 40ms ... von dem ping träumt nen grossteil von deutschland *ggg* )


und udp würde bei vielen gehen wenn sie in der lage währen ihre hardware firewall im modem einzurichten Smile
oder ihre software firewall, je nachdem ( bei zonealarm muss man udp speziell einstellen damit es geht)

joKe

BeitragMi, Mai 12, 2004 9:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir wurd gesagt das das Auge 30 Bilder pro Sekunde als flüssig erscheint ( minimum ) ... also muss die Figur sich mindestens auch so Bewegen , es recht ja nicht wenn das Bild 60 mal pro Sekunde geupdatet wird , die Figur des Gegners muss dies ja auch tun , um eine ruckelfreie Darstellung zu gewährleisten , und ich sage dir da ist 15-20 auf jeden Fall zu wenig ... alles andere wie zB die Waffe kannste gerne nur 10 mal sekunde übergeben , oder die Stats nur jede Sekunde , aber die Figur sollte sich schon flüssig bewegen ... alles andere fählt vorerst nicht ins gewicht ...
Projekt: Pollux Renegades Coop
[Maschine: Intel DualCore2 2x 3Ghz | 4096 DRR2 | GeForce GTX 260 Ultra]
 

DoomMaster

BeitragMi, Mai 12, 2004 10:04
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich sage dir 15 mal reicht völlig in den restlichen frames berechnest du einfach die warscvheinliche weitere bewegung hast ja position richtung und geschwindigkeit damit sparst du dir viel netzwerklast.
 

Omenaton_2

BeitragMi, Mai 12, 2004 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Jemand sollte versuchen in die Beta von Freeworld online reinzukommen um herauszufinden, wie gut das ist und wie weit das technisch in BB lösbar ist.
 

cyby

BeitragMi, Mai 12, 2004 13:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@ j0k3
Das Menschliche Auge nimmt 24Bilder pro Sekunde war ....
aber mit der technik wie ich die person bewegen lassen will muss ich nur eine variable pro sekunde senden die nur einen wert von 1-8 haben kann Very Happy
 

Omenaton_2

BeitragMi, Mai 12, 2004 14:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Das Menschliche Auge nimmt 24Bilder pro Sekunde war ....
aber mit der technik wie ich die person bewegen lassen will muss ich nur eine variable pro sekunde senden die nur einen wert von 1-8 haben kann


Das ist nicht ganz richtig.
Die menschliche Auge kann viel mehr, bis zu 60 Bilder / Sekunde oder sogar noch ein wenig mehr wahrnehmen.
Richtig ist, daß das menschliche Auge ab 24 Bildern / Sekunde eine Bewegung als einigermaßen flüssig wahrnimmt. Man kann den Unterschied zwischen 24/sec und 60/sec wahrnehmen. 60/sec ist merklich flüssiger, feiner, ruhiger.
Ein Spiel das mit 60/sec läuft ist eni wenig besser als eins das nur mit 24/sec läuft.
Normalerweise nimmt man für Spiele 30/sec oder 60/sec und unter 15/sec ist es unspielbar.
 

Omenaton_2

BeitragMi, Mai 12, 2004 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch etwas.
Dreamora hat ausnahmsweise Wink Recht.
Er meint nicht, daß das Spiel mit nur 15 Frames / sec läuft.

15 mal pro sec werden die Spielerpositionen übertragen, aber die Figur und das ganz Bild wird öfters als nur 15 / sec gezeichnet. In den Intervallen zwischen 2 Positionübertragungen sollen die Figuren ihre Bewegung (oder Stillstand) nach Wahrscheinlichkeit berechnet fortsetzen.
Wenn eine Figur mit Speed X in Richtung Y rennt, dann wird die Figur als nächstes ein klein wenig weiter in die selbe Richtung gesetzt gezeichnet und meistens wenn dann wenige Millisekunden später die Information zu der nächsten Spielerposition ankommt, stimmt das auch.
 

fliege

BeitragMo, Dez 06, 2004 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
jedoch, sollte man alle Koordinaten eines Spielers (x,y,z,pitch,yaw,roll,animationsstep) in einem Packet senden, so sollte es doch schnell genug werden oder?
Fliege
 

Dreamora

BeitragMo, Dez 06, 2004 20:32
Antworten mit Zitat
Benutzer-Profile anzeigen
die position sendest du nur 1 - 2x pro sekunde. Die restliche zeit wird auf basis der letzten position und des aktuellen bewegungsvektors berechnet.
Und jeweils wenn die pos kommt wird synchronisiert wenn nötig
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Hummelpups

BeitragMo, Dez 06, 2004 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop Dreamora, ich würde es genauso machen.
Die Richtung angeben also 0,1,2,3 oder sonstwas.
Die Walk anims werden komplett autom. gemacht. Nur jede
2. Sek. wird die Pos dann abgeglichen. Wenn z.B. beide PCs
am Maximum bei z.B. 50 FPS laufen dürften da keine Probleme
auftauchen sobald aber einer mit 20 und einer mit 50
FPS spielt wirds schon kritischer und die Spielfigur würde
regelrecht springen.
Man müsste die Spielerposi nicht pro Schleifendurchlauf ändern sondern
konkret per zeit

if millisecs()>=time+1000 then

...

So würde es evtl. klappen.

BiZaR
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group