Array frage

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Meik

Betreff: Array frage

BeitragDo, Nov 05, 2009 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Zuerst: Mir ist kein besserer Titel für das Thema eingefallen, sorry Embarassed

Da ich mich schon immer für Spiele und Internet interessiert habe will ich mich nur noch auf das Thema Netzwerk konzentrieren und da meine ganze arbeit rein stecken. Angeregt von ToeB sein UDPLib will ich mir eine ServerLib und eine ClientLib schreiben die unabhängig voneinander laufen und programmiert werden können.

So nun zu meinem eigendlichen "Problem".
Wer ToeB seine UDPLib kennt ( wer nicht schaut mal hier rein: ToeB seine UDPLib ) und sich den Code mal angeschaut hat weiss das er mehrere Array genutzt hat für den onlinestatus, port, ip usw.

will die server lib möglichst schnell für mindestens 1000 user machen. gibt es auch eine möglichkeit mit banks zu arbeiten? hab aber leider 0 bank erfahrung deswegen array Smile
so, nun welche form ist besser, schneller, einfacher zu bediehen?

Useranzahl = 10
User_IP(Useranzahl)
User_Port(Useranzahl)
User_Leben(Useranzahl)
usw

oder
UserData( Useranzahl, 2 )

wobei dann 0 für IP, 1 für Port und 2 für Leben steht. mit der zweiten möglichkeit hätte ich dann nur ein einziges Array, allerdings auch gemischt. Also Zahlen uns Strings im selben Array die ich dann bei der ersten möglichkeit nicht habe.

Hoffe ihr habt ein paar hilfreiche Tipps Smile

Und danke nochmal an ToeB das er extra den Link für seine Lib repariert hat damals Very Happy

MFG Smile
 

da_poller

BeitragDo, Nov 05, 2009 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
type du kannst alle laufend durchgehen, du kannst alle einzeln ansprechen und du kannst mehrere datentypen mischen. Und das bei variabler userzahl(ein array ist nach dem resize leer und deine daten der user weg)
 

Meik

BeitragDo, Nov 05, 2009 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
da_poller hat Folgendes geschrieben:
type du kannst alle laufend durchgehen, du kannst alle einzeln ansprechen und du kannst mehrere datentypen mischen. Und das bei variabler userzahl(ein array ist nach dem resize leer und deine daten der user weg)


An Types hab ich auch gedacht aber wenn ich jetzt zb die IP vom 1000. User haben möchte muss ich vorher die anderen 999 überspringen. Ja ich könnte auch mit First und Last arbeiten aber bei dem 944. User wärs schon umständlich.

Types wär meine Letzte Wahl gewesen. Trotzdem danke für deine Antwort Smile

Nicdel

BeitragDo, Nov 05, 2009 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Array verbunden mit Type, also so:

Code: [AUSKLAPPEN]

Type User

Field IP$

field port

End Type

local UserData.User[100]

print UserData[10]\IP

Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Meik

BeitragDo, Nov 05, 2009 14:51
Antworten mit Zitat
Benutzer-Profile anzeigen
@Nicdel

Deine Methode ist so ähnlich wie meine Zweite Methode.

Ob ich jetzt die UserData( 10, 1 ) oder UserData(10)\IP schreib ist kein so großer unterschied. Würde mich aber mal interessieren welches schneller währe. Würde mich über einen Tester freuen da ich grad Zeit keine möglichkeiten habe zu programmieren.

MFG Smile

Nicdel

BeitragDo, Nov 05, 2009 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit deiner Methode ist nur ein Datentyp möglich, mit meiner alle. Deine Methode ist allerdings schneller.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Meik

BeitragDo, Nov 05, 2009 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicdel hat Folgendes geschrieben:
Mit deiner Methode ist nur ein Datentyp möglich, mit meiner alle. Deine Methode ist allerdings schneller.


Hmm ich dachte das man in Blitz3D die Datentypen mischen kann in arrays. Würde dann immer automatisch zum richtigen typ casten. Ich werd aber erstmal Array/Type Kombo wegen der besseren übersicht und einfachheit probieren und wenn es zu langsam wird wechsel ich dann zum mehrdimensionalen Array.

MFG Smile

mpmxyz

BeitragDo, Nov 05, 2009 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Strings kann man aber nicht rechnen.
Das wäre zumindest die einzige Möglichkeit, alles in einem Array unterzubringen.
Die Umwandlung in andere Datentypen ist sehr langsam.

Auf einzelne Type-Objekte kannst du auch mit Hilfe von Handle und Object zugreifen, wenn du eine Art ID brauchst.

Zur Geschwindigkeit:
Die Bank-Variante ist ziemlich schnell und trotzdem flexibel, was z.B. die Anzahl an Spielern betrifft.
Das Problem ist die Sache mit der Verwendung.
Man muss vieles beachten. (Offsets, Datentypen etc.)

[Achtung! Ich neige zu Schleichwerbung. Wink]
Aber dafür habe ich einen Precompiler programmiert.
Wenn du dich nicht selbst in Banks hineinarbeiten möchtest, ist dieser eine relativ einfache Lösung, trotzdem mit Banks umzugehen.
Du musst dann natürlich ein paar neue Funktionen lernen und den Code durch den Precompiler schicken, aber die "normalen" Probleme der Verwendung von Banks hat man dabei nicht.
Außerdem kann er auch Funktionen zum Lesen und Schreiben von den Daten der Databanks generieren.
Diese lassen sich mit jeder Art von Stream, wie TCP-Verbindungen und Dateistreams, nutzen.
[/Schleichwerbung]

Du kannst ihn dir ja mal anschauen, wenn du möchtest.

mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

ToeB

BeitragDo, Nov 05, 2009 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich habe statt Types extra Arrays genommen, da diese viel einfacher und schneller anzusprechen sind als Types. Man braucht nur die UserID. Und diese Lösung ist auch noch viel schneller, da wenn du ein Array mit UserData$( SpielerAnzahl,2) nehmen würdest, erstmal allgemein mehr speicherplatz wegen dem String ($) verbraucht wird bzw. das Programm langsamer damit rechnet, weil es ja erst in Zahlen umgewandelt werden muss. Und banken kannst du da eigentlich vergessen weil diese keine STrings speichern können (Doch eigl. schon aber da musst du die zeichen in Bytes umwandeln etc.). Am besten wäre eigl. die Lösung alle "User Daten" die Ints haben in ein Array zu fassen, alle die Floats haben in eins und alle die Strings haben in eins, also so :
Code: [AUSKLAPPEN]
Dim UserData1%(Anzahl,1) ;Ip=0:Port=1
;Dim UserData3#(Anzahl,-1) ;nix
Dim UserData2$(Anzahl) ;Nur name


Aber wenn du eine Lib schreibst die auch andere verwenden (selbst wenn nur du sie verwendest) solltest du zu der methode greifen die ich genommen habe. Die ist übersichtliger und man weiß sofort was gemeint ist.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Meik

BeitragMo, Nov 09, 2009 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke mpmxyz und ToeB

Hab die kombinationen Array+Type, nur Type und mehrdimensionale Arrays probiert für mein Programm. Sind alle nicht an Eindimensionale Arrays angekommen sowohl in Geschwindigkeit als auch in Kompfor (weiss nicht obs richtig geschrieben ist ^^).

@mpmxyz
Ich werd mir mal deinen PreCompiler anschauen Smile
Aber wenn alle Stricke reißen werd ich mir ein Sql Wrapper schreiben.

@ToeB
Kann zwar Minesweeper, Tetris, Mario & co sofort aus dem FF und fast bugfrei Programmieren ohne mir ein Konzept aufzuschreiben aber seelisch bin ich noch nicht bereit was zu veröffentlichen xD. Programmiere grob gesehen schon seit fast 19 Jahren und bisher nur in der Familie meine Sachen gezeigt ^^

Ich kann Kretik gut annehmen dennoch geht mir sowas immer sehr schnell sehr nah Embarassed

MFG Meik Smile

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group