network dll mmorpg

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

network dll mmorpg

Message par Le psychopathe »

Voilà je voullais savoir si la lib network de pure en créant une dll pour dark basic si c'est possible de faire tourner un mmorpg donc des millers de joueurs. Cela me paraît un peu gros mais enfin je suis pas un expert dans ce domaine.

Si oui :
Il faudrait quoi comme config et debit ?

merci de vos reponses
scaraber
Messages : 362
Inscription : ven. 15/juil./2005 17:32

Message par scaraber »

je pence que il est possible de faire un MMORPG avec des grandes capaciter avec pure basic mais il faut que le code soit optimiser au max ...
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Hehe ça c'est un topic où je vais tuer :D

Je suis justement en train de faire un mmorpg, la partie serveur du moins.

Pour faire un mmorpg ou un partie en PB il faut distinguer deux choses, la partie purement réseau et le reste.

La partie réseau ne pose pas de réel problème, juste quelques soucis de séparation de paquets et une bonne connaissance des buffers (allocatememory et cie) pour l'analyse de ces paquets.

Le reste comporte un élément important que tu seras obligé de mettre en place si tu ne veux pas que ça lag à mort, ce sont les Threads.
Les threads c'est pas super difficile, faut juste capter comment ça fonctionne.
Par contre dans PB y'a un "léger" soucis avec les threads dans un cas bien précis, c'est quand tu utilises des chaînes de caractères.
Les fonctions internes de PB qui gèrent les strings fonctionnent toutes avec le même buffer, ce qui pose des soucis avec les threads.
Y'a moyen de passer outre mais c'est pas très pratique, si tu veux plus d'infos j'ai une petite librairie pour jouer avec ça.

Pour le reste, selon le protocole que tu vas créér (si c'est pas un jeu existant) et selon le nombre d'informations que tu vas envoyer tu peux compter jusqu'à 4-5ko max par joueur connecté.
D'autres paramètres peuvent entrer en ligne de mire comme la taille des cartes, la définition des cartes (move par 1 pixel ? 10 pixels ?), l'envoi de cartes ou autres graphiques, les joueurs bavards etc...

Si je prends l'exemple de mon jeu, pour le débit avec une ligne 512kb en upload je pourrais acceuillir une centaine de joueurs car le protocole est simple, léger et la map visible est pas super grande (20*20 cases).

En ce qui concerne la machine c'est plus compliqué, ça dépend de ton monde (taille ? un seul serveur ? un par ville ?), de ta base de données (un autre serveur ? perfs du moteur DB ?) et bien entendu comment tu as codé tout ça.

Comme tu vois il est difficile de te donner une réponse précise car beaucoup de critères sont à prendre en considération.

En ce qui concerne la partie client on s'en fout car le débit de n'importe quelle cnx adsl/cable suffit amplement et la puissance du pc dépendra de l'interface graphique.
Vive le thread-safe !
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Enfin pour faire un MMORPG, il faut nonseulemnt du tempspour faire le RPG en lui même qui est un jeu complet, mais il en faut encore plus pour faire la partie réseau, accroche toi bien
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

Je demandais sa pas pour moi car su je devais faire sa j'attendais pure V4 mias parce que c'était un véritable débat sur le forum DBpro.

Merci
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

De plus, il y aura quelques modifications à apporter si cela est en 2D ou en 3D !
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

beuh... j'avais fait un début de dll réseau pour dbp. Reste à vérifier si elle marche (une fois fini cette dll, je me suis demandé pourquoi utiliser dbp alors que j'avais tout sous la main avec pure)

Code : Tout sélectionner

Structure GlobChecklistStruct
  dwStringSize.l : string.s : valuea.l : valueb.l : valuec.l : valued.l
