IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Free Pascal Discussion :

Type de donnée pour un taux, mémoire et performances


Sujet :

Free Pascal

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut Type de donnée pour un taux, mémoire et performances
    Bonjour,

    Je développe un jeu en Free Pascal. Je vais stocker de très nombreuses données qui correspondent à des taux (pourcentage). Vaut-il mieux :
    1. Créer un type intervalle TPercent : 0..100 et effectuer le calcul MaVar * (1 + Taux / 100) à chaque fois ?
    2. Stocker les données sous forme de Single (0.05 pour 5%), ce qui évite une opération mais utilise plus de place en mémoire ?

  2. #2
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    en effet le type single est 32bit donc prend 4octets en memoire (de masse ou vive).

    ne divise pas par 100, multiplie par 0.01! une mutiplication est plus performante qu'une division, surtout si tu compte en faire beaucoup.

    ne crée pas un type interval 0..100 utilise le type byte ou UInt8 (identique)
    ou encore un Word ou SmallInt pour avoir des taux supérieur à 100 ou inférieur à 0.

    ce qui donne :

    MaVar * (Taux*0.01)




    par exemple si tu veux 60% de la force d'attaque d'une épée, donc subissant un malus de 40% des dégats finaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FinalDmg := round(Sword.Attack * (Malus.Sword.Huge * 0.01));
    ou Malus.Sword.Huge = 60 (60% donc 40% de malus)
    modifier = 0.6

    autre exemple avec un bonus à la défense de 70%! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FinalDef := round(Armor.Defence * (Bonus.Armor.Epic * 0.01);
    ou Bonus.Armor.Epic vaux 170 (170% donc 70% de bonus)
    modifier = 1.7

    et seulement à l'affichage du bonus ou du malus on convertira :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Caption := format('Malus attaque = %d%%', [100-Malus.Sword.Huge]); 
    // affiche : Malus attaque = 40%
     
    Caption := format('Bonus defense = %d%%', [100-Bonus.Armor.Epic]);
    // affiche : Bonus defense = 70%
    cela permet d'alleger considérablement les calculs OTF en RT durant les tours de jeu.


    et en utilisant une table de précalculs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    type
      TModifierBase = (
        mbBonus, mbMalus
      );
     
      TModifierClass = (
        mcSword, mcArmor, mcBow, mcStick, mcMagic
      );
     
      TModifierRange = (
        mrLow, mrNormal, mrMedium, mrHigh, mrHuge, mrEpic
      );
     
    const
      Modifiers : array[TModifierBase, TModifierClass, TModifierRange] of single = (
        {mbBonus}(
          {mcSword}(
            {mrLow} 1.02, {mrNormal} 1.05, {mrMedium} 1.10, {mrHigh} 1.20, {mrHuge} 1.30, {mrEpic} 1.45 ),
          {mcArmor}(
            {mrLow} 1.01, {mrNormal} 1.03, {mrMedium} 1.07, {mrHigh} 1.14, {mrHuge} 1.21, {mrEpic} 1.31 ),
          {mcBow}(
            {mrLow} 1.02, {mrNormal} 1.04, {mrMedium} 1.09, {mrHigh} 1.18, {mrHuge} 1.27, {mrEpic} 1.41 ),
          {mcStick}(
            {mrLow} 1.01, {mrNormal} 1.04, {mrMedium} 1.08, {mrHigh} 1.16, {mrHuge} 1.24, {mrEpic} 1.36 ),
          {mcMagic}(
            {mrLow} 1.03, {mrNormal} 1.06, {mrMedium} 1.11, {mrHigh} 1.22, {mrHuge} 1.33, {mrEpic} 1.50 )
        ),
        {mbMalus}(
          {mcSword}(
            {mrLow} 0.98, {mrNormal} 0.95, {mrMedium} 0.90, {mrHigh} 0.80, {mrHuge} 0.70, {mrEpic} 0.55 ),
          {mcArmor}(
            {mrLow} 0.99, {mrNormal} 0.97, {mrMedium} 0.93, {mrHigh} 0.86, {mrHuge} 0.79, {mrEpic} 0.69 ),
          {mcBow}(
            {mrLow} 0.98, {mrNormal} 0.96, {mrMedium} 0.91, {mrHigh} 0.82, {mrHuge} 0.73, {mrEpic} 0.59 ),
          {mcStick}(
            {mrLow} 0.99, {mrNormal} 0.96, {mrMedium} 0.92, {mrHigh} 0.84, {mrHuge} 0.76, {mrEpic} 0.64 ),
          {mcMagic}(
            {mrLow} 0.97, {mrNormal} 0.94, {mrMedium} 0.89, {mrHigh} 0.78, {mrHuge} 0.67, {mrEpic} 0.50 )
        )
      );
    et pour avoir un modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVarFinal := round(MaVar * Modifier[Effect.ModifierBase, Effect.ModifierClass, Effect.ModifierRange]);
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

Discussions similaires

  1. type de donnée pour un fichier binaire.
    Par cbleas dans le forum Modélisation
    Réponses: 9
    Dernier message: 14/01/2009, 21h26
  2. quel type de donnée pour un champs de ma table ?
    Par nabians dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 04/08/2007, 21h33
  3. type de donnée pour inserer l'adresse mail
    Par otari dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/06/2007, 13h30
  4. Meilleur type de données pour un prix
    Par linar009 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/08/2006, 14h41
  5. Type de données pour effectuer une différence en vba
    Par snoopy69 dans le forum Access
    Réponses: 4
    Dernier message: 03/03/2006, 07h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo