Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=063b439518b3fb898b59e2cdcd8c2433Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Problème de lag à cause des effets spéciaux

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand décorateur (Quantité : 2)

MessagePosté le: 16/05/12 15:34    Sujet du message: Problème de lag à cause des effets spéciaux Citer

Salut, j'essaye de créer un sort qui invoque un cercle constitué de plusieurs effets spéciaux. Ces effets subissent également une rotation pour fermer le cercle et d'autres forment une spirale vers l'intérieur du cercle.

J'ai 2 types d'effets différents, une boule et une traînée (feu du phénix). Ces 2 effets sont superposés.
Mon problème vient lorsque le nombre d'effet est supérieur à 1 (1 boule + 1 traînée). Warcraft freeze et je dois fermer.

Le problème est le même si je ne met pas le feu du phoenix.

Donc est-ce que vous auriez des conseils pour m'aider à améliorer le code et gagner en performance? Je pense que le problème vient d'une boucle dans une fonction qui se répète (timer).
Merci

Secret:

Jass:
library SolarCrown requires xefx, TimerUtils, GroupUtils, xedamage
//===============================================================================================
//===============================================================================================
//===============================================================================================
    globals
        private constant integer SPELL_ID = 'A017'
        private constant integer N_BOLT = 1 //Nombre d'effets qui forment le cercle
        private constant real FX_SCALE_BOLT_INIT = 1.
        private constant real FX_SCALE_BOLT_INC = 0.1
        private constant real FX_SCALE_RAY = 1.
        private constant integer RED = 255 //vertex coloring in RGB
        private constant integer GREEN = 255
        private constant integer BLUE = 255
        private constant integer ALPHA = 200
        private constant string FX_BOLT = "Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl"
        private constant string FX_RAY = "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl"
        private constant string ORDER_ID = "channel"
    endglobals
   
    private constant function GetDamages takes integer lvl returns integer
        return lvl * 10 * 2 + 10
    endfunction
   
    private constant function Waves takes integer lvl returns integer
        return lvl * 3
    endfunction

    private constant function GetSpeed takes integer lvl returns real
        return 2.
    endfunction
   
    private constant function GetSpiral takes integer lvl returns real
        return 10.
    endfunction
   
    private constant function GetAoE takes integer lvl returns real
        return 200. + 25. * lvl
    endfunction
   
    private function DamageOptions takes xedamage spellDamage returns nothing
        set spellDamage.dtype = DAMAGE_TYPE_UNIVERSAL
        set spellDamage.atype = ATTACK_TYPE_NORMAL
        set spellDamage.exception = UNIT_TYPE_STRUCTURE
        set spellDamage.visibleOnly = true
        set spellDamage.damageSelf = true
        set spellDamage.damageAllies = true
        set spellDamage.allyfactor = -1.0
    endfunction
   
    private function IsValidTarget takes unit u returns boolean
        return not IsUnitType(u, UNIT_TYPE_DEAD) and not IsUnitType(u, UNIT_TYPE_MAGIC_IMMUNE) and not IsUnitType(u, UNIT_TYPE_FLYING) and not IsUnitType(u, UNIT_TYPE_MECHANICAL)and not IsUnitType(u, UNIT_TYPE_STRUCTURE) and not IsUnitAlly(u,GetOwningPlayer(GetTriggerUnit()))==true
    endfunction
//===============================================================================================
//===============================================================================================
//===============================================================================================
    globals
        private xedamage xed
    endglobals
   
    private struct Data
        timer t
        unit c
        real sx
        real sy
        xefx array fx_bolt[N_BOLT]
        xefx array fx_ray[N_BOLT]
        xefx array fx_ray_2[N_BOLT]
        xefx array fx_bolt_2[N_BOLT]
        real ex
        real ey
        integer lvl
        real duration = 0.00
        private static thistype temp
    //Creation du cercle
        static method Create takes unit caster, real x, real y returns thistype
            local thistype this = thistype.allocate()
            local integer i = 1
            local real a = (GetUnitFacing(caster) + 360 / N_BOLT + 90) * bj_DEGTORAD
           
            set .c = caster
            set .sx = x
            set .sy = y
            set .t = NewTimer()
            set .lvl = GetUnitAbilityLevel(.c, SPELL_ID)
            call BJDebugMsg(R2S(.sx))
            call BJDebugMsg(R2S(x))

            loop
                set .ex = .sx + GetAoE(.lvl) * Cos(a)
                set .ey =  .sy + GetAoE(.lvl) * Sin(a)
                set .fx_bolt[i] = xefx.create(.ex, .ey, a + bj_PI / 2 )
                set .fx_bolt[i].fxpath = FX_BOLT
                set .fx_bolt[i].scale = FX_SCALE_BOLT_INIT
                set .fx_bolt[i].z = 60.
                call .fx_bolt[i].recolor(RED, GREEN, BLUE, ALPHA)
//                set .fx_bolt_2[i] = xefx.create(.ex, .ey, a + bj_PI / 2 )
//                set .fx_bolt_2[i].fxpath = FX_BOLT
//                set .fx_bolt_2[i].scale = FX_SCALE_BOLT_INIT
//                set .fx_bolt_2[i].z = 60.
//                call .fx_bolt_2[i].recolor(RED, GREEN, BLUE, ALPHA)
                set .fx_ray[i] = xefx.create(.ex, .ey, a + bj_PI / 2 )
                set .fx_ray[i].fxpath = FX_RAY
                set .fx_ray[i].scale = FX_SCALE_RAY
                set .fx_ray[i].z = 60.
                call .fx_ray[i].recolor(RED, GREEN, BLUE, ALPHA)
//                set .fx_ray_2[i] = xefx.create(.ex, .ey, a + bj_PI / 2 )
//                set .fx_ray_2[i].fxpath = FX_RAY
//                set .fx_ray_2[i].scale = FX_SCALE_RAY
//                set .fx_ray_2[i].z = 60.
//                call .fx_ray_2[i].recolor(RED, GREEN, BLUE, ALPHA)
                set a = a + (2 * bj_PI / N_BOLT)
                set i = i + 1
            exitwhen i >= N_BOLT
            endloop
           
            call SetTimerData(.t, this)
            call TimerStart(.t, XE_ANIMATION_PERIOD, true, function thistype.onMove)
       
        return this
        endmethod
    //Rotation des FX
        static method onMove takes nothing returns nothing
            local thistype this = thistype(GetTimerData(GetExpiredTimer()))
            local integer i = 1
            local unit u = null
           
            local real x
            local real y
            local real distance
           
            set temp = this
           
            loop
                set x = .sx - .fx_bolt_2[i].x
                set y = .sy - .fx_bolt_2[i].y
                set distance = SquareRoot(x*x + y*y)
               
                    set .fx_bolt[i].xyangle = .fx_bolt[i].xyangle + GetSpeed(.lvl)
                    set .fx_bolt[i].x = .sx + GetAoE(.lvl) * Cos(.fx_bolt[i].xyangle - bj_PI / 2)
                    set .fx_bolt[i].y = .sy + GetAoE(.lvl) * Sin(.fx_bolt[i].xyangle - bj_PI / 2)
                    set .fx_ray[i].xyangle = .fx_ray[i].xyangle + GetSpeed(.lvl)
                    set .fx_ray[i].x = .sx + GetAoE(.lvl) * Cos(.fx_ray[i].xyangle - bj_PI / 2)
                    set .fx_ray[i].y = .sy + GetAoE(.lvl) * Sin(.fx_ray[i].xyangle - bj_PI / 2)
           
            exitwhen i >= N_BOLT
            endloop
            set .duration = .duration + XE_ANIMATION_PERIOD
            if .duration >= 3.*2 or (GetUnitCurrentOrder(.c) != String2OrderIdBJ(ORDER_ID)) or GetWidgetLife(.c) <= 0.405 then
                call .destroy()
                call ReleaseTimer(GetExpiredTimer())
            endif
           
       
        endmethod
       
        private method onDestroy takes nothing returns nothing
            local integer i = 1
           
            loop
                call .fx_bolt[i].destroy()
                call .fx_bolt_2[i].destroy()
                call .fx_ray[i].destroy()
                call .fx_ray_2[i].destroy()
                set i = i + 1
            exitwhen i >= N_BOLT
            endloop
       
        endmethod

        static method Conditions takes nothing returns boolean
            local thistype this
            call BJDebugMsg&#40;I2S&#40;SPELL_ID))
            if GetSpellAbilityId&#40;) == SPELL_ID then
                set this = thistype.Create&#40;GetTriggerUnit&#40;), GetSpellTargetX&#40;), GetSpellTargetY&#40;))
                call BJDebugMsg&#40;R2S&#40;GetSpellTargetX&#40;)))
            endif
        return false
        endmethod
       
//===============================================================================================
        static method onInit takes nothing returns nothing
            local trigger SolarCrownTrg = CreateTrigger&#40;)
           
            call TriggerRegisterAnyUnitEventBJ&#40;SolarCrownTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
            call TriggerAddCondition&#40;SolarCrownTrg, Condition&#40;function thistype.Conditions))
           
        //preload
            set xed = xedamage.create&#40;)
            call DamageOptions&#40;xed)
            call XE_PreloadAbility&#40;SPELL_ID)
            call Preload&#40;FX_BOLT)
            call Preload&#40;FX_RAY)
            set SolarCrownTrg = null
        endmethod
    endstruct
endlibrary


_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7146
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 16/05/12 17:10    Sujet du message: Citer

Tu ne changes jamais la valeur de i dans cette loop :

Jass:
         loop
                set x = .sx - .fx_bolt_2[i].x
                set y = .sy - .fx_bolt_2[i].y
                set distance = SquareRoot(x*x + y*y)
               
                    set .fx_bolt[i].xyangle = .fx_bolt[i].xyangle + GetSpeed(.lvl)
                    set .fx_bolt[i].x = .sx + GetAoE(.lvl) * Cos(.fx_bolt[i].xyangle - bj_PI / 2)
                    set .fx_bolt[i].y = .sy + GetAoE(.lvl) * Sin(.fx_bolt[i].xyangle - bj_PI / 2)
                    set .fx_ray[i].xyangle = .fx_ray[i].xyangle + GetSpeed(.lvl)
                    set .fx_ray[i].x = .sx + GetAoE(.lvl) * Cos(.fx_ray[i].xyangle - bj_PI / 2)
                    set .fx_ray[i].y = .sy + GetAoE(.lvl) * Sin(.fx_ray[i].xyangle - bj_PI / 2)
           
            exitwhen i >= N_BOLT
            endloop


Ce qui provoque donc une seule itération de loop si N_BOLT <= 1 et un nombre "infini" (jusqu'à la limite d'opérations admises : limit op) si N_BOLT > 1.
Ceci explique cela.

A moins que tu utilises des struct qui extend d'autres struct, il vaut mieux simplement utiliser la method "destroy", en n'oubliant pas "deallocate" à l'intérieur de celle ci.
De même, utilise plutôt "create" avec "allocate", que "Create", car si tu ne le fais pas, la méthode create sera quand même crée, et donc augmentation de la taille du script de la map pour rien.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 16/05/12 22:45    Sujet du message: Citer

C'était bien ça merci. La prochaine fois, avant de douter des capacités de mon pc, je douterais des miennes Smile
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Troll-Brain
Ri1kamoua


Inscrit le: 23 Aoû 2007
Messages: 7146
Sujets: 147
Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance
Médailles: 2 (En savoir plus...)
Rédacteur de tuto #3 (Quantité : 1) Grand mage créateur de sort (Quantité : 1)

MessagePosté le: 17/05/12 12:20    Sujet du message: Citer

Sinon on a des "for loop" maintenant en vJass avec le jasshelper de Cohadar, ca t'éviterait ce genre d'erreur.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com