Seite 1 von 1

Kleine Hilfestellung fürs Netzwerk

Verfasst: 01.02.2008 14:26
von gnasen
Hi,
ich arbeite derzeit an einem etwas größeren Projekt, läuft soweit alles gut, hänge derzeit aber an einer Sache, die mir kopfzerbrechen bereitet.

Ich fasse einige Daten (schon aufs Minimum beschränkt) nach diesem Muster zusammen:

|1;2;3;4;5;|8;3;5;2;1;|5;3;1;2;5;

und möchte sie als String verschicken.

1) Die Länge des Strings beträgt maximal 4000 Zeichen, enthält alle Daten von einem Internetspiel. Ist diese Datenmenge rein netzwerktechnisch zu verarbeiten? (ca. alle 2 sek. zu verschicken)

2) Wie stelle ich dies am besten an? Zur möglichst schnellen Verarbeitung würde ich gerne die Daten (welche aus einer LL stammen) schnell sammeln, aber auch kopieren können.
Ich denke, es gäbe sicherlich bessere Alternativen als die String-Methoden, aber würde es sich lohnen das ganze über Peek/Poke zu machen?

Die LL ist mit einer Struktur verknüpft, welche verschiedene Daten beinhaltet (Auch Strings). Alle relevanten Daten, die sich verändern, sind jedoch Longs. Falls jemand eine geschickte Idee hat, immer her damit <)

PS: Also technisch ist es soweit kein Problem, mir geht es halt primär um Geschwindigkeit und Sicherheit. Und vllt habt ihr bei sowas schon erfahrungen gemacht :wink:

3) Fiel mir grade noch ein: Sagen wir ich habe ein Blattpapier, mit der Seite A und B. Nun drehe ich diese Seite um (um die Y-Achse). Wie bekomme ich diesen Effekt mit TransformSprite3D hin? Ein Vorder und Rückseite Sprite sind jeweils vorhanden....

Schonmal Danke im vorraus

Verfasst: 01.02.2008 15:54
von ZeHa
Also normalerweise macht man es so, daß man alle Daten am besten in einer Struktur hat und nicht in einem String. Denn diese Struktur kannst Du dann so wie sie ist übers Netzwerk verschicken und am anderen Ende wieder genau so wie sie sind in einen Buffer schreiben und diesen dann als Struktur ansprechen. Somit brauchst Du nicht erstmal alles in einen String reinschreiben und von dort wieder rauslesen, sondern Du nimmst den ganzen "Klotz" wie er ist (Strukturen sind im Speicher ja immer am Stück abgelegt).


EDIT: Hier in diesem Spiel mach ich es genauso:
http://www.purebasic.fr/german/viewtopic.php?t=15489

Mal kurz das wichtigste extrahiert:

Code: Alles auswählen

Structure Object 
  type.l 
  
  lastXPos.l 
  lastYPos.l 
  
  XDirection.f 
  YDirection.f 
  
  lastTime.l 
  
  speed.f 
EndStructure


; ---


Global *player1.Player 
Global *player2.Player 
Global *myself.Player 
Global *opponent.Player 

Global *ball.Ball

Global *networkBuffer.Object
*networkBuffer = AllocateMemory(SizeOf(Object))


; ---


    If (event = #PB_NetworkEvent_Data) 
      ReceiveNetworkData(connection, *networkBuffer, SizeOf(Object)) 
      
      If (*networkBuffer\type = #PLAYER) 
        CopyMemory(*networkBuffer, *player2, SizeOf(Object)) 
      EndIf 
    EndIf


Verfasst: 01.02.2008 16:06
von ZeHa
Ach ja, alle 2 Sekunden 4 KByte zu verschicken dürfte kein großes Problem sein. Um was für eine Art von Spiel handelt es sich denn?

Verfasst: 01.02.2008 17:21
von gnasen
Zu deinem Code, wenn sich in der Structure zwischendrin Strings befinden, würde das ganze doch in die Hose gehen, oder nicht?
Am besten sollte alles der structure bis auf die Strings verschickt werden, aber ich habe das Gefühl, dass ich da um eine Übertragung der Structure in eine ohne die Strings nicht drumherum komme :(

Code: Alles auswählen

Structure Object 
  
DatenA.l
DatenB.l
DatenBlub.l
...
String1.s
String2.s
...

EndStructure
<--- alles bis auf die Strings soll verschickt werden

Achja, das ganze soll eine Art Kartenspiel Online werden. Immer wenn eine Aktion passiert dachte ich, einfach diese Aktion zu übertragen, sowie zum stetigen Vergleich die Daten aller Karten, damit sofort gemerkt wird, sollte etwas ausm Ruder laufen.

Verfasst: 01.02.2008 17:52
von ZeHa
Natürlich kannst Du dann keine Strings drinhaben, aber nachdem ich Deinen Datenstring gesehen hab, dachte ich, sowas brauchst Du eh nicht, da Du ja Zahlencodes usw. hast und keine Strings.

Ansonsten mußt Du halt die Struktur aufbauen ohne Strings, davon dann 'ne neue Struktur ableiten, in der noch zusätzlich die Strings drinstehen. Dann kannst Du zum Verschicken halt immer die "kleine" Struktur benutzen und diese dann auf der Gegenseite auch in den entsprechenden Speicherbereich reinkopieren. Ist also schon machbar.

Was für Strings mußt Du denn übertragen bei einem Kartenspiel?

Verfasst: 01.02.2008 18:11
von gnasen
Was für Strings mußt Du denn übertragen bei einem Kartenspiel?
Die will ich ja gerade nicht übertragen :lol:
Die sollen schön bleiben wo sie sind. Sind halt Infos drin, die jeder Client allerdings selber auslesen kann.

Verfasst: 01.02.2008 18:35
von ZeHa
Jo, dann trenne die Strukturen von den Strings oder mach es eben über eine abgeleitete Struktur, in der dann nur noch die Strings dazukommen, also so z.B.

Code: Alles auswählen

Structure PlayerBase
  xPos.f
  yPos.f
  energy.l
  ammo.l
EndStructure

Structure Player Extends PlayerBase
  name$
  haustier$
  lieblingsessen$
EndStructure
Im Spiel instanzierst Du einfach immer nur Player, aber wenn Du ihn übers Netz schickst, dann nur mit Sizeof(PlayerBase), und schon hast Du es ;)

Verfasst: 03.02.2008 15:44
von mk-soft