Autor Beitrag
geronimo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mi 12.06.02 16:29 
so ... hallo!
diesen thread gab es schon im delphi-forum. also nochmal um was es geht:

wir waren uns alle einig, dass cs nen schlechten netcode hat :D
und haben darüber diskutiert, welches protokoll man verwenden soll.
udp? tcp/ip? oder ipx?

tja ... ich hoffe, dass hier mal ein paar leute reinschreiben und ihren senf dazu geben :)

mfg geronimo
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.06.02 16:41 
(setinfo IRONIE 200%)

CS???!!!! :evil: DU WAGST ES! ATTENTÄTER, AMOKLÄUFER, DU!

Admin, sofort den Thread löschen!

(setinfo IRONIE 0%) :wink:

Ähm, CS hat einen schlechten netcode? Ist mir noch nicht aufgefallen, aber naja...

Für LAN gibt es tatsächlich schnellere Sachen als IP (z.B IPX). Willst du allerdings dich nicht auf LAN festlegen (und das willst du bestimmt nicht), bleibt gar keine andere Wahl als irgendwas auf IP-Basis.
Das TCP-Protokoll würde ich als ungeeignet einstufen. Es ist nicht von Bedeutung, ob eine von 30 Positionsaktualisierungen nicht ankommt. Das lohnt den Aufwand mit der Packet-Kontrolle nicht. Ich würde aufs Pferdchen UDP setzen.

Cu,
Udontknow
geronimo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mi 12.06.02 16:47 
Titel: blubb
klar. wenn man den netcode von cs mit dem von t2 vergleicht:
auf einem t2 server können 32 leute spielen auf einem cs server nur 16.
- ohne dass es ruckelt.

wir hatten aber gesagt, dass manche firewalls udp blocken. außerdem würde udp vielleicht bei gleichzeitigen downloads ruckeln - ausfallen.

so und jetzt?

ich denke wenn man seine befehle begrenzt, kann man tcp verwenden, wenn man nichts unnötiges sendet. zb gibt es keine positionsangabe - oder diese vielleicht nur jede sekunde - sondern den befehl: 1
das würde bedeuten, dass der spieler nach oben geht.

könnte man es nicht so machen? bzw. wie gross ist der datenverlust bei tcp/ip ?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.06.02 17:07 
t2... Was war das gleich...

Ach ja! Tribes2! Ist irgendwann abgeraucht und wollte nicht wieder starten, und ich war zu faul für eine Reinstallation... Gibt es überhaupt noch Server für T2, wo doch die Entwickler pleite gemacht haben?

Zitat:
wir hatten aber gesagt, dass manche firewalls udp blocken

Man konfiguriere die FW so, dass sie es nicht tut!
Zitat:
außerdem würde udp vielleicht bei gleichzeitigen downloads ruckeln - ausfallen.

Ja, öhh... Das gilt doch auch für TCP? da werden dann die ganze Zeit die Pakete auf die Reise geschickt, kommen nicht an, die gleichen Pakete werden also nochmal auf die Reise geschickt, usw... Da ist doch UDP geeigneter, da es egal ist ob eine Aktualisierung (wie die nun auch immer aussehen soll, ob Position oder Aktion oder beides ...) nicht ankommt. Es nützt nix, sie im nachhinein nochmal zu senden, da sich schliesslich dann schon alles wieder geändert hat![/b]
geronimo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Mi 12.06.02 17:50 
Titel: blubb
ähm ... bei tcp/ip gehen aber nicht so viele packages verloren, da es extra rückmeldungen bekommt, ob sie angekommen sind usw. 8)
wenn ein packet nich angekommen ist, wird es erneut gesendet.
u.a. ein grund warum es so lahm ist. 8)
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 12.06.02 18:07 
Ja, habe ich doch auch gesagt, auch wenn ich es ein wenig unglücklich ausgedrückt habe. Aber genau dieses Feature, das Pakete hundertprozentig ankommen, braucht man ja bei so einem Spiel gerade NICHT! Wenn ein Client nach (übertrieben gesagt) 2 Minuten die Daten über Position/Aktion eines anderes Spielers kriegt, ist das imho nutzlos!

So, wie es in CS läuft, ist es eigentlich schon richtig: Solange man nix von anderen Spielern hört, wird dessen Position einfach anhand der letzten angekommenen Pakete extrapoliert (nennt man es "movement prediction"?).
eprees
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 12.06.02 23:22 
es kann nur mit udp gehen...

tcp kannste von vornerein vergessen.

es sei noch zu erwähnen das hl niemals als echtes internet spiel geplant und dementsprechend auch "klassische" programmabläufe hat.
Dirk
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 13.06.02 17:10 
CS hat keinen schlechten Netcode, es hat ueberhaupt keinen. Wenn, dann ist der Netzwerkcode von HalfLife fehlerhaft.
Arakis
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 344