EndStructure
Structure GlobStruct
  CreateDeleteString.l : ProcessMessageFunction.l : PrintStringFunction.l : UpdateFilenameFromVirtualTable.l : Decrypt.l : Encrypt.l
  ChangeMouseFunction.l : SpareFunction1.l : SpareFunction2.l : SpareFunction3.l : g_pVariableSpace.l : g_pErrorHandlerRef.l
  g_GFX.l : g_Text.l : g_Basic2D.l : g_Sprites.l : g_Image.l : g_Input.l : g_System.l : g_File.l : g_FTP.l : g_Memblocks.l
  g_Bitmap.l : g_Animation.l : g_Multiplayer.l : g_Basic3D.l : g_Camera3D.l : g_Matrix3D.l : g_Light3D.l : g_World3D.l
  g_Particles.l : g_PrimObject.l : g_Vectors.l : g_XObject.l : g_3DSObject.l : g_MDLObject.l : g_MD2Object.l : g_MD3Object.l
  g_Sound.l : g_Music.l : g_LODTerrain.l : g_Q2BSP.l : g_OwnBSP.l : g_BSPCompiler.l : g_CSG.l
  g_Spare01.l : g_Spare02.l : g_Spare03.l : g_Spare04.l : g_Spare05.l : g_Spare06.l : g_Spare07.l : g_Spare08.l : g_Spare09.l
  g_Spare10.l : g_Spare11.l :  g_Spare12.l : g_Spare13.l : g_Spare14.l : g_Spare15.l : g_Spare16.l : g_Spare17.l : g_Spare18.l
  g_Spare19.l : g_Spare20.l 
  g_GFXmade.b : g_Textmade.b : g_Basic2Dmade.b : g_Spritesmade.b : g_Imagemade.b : g_Inputmade.b : g_Systemmade.b : g_Filemade.b
  g_FTPmade.b : g_Memblocksmade.b : g_Bitmapmade.b : g_Animationmade.b : g_Multiplayermade.b : g_Basic3Dmade.b : g_Camera3Dmade.b
  g_Matrix3Dmade.b : g_Light3Dmade.b : g_World3Dmade.b : g_Particlesmade.b : g_PrimObjectmade.b : g_Vectorsmade.b : g_XObjectmade.b
  g_3DSObjectmade.b : g_MDLObjectmade.b : g_MD2Objectmade.b : g_MD3Objectmade.b : g_Soundmade.b : g_Musicmade.b : g_LODTerrainmade.b
  g_Q2BSPmade.b : g_OwnBSPmade.b : g_BSPCompilermade.b : g_CSGmade.b
  g_Spare01made.b : g_Spare02made.b : g_Spare03made.b : g_Spare04made.b : g_Spare05made.b : g_Spare06made.b : g_Spare07made.b
  g_Spare08made.b : g_Spare09made.b : g_Spare10made.b : g_Spare11made.b : g_Spare12made.b : g_Spare13made.b : g_Spare14made.b
  g_Spare15made.b : g_Spare16made.b : g_Spare17made.b : g_Spare18made.b : g_Spare19made.b : g_Spare20made.b
  pEXEUnpackDirectory.b[260] ; [MAX_PATH]
  dwEncryptionUniqueKey.l : ppEXEAbsFilename.l : dwEMHDSpare2.l : dwEMHDSpare3.l : dwEMHDSpare4.l : dwEMHDSpare5.l
  HWND.l : HINSTANCE.l : pWindowsTextEntry.s : bInvalidFlag.b : dwWindowWidth.l : dwWindowHeight.l : hAppIcon.l
  dwAppDisplayModeUsing.l : dwWindowX.l : dwWindowY.l : dwWGDSpare1.l : dwWGDSpare2.l : dwWGDSpare3.l : dwWGDSpare4.l : dwWGDSpare5.l
   ; Windows Mouse Data
  bWindowsMouseVisible.b : iWindowsMouseX.l : iWindowsMouseY.l : iWindowsMouseClick.l : dwWMDSpare2.l : dwWMDSpare3.l : dwWMDSpare4.l
  dwWMDSpare5.l
  ; Main Screen Data (backbuffer)
  iScreenWidth.l : iScreenHeight.l : iScreenDepth.l : iNoDrawLeft.l : iNoDrawTop.l : iNoDrawRight.l : iNoDrawBottom.l
  dwSafeRectMax.l : pSafeRects.l : dwMSDSpare3.l : dwMSDSpare4.l : dwMSDSpare5.l
  iCurrentBitmapNumber.l : pCurrentBitmapTexture.l : pCurrentBitmapSurface.l : pHoldBackBufferPtr.l :  pHoldDepthBufferPtr.l
  dwBSDSpare1.l : dwBSDSpare2.l : dwBSDSpare3.l : dwBSDSpare4.l : dwBSDSpare5.l 
  iCursorX.l : iCursorY.l : dwForeColor.l : dwBackColor.l : dwRenderCameraID.l : fReflectionPlaneX.f : fReflectionPlaneY.f
  fReflectionPlaneZ.f : dwDDSpare1.l : dwDDSpare2.l : dwDDSpare3.l : dwDDSpare4.l : dwDDSpare5.l
  checklistexists.b : checklisthasvalues.b : checklisthasstrings.b : checklistqty.l : dwChecklistArraySize.l
  Checklist.GlobChecklistStruct
  iFogState.l : dwRedrawPhase.l : dwRedrawCount.l : dwStencilMode.l : dwStencilShadowCount.l : dwStencilReflectionCount.l
  dwNumberOfPolygonsDrawn.l : dwNumberOfPrimCalls.l : dwStencilSpare3.l : dwStencilSpare4.l : dwStencilSpare5.l
  bEscapeKeyEnabled.b : bSystemKeyEnabled.b : bSpareBool1.b : bSpareBool2.b : bSpareBool3.b : bSpareBool4.b : bSpareBool5.b
  bSpareBool6.b : bSpareBool7.b : bSpare8.b : bSpare9.b : pExitPromptString.s : pExitPromptString2.s : iSoftwareVP.l  
  dwDynMemSize.l : dwDynMemPtr.s
EndStructure
Global *GlobPtr.GlobStruct
Structure char ; character structure
  a.b
EndStructure

ProcedureDLL Initnet()
Nyu = InitNetwork()
ProcedureReturn Nyu
EndProcedure

ProcedureDLL connect(NomServeur.l, Port)
If NomServeur <> 0 : Name$ = PeekS( NomServeur ) : EndIf
Nyu = OpenNetworkConnection(Name$, Port)
ProcedureReturn Nyu
EndProcedure

ProcedureDLL event(ID)
Nyu = NetworkClientEvent(ID)
ProcedureReturn Nyu
EndProcedure

Procedure.l InitialiseCorePtr()
  If OpenLibrary( 3 , "DBProCore.dll" ) 
    coreptr_handle.l = IsFunction( 3 , "?GetGlobPtr@@YAKXZ" )
    *GlobPtr = CallCFunctionFast( coreptr_handle );
    CloseLibrary( 3 );
  EndIf
  ProcedureReturn *GlobPtr
EndProcedure

ProcedureDLL reception(ID)
*Buffer = AllocateMemory(1000)
ReceiveNetworkData(ID, *Buffer, 1000)
Nyu$ = PeekS(*Buffer, 1000)
*GlobPtr = InitialiseCorePtr()
CallCFunctionFast(*GlobPtr\CreateDeleteString, @temp.l, Len( Nyu$ ) + 1 ) 
PokeS( Temp , Nyu$ )  
ProcedureReturn Temp 
EndProcedure

ProcedureDLL envoie(ID, text.l)
If text <> 0 : String$ = PeekS( text ) : EndIf
SendNetworkString(ID, String$)
EndProcedure

ProcedureDLL decompacter(dat.l)
If dat <> 0 : file$ = PeekS(dat) : EndIf
If OpenPack(file$) 
  Addresse=NextPackFile() 
  While Addresse      
    NomFichier$=PeekS(Addresse) 
    addresse=NextPackFile() 
    If CreateFile(2,"ressources\temp\"+NomFichier$) 
      WriteData(Addresse,PackFileSize()) 
      CloseFile(2)
    EndIf
    Addresse=NextPackFile()
  Wend
ClosePack() 
EndIf
EndProcedure
la fonction de décompression fonctionnait, les autres, j'en ai aucune idée. Le plus gros probleme était que dark et pure ne gerent pas les strings de la meme maniere (merci chaos).

Par contre, pour de la 3D, y'a pas obligatoirement de modification niveau serveur (tout dépend si plusieurs coordonnée Z sont accessibles avec un seul X et un seul Y).

Pour en revenir aux mmo sous dbp, ca me parait chaud pour plusieurs raison:
En premier lieu, la relative lenteur de dbp, avec un nombre élevé de packets, ca risque de ralentire un peu.
Ensuite, l'absence de multi threading. Je vois meme pas comment gerer ca en fait, rien que pour L'AI des npc, si tu n'as pas de thread, tu peux toujours t'amuser (genre récuperer un certain nombre de packets, puis gerer les npc tous d'un coup, puis les packets, puis les npc...jolies lags en perspective).
Le fait que dbp de dispose d'aucune des fonctions importantes de découpage des strings ni meme un systeme de socket pour le reseau, obligé de passer par une dll.

Bref, en forcant vraiment, il est éventuellement possible de faire un serveur de mmo sous dbp, mais ca ne sera jamais aussi performant que sous un langage comme pure...
Répondre