Online RPG <-- Viel zu langsam
Übersicht

![]() |
KryanBetreff: Online RPG <-- Viel zu langsam |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
... immer nur Daten senden die sich auch verändert haben ... | ||
![]() |
Mattis_the_brain |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich sag erst mal nur:
![]() ![]() ![]() |
||
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dreamora, das Problem mit Client-seitig ist, daß es Cheatern Tür und Tor öffnet oder was anderes ? | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja, das war mir auch klar, nur weiß ich überhaupt nicht wie ich das machen soll | ||
Webspaceanbieter?
Klick hier! Kultige Spieleschmiede? Klick hier! |
cyby |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
rofl
Playerposi musst du im allerbesten fall 25 mal pro sekunde senden ... tendenz 15-20 mal ... ![]() 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 ![]() oder ihre software firewall, je nachdem ( bei zonealarm muss man udp speziell einstellen damit es geht) |
||
![]() |
joKe |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@ 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 ![]() |
||
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Noch etwas.
Dreamora hat ausnahmsweise ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group