Kleine Hilfestellung fürs Netzwerk

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Kleine Hilfestellung fürs Netzwerk

Beitrag 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
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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

Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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?
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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?
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag 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 ;)
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten