Technologie utilisé dans CatchCallenger

Manipulation du buffer réseau

0 copy

La technologie 0 copy technologie est un moyen pour ne jamais copier un buffer dans un autre (bien sur qu’en interne ont ne peu y échapper, par exemple pour transférer le buffer de la carte réseau jusqu’au programme). Vous déplacez seulement le curseur sur les données et vous controlez les données. Aprés vous pouvez:

  • Isolez le code principal et retournez les données comme une structure
  • Directement tout passer comme une structure

La structure de donnée est exclusivement de taille fixe car les tailles dynamique exige pointer et copie mémoire. (Et vous ne pouvez pas envoyé un pointeur au travers du réseau)

Si une donnée est supérieur à 8Bits, alors vous devez corrigez l’endianness, cela coute principalement des petites transactions mémoire.
Cela est pour envoyer des commandes avec des arguments temporaires. Les données persistantes ont besoin d’être stocker et donc n’autorise pas le 0 copy. Vous devez les garder quelque part car le buffer vas être purger.

SIMD

Sur Arm c’est neon, sur x86 c’est SSE-X, AVX-X. Pour en savoir plus, voir: http://en.wikipedia.org/wiki/SIMD
Ils permettent de copier un block mémoire avec une seuls instruction, c’est plus puissant qu’une boucle car cela exploite mieux le hardware sans avoir besoin d’utiliser les capacités de Vectorization du compilateur, voir: http://en.wikipedia.org/wiki/Vectorization_(parallel_computing)
Si une plage d’octet est valide, vous pouvez avoir un structure similaire as: 99x8Bits dans le buffer,  »’vous pouvez utiliser memcpy() pour transférer une plage d’octet directement depuis le buffer sur la structure »’.
Si une donnée est supérieur à 8Bits, alors vous devez corriger l’endianness, cela coute principalement des petites transactions mémoire. Voir le déserialiseur.
Cela est plus orienté pour le stockages des données mais peu être utilisé avec des données temporaire dans certains circonstances..

Déserialiseur

Cela est plus lent que le SIMD, mais cela est adapté pour les stockages d’informations qui doit être traités. Par exemple en chaine qui doit être transformer en pointeur + taille (mix avec les SIMD arrive souvent), vous devez changer l’Endianness pour la plus part des entiers, …
Priviligez de démarrer avec les adresses basses (buffer[0]) jusqu’au adresses haute (buffer[99]) pour améliorer les performances.

0 Allocation mémoire

La plus par du temps, n’ayez pas d’allocation mémoire, ou dans le pire des cas sur la stack. Grace à un protocole binaire, une taille fixe, un buffer permanent pour déserialiser les données est une bonne solution.
Toutes les opérations réseau lourdes comme le chargement du datapack peuvent être externalisé. Sur des serveurs hautes performances seul le trafic utile est envoyé et reçu, il y as donc de meilleur latences et un serveur plus légé, …

Binaire

Le texte peu être utile pour débugger, mais il utilise beaucoup de réseau et ressources.
Moins d’un accès sur un millards sur http est lu directement depuis le dump réseau (par des hackers, admin réseau, développeur -> vous devez avoir le niveau pour travailler avec, au même titre que manipuler des images/videos), cela veux dire que le reste du temps les ressources sont consommés sans raison, un protocole http binaire serai afficher de la même manière que le protocole http text dans un navigateur.
Pour utiliser les données « Data: 654654″‘ vous devez extraire « 654654 » (vérifier la longueur, faire une allocation dynamique) puis  »’le convertir en nombre »’. En binaire faite juste une copie (a=b;) et corriger l’endianness si besoin. ce qui est beaucoup plus puissant en binaire. La negociation du protocol en binaire été de 66 octets, en binaire elle est seulement de 5, avec un gain de 50x d’utilisation du cpu sur les opérations de lecture et comparaison.

Anti DDOS et cout de l’infrastructure

Toutes ces technologies et un bon usage du compilateur comme -march=XXX, permette d’être anti-DDOS par nature car cela permet de supporter un grand nombre de requêtes par seconde. Cela minimise le cout de l’infrastructure, autorise un jeu moins chère, plus de serveur pour les joueurs. Cela est donc plus dur à DDOS, C’est aussi plus facile à administré.

Epoll

Epoll est utilisé pour résoudre le problème C10K. Le serveur peu facilement supporter beaucoup de joueur sur un ordinateur de 25ans. Il ne saute pas la couche tcp du noyau pour fonctionner correctement en para-visualization, mais un bonne optimisation permet de résoudre le problème C10M sur un bon hardware.

Plugin

La plus par des parties standard comme la visibilité sur la map, base de données sont dans des classes et géré comme des plugin pour être changé, testé et benchmarké facilement.
Les plugins des bases de données en mode texte demande beaucoup de conversion du text vers des entiers (utilisation du cpu sur le serveur), la manipulation des chaines due à SQL prends aussi beaucoup de cpu/memoire/allocation mémoire aussi, et finalement la base de données sur le même serveur consomme aussi des ressources.
Inclut avec index et optimisé, la base de données est largement la partie la plus lente du serveur (tant coté cpu, memoire que IO disk), c’est pourquoi les requêtes sont asynchronisés.

Traduit de: http://catchchallenger.first-world.info/wiki/Technologies_used

Note: le protocole ftp en plus d’être text oblige de supprimer le contenu des dossiers pour supprimer ces dossiers. Vous passez donc de l’envoie de quelque octet et quelque ms 0 des Mo et des minutes heures pour supprimer les gros dossiers… Et vous contourner toutes les optimisations des FS sur la suppression des dossiers…

Path finding coté serveur et split via plugin

Bonjour,

Le path finding est une technique pour résoudre un chemin entre 2 points, et savoir si ont peu aller de l’un à l’autre. Cette technique est assez lourde, et peu consommer énormément de ressources pour des maps assez grande.

Pourquoi ne pas le faire coté serveur? Car comme dit précédemment les ressources cotés serveur sont précieuse, et ceux même en limitant la taille du path finding. Mais alors comment faire? Vous devez normalement ne pas résoudre les collisions en temps réel (car plein d’exception à une simple couche collision), et donc avoir un tableau de true/false représentant les tiles où vous pouvez marcher. Maintenant vous transformez cela en entier (int ou autre type qui peu contenir le nombre de tile max de votre map sur 2), et vous résolvez par zone. C’est à dire que 2 tiles l’un à coté de l’autre où l’ont peu marché sont dans la même zone. Si le point A et B sont dans la même zone, c’est qu’il y as un chemain entre les 2. Un tile isolé n’est pas une zone où l’ont peu marcher: Si ont est dessus, le changement d’orientation ne change pas la position (donc pas de contrôle si c’est marchable).

Coté transmissions de données, vous faites aux choix:

  • vous transmettez aux clients le point de destination d’un joueur, et c’est lui qui fait la résolution
  • Ou chaque joueur transmet les vecteurs de déplacement décomposé

La petite difficulté c’est le passage de zone, je m’explique: les passages qui font que l’ont peu passer que d’une zone à l’autre et pas l’inverse (c’est pour ça que ce n’est pas une zone unique). Ou encore si votre map est continue mais découpé en chunk (comme ma map en extérieur), vous devez valider que les 2 zone marchable des 2 maps sont bien en contact (et plus généralement boucler pour voir si la zone source et la destination sont bien en contacte, qui à dit path finding?).

Voila qui vous donnera ont grosse optimisation de votre serveur.

Certain m’ont suggéré de mettre la partie commune entre mon client et mon serveur en plugin, et peu être aussi le serveur pour les fois ou il est intégré au client (pour la version solo). Et en regardant « Mega drivers » pour mesa, j’ai la même conclusion. Faire du dynamique c’est bien car ça permet d’externaliser les parties communes pour les maj et les corrections. Mais ça freine l’évolution, dans le sens qu’il ne faut pas changer tout le temps les symboles (fonctions/méthodes) exportées. Certain ont décidé de ne jamais mettre à jour (pour garder la retro compatibilité des vieux programmes), d’autre ont des cycles de mise à jour. Pour Ultracopier les interfaces sont stables (peu de changement, et mineur), et vu que peu (actuellement pas) de plugins fait par d’autre, alors les changements sont fait à chaque versions majeures. Mais pour CatchChallenger, vu que je ne sais pas vraiment la forme définitive, et que la lib commune change tout le temps (je rajoute/supprime tout le temps des fonctions). J’ai décidé de mettre tout en statique, cela ne freinera pas l’évolution, et permettra une meilleur optimisation LTO. Cela permet de mieux compresser par upx, et aussi de faire moins de contrôle (car les info/arguments ne viennes pas de l’extérieur).

En espérant vous avoir éclairé, bye.

Ultracopier dispo pour les betas testeur

Bonjour, Ultracopier 0.3 est dispo pour les béta testeur en tant que version pre-alpha.

L’ajout/suppression des plugins en live marche bien. La version windows marche içi (mais pas d’interception de la copie de l’explorateur volontairement).

La copie ce fait via le moteur d’ultracopier 0.2 adapter pour la version 0.3, je n’est pas testé la fiabilité des données. J’attends le site des modules pour supporter les mises à jour et le téléchargement des modules depuis le web.

Un certain nombre de plugin son dispo, 1 par catégorie, soit:

  • Moteur de copie de fichier local dérivé d’ultracopier 0.2
  • Langue: englais / francais traduction trés partielle
  • Listener pour attendre et écouter dans un protocole spécifique pour qu’on lui transmette les copies, içi le protocole catchcopy v0002
  • Un plugin loader de teste pour charger si besoin un plugin dans l’explorateur
  • Un session loader de teste pour chargé au démarage de la session ultracopier
  • Et le théme oxygen qui reprends les grands trai d’ultracopier 0.2

Je n’est pas encore fait le support des plugins statique.

Si vous voulez tester cette version contactez moins. Une fois ces trais fini je pense m’attaquer au autre modules, ceux simple puis ceux plus lourd (moteur de copie en rsync, KIO pour KDE, téléchargement de site web, …)

Si vous étes intéressé pour un plugin en particulier faite le moi savoir.

Avancement d’ultracopier 0.3

Bonjour, bonne nouvelle, voila plus de fan art, des avancements sur Ultracopier, sur le code et ce la définition de ce qui doit être codé.

ultracopier baterie




J’espère que vous les trouvez bien.

Coté fonctionnalité je pense asyncroniser le chargement des plugins et l’accé au hdd pour booster le lancement et la réactivité d’ultracopier.

L’interception au démarage est faite, j’ai fait le plugin coté ultracopier pour l’écoute sur le socket pour faire le server catchcopy en version 0002, mais il reste encore des bugs. Pour l’interception dans l’explorateur windows c’est pas encore commencer, mais vu que c’est un plugin, je le ferai surment sur la fin.

J’ai corrigé des bugs dans l’API catchcopy, il reste surment encore des bugs. Avant ont pouvais voir ordre par clients, hors certain (comme pour le plugin d’ultracopier) veulent juste les copies/déplacements indifféremment des clients, j’ai donc coder un bout qui permet de faire ça simplement, au final le plugin fait 10 lignes de code.

J’ai mit en ligne un nouvel exemple et api d’ultracopier pour un plugin d’écoute (listener): http://forum-ultracopier.first-world.info/technicals-documents/test-model-plugin-t238.html Qui permet d’attendre un copie sous une autre forme (tcp, ipc + shared mem -> pour utilisé l’interception d’autre logiciel de copie, … tout ce qu’on peu imaginer). Tout peu envoyer une copie à condition d’avoir le plugin compatible en face. Je pense que ça peu être très utile dans certain cas.

Ultracopier, session unique et 1ere type de plugin supporté

Ultracopier as maintenant une instance lancé par session, j’ai fini un plugins de teste qui fait le support du lancement au chargement de la session d’ultracopier et le chargement dans ultracopier de ce type de plugins. Je me demande si je vais mettre un splash screen ou non.

Je pense m’attaquer au « Listener »+ »PluginLoader » qui forme le nouveau couple d’interception de copy avec le projet catchcopy. Le support de la ligne commande est prévu pour cette version aussi mais pas encore implémenté.

N’oubliez pas que le projet recherche des gens motivés pour faire des taches multiples (traduction, correction, avis sur le code, organisation, promotion du projet, …) et les dons pour sortir officiellement la version 0.3.

OptionEngine et QtScript

EngineOption liens avec le QtScript et le fichier ui
EngineOption liens avec le QtScript et le fichier ui

Voila comment je pense m’organisé pour que les options dynamique soit vérifié et interfacé dans le pannel d’options.

  1. Ultracopier charge l’interface
  2. Ultracopier appelle la fonction qui as en paramètre l’interface et les variables
  3. Le plugin connecte les changements des boutons à son signales de maj des données
  4. Ultracopier demande une information précise
  5. Le script extrait l’information demandé (4) de l’interface et l’envoie à ultracopier