Сейчас 05:24:16 Понедельник, 25 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Оптимизация кода (cJass)
HexingДата: Понедельник, 27 Августа 2012, 15:46:02 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Собственно нужны предложения по улучшению быстродействия выполнения следующего кусочка кода:
Code
void UpdateHeroStats(int id)
{
     int itid
     int i = 0
     HeroesBonusDamage[id] = 0
     HeroesBonusAS[id] = 0.0
     itid = GetItemTypeId(HeroesItem1[id])-'I000'
     HeroesBonusDamage[id] += ItemDamage[itid]
     HeroesBonusAS[id] += ItemAS[itid]
     itid = GetItemTypeId(HeroesItem2[id])-'I000'
     HeroesBonusDamage[id] += ItemDamage[itid]
     HeroesBonusAS[id] += ItemAS[itid]
     itid = GetItemTypeId(HeroesItem3[id])-'I000'
     HeroesBonusDamage[id] += ItemDamage[itid]
     HeroesBonusAS[id] += ItemAS[itid]
     itid = GetItemTypeId(HeroesItem4[id])-'I000'
     HeroesBonusDamage[id] += ItemDamage[itid]
     HeroesBonusAS[id] += ItemAS[itid]
     itid = GetItemTypeId(HeroesItem5[id])-'I000'
     HeroesBonusDamage[id] += ItemDamage[itid]
     HeroesBonusAS[id] += ItemAS[itid]
     itid = GetItemTypeId(HeroesItem6[id])-'I000'
     HeroesBonusDamage[id] += ItemDamage[itid]
     HeroesBonusAS[id] += ItemAS[itid]
     loop
     {
         UnitRemoveAbility(Heroes[id], 'A00J'-i)
         exitwhen(i == 10)
         i++
     }
     i = 0
     int j = 1024
     loop
     {
         if(HeroesBonusDamage[id] >= j)
         {
             UnitAddAbility(Heroes[id], 'A00J'-i)
             HeroesBonusDamage[id]-=j
         }
         exitwhen(i == 10)
         i++
         j = j/2
     }
     i=0
     loop
     {
         UnitRemoveAbility(Heroes[id], 'A008'-i)
         exitwhen(i == 8)
         i++
     }
     i=0
     real k = 2.56
     loop
     {
         if(HeroesBonusAS[id] >= k)
         {
             UnitAddAbility(Heroes[id], 'A008'-i)
             HeroesBonusAS[id]-=k
         }
         i++
         k = k/2
     }
}

собственно из названий переменных всё понятно, HeroesItem1..6 - 6 предметов(шлем...оружие), если одеты, то это item, если нет - null
предметы зарегестрированы в базу таким образом, что в массивы ItemAS/ItemDamage записываются их урон/+ к скорости атаки в ячейку, равную номеру предмету(ItemId - 'I000') в Р.О.
на счёт абилок в циклах:

это триггерное изменение + к урону и скорости атаки
глобалки не предлагать, кое кто очень умный часто намекает на их медлительность относительно локалок
HeroesBonusDamage - int array
HeroesBonusAS - real array

ух чуть не забыл, передаваемый аргумент id - номер игрока владельца героя, Heroes - массив героев, у каждого игрока по 1му герою
соответственно Heroes[0] - герой первого игрока
эта функция вызывается при подборе предмета, в случаях если инвентарь изменился, лаг происходит именно в этой функции

Добавлено (27 Августа 2012, 15:46:02)
---------------------------------------------
ой, это из-за первого получения абилок, глобалки локалками заменил

клоуз fie


 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz