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
network dll mmorpg
Hehe ça c'est un topic où je vais tuer 
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.

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 !
- Le psychopathe
- Messages : 764
- Inscription : jeu. 03/mars/2005 19:23
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
De plus, il y aura quelques modifications à apporter si cela est en 2D ou en 3D !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
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)
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...
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
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...