Laden...

Netzwerkspiel Problem

Letzter Beitrag vor 15 Jahren 6 Posts 1.389 Views
Netzwerkspiel Problem

Hallo zusammen,
Ich habe eine Frage und zwar habe ich ein Netzwerkspiel programmiert.Das klappt zwar, aber eine Methode wartet in einem anderen Thread auf Daten das sieht so aus


public void Start()
{
try
{
IPAddress localAddr = IPAddress.Parse(
Dns.Resolve(Dns.GetHostName())
.AddressList[0].ToString());
IPEndPoint ep = new IPEndPoint(localAddr,port);
TcpListener server = new TcpListener(ep);
// Start listening for client requests. server.Start();
// Buffer for reading data
// Enter the listening loop.
client = server.AcceptTcpClient();
Connected(ClorLi.Listener);
NetworkStream str = client.GetStream();
//Hier liegt das Problem
while (true)
{
if (str.DataAvailable)
{
byte[] buffer = new byte[256];
str.Read(buffer, 0, 256);
string erg = Encoding.Default.GetString(buffer);
Get(erg);
}
}
}
catch (SocketException e) {
MessageBox.Show(e.Message);
}
}

Die Methode verbraucht an dieser stelle 25% Prozent CPU Leistung(Ich hab nen QuadCore also einer ist voll ausgelastet.Ich frag mich was wol bei nem SingleCore passiert)
weiß jemand wie man das optimieren kann?

Hallo pdelvo,

welcome bei myCSharp.de,

das Problem ist, dass du in deiner Endlosschleife (ohne Pause) immer wieder prüfst ob Daten verfügbar sind.
Und das macht deine CPU (ein Kern) natürlich so schnell er kann.
Deshalb hast du auch eine Auslastung von 25% (also 100% von einem Kern).

Wobei es eigentlich gar nicht nötig ist, mit so einer hohen Frequenz zu prüfen ob Daten verfügbar sind.
Deshalb empfehle ich dir einen Timer zu nehmen und dann in einem Intervall zu überprüfen ob du neue Daten hast.
Denn mit dem Timer hat die CPU immer eine kleine Pause in der sie sich ausruhen kann 🙂

Option B wäre ein Thread.Sleep in der while-Schleife einzubauen, denn dann hast du auch eine kleine Pause. Es ist aber viel besser wenn du den Timer nimmst.

Gruss
Michael

Danke,
Ich hatte das mit dem Timer schonmal probiert.Hab ich irgendwie nicht hinbekommen. Auf Thread.Sleep bin ich garnicxh gekommen. Gute Idee. Hab ich eingebaut. Und sehe da 0%.👍

Gruß pdelvo8)

Hallo Pdelvo,

Auf Thread.Sleep bin ich garnicxh gekommen. Gute Idee. Hab ich eingebaut. Und sehe da 0%.

Ja, dass das funktioniert ist klar, aber diese Lösung ist wohl alles andere als schön.
Deswegen habe ich auch in meinen vorherigen Post geschrieben, dass du den Timer verwenden sollst.

Option B wäre ein Thread.Sleep in der while-Schleife einzubauen, denn dann hast du auch eine kleine Pause. Es ist aber viel besser wenn du den Timer nimmst.

Denn mit der While-Schleife + Sleep bekommt man schnell mal Probleme und besonders hier im Forum werden dir sicherlich die meisten davon abraten, weil es ja den Timer gibt, welcher viel besser als die While-Schleife geeignet ist.

Gruss
Michael

Ich bleibe lieber bei der Schleife. Ich hab das gerade nochmal mit dem Timer ausprobiert, aber jetzt klappt garnichts mehr.Erstens musste ich meinen ganzen Code umschreiben.Und Zweitens wird der nicht ausgeführt.
Die Schleife funktioniert. 0% Auslastung sind auch in Ordnung.Und ich glaube jeder kann auf die Antwort eine halbe Sekunde warten

Ich bleibe lieber bei der Schleife. Ich hab das gerade nochmal mit dem Timer ausprobiert, aber jetzt klappt garnichts mehr.Erstens musste ich meinen ganzen Code umschreiben.Und Zweitens wird der nicht ausgeführt.
Die Schleife funktioniert. 0% Auslastung sind auch in Ordnung.Und ich glaube jeder kann auf die Antwort eine halbe Sekunde warten

Dann haste den aber nicht richtig umgeschrieben - und ich kann meinem Vorredner nur beiplichten - der Timer ist dem Sleep bei weitem vorzuziehen.

Durchs Sleep wirst du bestimmt noch einige lustige andere Effekte haben... und dann liest man dich bestimmt hier irgendwo wieder 😉

Gruß