BeitragVerfasst: Do 13.06.02 17:26 
Titel: So kann man die Sache auch sehen
Gut, so kann man die Sache natürlich aus sehen. :mrgreen:
Ich persönlich halte nicht viel von CS, da zock ich doch lieber eine Runde HL :P

Bis dann
user defined image

_________________
Mit dem Computer löst man Probleme, die man ohne ihn nicht hätte.
Entwickler von SpaceTrek: The New Empire - Siehe Hompage!
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Fr 14.06.02 09:25 
@ Dirk: Schl@umeier! :wink:

BTW: Für zwischendurch ist Ricochet auch ganz witzig. Erinnert ganz schön an TRON...
webmaker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205



BeitragVerfasst: Di 18.06.02 20:48 
Also ich würde auf keinen Fall TCP/IP nehmen, da es meiner Meinung nach schon recht veraltet ist und dadurch langsamer ist als udp

_________________
.::Wissen ist Macht, nichts wissen macht nichts::.
Sephiroth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Mi 19.06.02 15:37 
Hmm also in meinem Spiel läufen die Bewegungen über UDP und alles was wichtig ist (z.B. Eine Nachricht die an andere Spieler geschickt werden soll) wird per TCP/IP verschickt. Nur das Verwalten mit den Connections ist ein bissel doof. Weil normalerweise Connectiert man ja über TCP/IP und hat ne Connection offen. Und wenn ich dann etwas über UDP versenden möchte muss ich einfach über die Connection meiner TCP/IP-Komponente die IP-Adressen auslesen und dann an diese die UDP Nachricht schicken =)
webmaker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 205



BeitragVerfasst: Mi 19.06.02 16:01 
Soviel muss man ja eigentlich auch nicht übertragen: Beispiel: Ich hab ein Balerspiel und schieße: Man übergibt ja einfach nur das Startsignal und ein Endesignal für eine bestimmte Funktion (hier z.b. schießen)

_________________
.::Wissen ist Macht, nichts wissen macht nichts::.
crip
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 22.06.02 21:14 
Titel: Kommt mal langsam zu sache
Leute es ist doch alles selbstverstaendig!!! Zu viele schreiben das selbe kommen wir nun zum CODE!!!!! Und zum Hauptfragen!!!:evil:

1) Gibt es Delphi Komponente die uns unser Leben einfacher machen, oder
muessen wir mit winsock 1.0 (Standart maessig bei Delphi dabei fuer C++ gibt es schon winsock 2.0 ,aber einiege leute haben sich muehe gemacht und winsock 2.0 fuer delphi bereitgestellt ist dann halt winsock 2.0 aber nit von Microsoft)
2) wie sieht der Code aus!!!!!
:arrow:
P.S. : Sorry aber wenn ich hier ohne beispiele 20 eintraege Lese wo immer das gleich steht dreh ich einfach am RAD :shock: !!! Is klar dass wir UDP benutzen und dies noch Asynchron. Ich wuerde hier auch meinen Code einfuegen aber der funzt bei mir nit :(

MfG

Crip :D
Maledictus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 21



BeitragVerfasst: Sa 22.06.02 22:51 
Titel: Component
:?: Kann mir jemand sagen wo ich WinSock 2.0 für Delphi her kriege?
Ist das eine Komponente?
cu
Maledictus
crip
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 22.06.02 23:32 
winsock 2 kann man von delphi-jedi.org/api/Winsock2.zip runterladen, ich glaub da gibt's auch tutorials dazu!

Mfg

Crip :arrow: know The enemy :D
Sephiroth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 102



BeitragVerfasst: Di 25.06.02 09:07 
Ok dann versuch ich mal bissel was zum wirklichen Code zu schreiben. Bei mir sieht der so aus:

Ich pack alles in einen String und verschickt diesen. Dieser sieht so aus:

"/id6Hallo Leute"

So würde es aussehen wenn einer eine Nachricht verschicken würde. Die Zahl nach /id gibt die Spieler ID an. Der Server verschickt nun diese Nachricht an alle User bis auf den mit der ID 6. Wenn der Client nun diese Nachricht erhält wird diese dann ausgewertet.... Ich hab bei jedem Client ein Array in dem alle Benutzer drin stehen der immer erweitert wird wenn ein neuer User hinzukommt. Aber der User sieht immer wenn eine Nachricht mit /id anfängt sofort als Textnachricht an.
Bei meinen Koordinaten mach ich das dann so:

"/y10/x55/id6"

Sollte mal ein String ankommen der ohne "/" anfängt erkennt der CLient es als Befehl.

Jo soviel zu mir... schreibt mal wie ihr das so macht...
crip
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 25.06.02 21:15 
Haha du witzbold :-) da kann ich noch mehr dazu schreiben aber was wir wirklich brauchen is ne connect procedure und eine Erkennung von angekommenen String variablen!!!!

Z.B. es kommt "/y../x.../richtung" jetzt brauchen wir nen befehl der das erkennt und die werte zuweisst!!!!

dann wie connectet und verschicken wir irgendwas tcp/ ip is zu langsam

frage : kann man mit tcp connecten und dann auf udp umsteigen oda muss man da auch reconnecten? oda wie geht ueberhaupt mit udp connecten der Befehl is ja dann bei winsock einfach dann statt sock_stream(fuer TCP) dann SOCK_DGRAM (UDP)

mfg
Crip :arrow: wir btauchen nen fachman hier :D :!:
geronimo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 29



BeitragVerfasst: Fr 28.06.02 17:25 
Titel: blubb
da geb ich crip mal recht. das mit dem string hätte ich auch noch hinbekommen :D . aber das auswerten ist so ne sache. :(
crip
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 29.06.02 16:49 
Tach Leutz,
also angefangen mit der Auswertung haben wir ja, weil es ja Datenpakete verschickt werden, die Loesung is mehr als einfach. Ich hoffe ich liege nicht Falsch wenn ich sage, dass es Strings verschickt werden aber das Prinzip soll ja gleich sein.

1) Auswertung (Ein Beispiel das wir bestimmt mit der Zeit verbessern)
ich nehme mal an das wenn ein"/" vorhanden ist, ist es dann ein befehl
und wenn nicht dann ein Chatmessage
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Procedure pr_auswertung(befehl:string);
var i:integer; temp:string;
begin
i:=1;
  if befehl[i] = '/' then  
// man koennte noch extra abfragen einbauen nuetzlich ist auch
//funktion length(befehl) der sagt dann wie gross ist der String
         begin
             i := i+1;
              if befehl[i]= x then begin
                                           temp:=befehl[i+1];
                                           i:= i+2;
                                             if befehl[i]= '/' then 
                                             else begin // hier kann man noch weiter      //ausbauen aber ich denke hauptprinzip ist damit verstanden
                                                    end   
                                               x:= strtoint(temp);//am ende setzt man 
 // einfach den Wert fuer x und kann dann mit y fortfahren
                                          end;    
         end
  else
        pr_chat_message(befehl);//da wird auch geprueft ob das eine //message ist und von wem die kommt(pr 4 procedure)
end;

2) Zu netcode, da es ne Netcode Spalte!Ich nehme an dass wir alle mit winsock 2.0 arbeiten(schaetze mal das winsock 1 nit viel anders ist aber...).
Erstens muessen wir winsock initializieren geht mit dem befehl
ausblenden Quelltext
1:
 WSAStartup(MAKEWORD(2,0), GInitData);					

fuer winsock 1.0 lauetet der Befehl
ausblenden Quelltext
1:
 WSAStartup(MAKEWORD(1,0), GInitData);					

wobei man sagen muss, dass GInitData : TWSADATA; fragt mich nicht wieso :D
und hier noch paar befehle zum connecten die ich kriegen konnte
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
FSocket: TSOCKET; 
addr   : TSockAddr;
InAddr: TInAddr;

addr.sin_addr := InAddr.s_addr := inet_addr(PChar(AddressEdit.Text)) //ich nehme aus dem edit die ip
addr.sin_port := htons(x); //hier sagen wir auf welchem Port wir connecten moechten x fuer beliebigen Port
FSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
//Sock_stream steht fuer tcp/ip da wir aber udp brauchen 
//muessen wir es in SOCK_DGRAM aendern!! 
//IPPROTO_IP fuer den Protokol ihr koennt die alle in winsock2.pas 
//sehen da steht auch ein comment dazu was dat sein soll
// hab nit so viel Ahnung :( 
connect(FSocket, @addr, sizeof(addr));// ja die connect Funktion

// am ende kann man da ganze schliessen mit 
     closesocket(FSocket);
// und die dlls ausladen mit 
WSACleanup
um winsock 2 zu initializieren muesst ihr die dlls (den link wo man es her haben kann findet ihr in dem Eintraeg oda mehrere davor) einfach ins Projekt Verzeichnis kopieren und bei
ausblenden Quelltext
1:
2:
3:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls;

winsock2 hinzuschreiben. so wenn ihr findet wie man jetzt Strings oder aehnliches verschicken kann, oder verbesserungs Vorschlaege oder Fragen habt postet es einfach!!!
MfG
Crip
:D