Хочу узнать, будет ли сильная нагрузка на карту, если каждые 0.3 сек. сортируется 4 "двумерных" массива.
Сортируется таким образом: Для каждого играющего игрока в 4 "двумерных" массивах сортируется 20 элементов по строке. Всего может быть 10 игроков.
    private function SortForPlayer_playerIHPR takes integer playerId returns nothing
        local integer i = 1
        local integer j
        local real buf
        loop
            exitwhen i > lineIHPR
            set j = i + 1
            loop
                exitwhen j > lineIHPR
                if playerIHPR[playerId * columnIHPR + i] < playerIHPR[playerId * columnIHPR + j] then
                    set buf = playerIHPR[playerId * columnIHPR + i]
                    set playerIHPR[playerId * columnIHPR + i] = playerIHPR[playerId * columnIHPR + j]
                    set playerIHPR[playerId * columnIHPR + j] = buf
                endif
                set j = j + 1
            endloop
            set i = i + 1
        endloop
    endfunction
Кто может посоветовать более оптимизированный метод сортировки?
Полный говнокод, кому интересно:
Systems Func
library SystemsFunc initializer sfInit
    
    globals
        
        private real array reducingEff //Уменьшение эффекта от их количества
        
/*-------------------Увеличение базовой регенерации маны, общей регенерации маны, уменьшение общей регенерации маны-------------------------------------------*/
        //IBMPR\\
        private real array playerIBMPR
        private constant integer lineIBMPR = 12
        private constant integer columnIBMPR = 20
        //\\
        
        //IMPR\\
        private real array playerIMPR
        private constant integer lineIMPR = 12
        private constant integer columnIMPR = 20
        //\\
        
        //DMPR\\
        private real array playerDMPR
        private constant integer lineDMPR = 12
        private constant integer columnDMPR = 20
        //\\  
/*------------------------------------------------------------------------------------------------------------------------------------------------------------*/


/*-------------------Увеличение базовой регенерации здоровья, общей регенерации здоровья, уменьшение общей регенерации здоровья-------------------------------*/
        //IBHPR\\
        private real array playerIBHPR
        private constant integer lineIBHPR = 12
        private constant integer columnIBHPR = 20
        //\\
        
        //IHPR\\
        private real array playerIHPR
        private constant integer lineIHPR = 12
        private constant integer columnIHPR = 20
        //\\
        
        //DHPR\\
        private real array playerDHPR
        private constant integer lineDHPR = 12
        private constant integer columnDHPR = 20
        //\\  
/*------------------------------------------------------------------------------------------------------------------------------------------------------------*/
    endglobals 


/*-------------------Увеличение базовой регенерации маны, общей регенерации маны, уменьшение общей регенерации маны-------------------------------------------*/
    //IBMPR\\
    private function SortForPlayer_playerIBMPR takes integer playerId returns nothing
        local integer i = 1
        local integer j
        local real buf
        loop
            exitwhen i > lineIBMPR
            set j = i + 1
            loop
                exitwhen j > lineIBMPR
                if playerIBMPR[playerId * columnIBMPR + i] < playerIBMPR[playerId * columnIBMPR + j] then
                    set buf = playerIBMPR[playerId * columnIBMPR + i]
                    set playerIBMPR[playerId * columnIBMPR + i] = playerIBMPR[playerId * columnIBMPR + j]
                    set playerIBMPR[playerId * columnIBMPR + j] = buf
                endif
                set j = j + 1
            endloop
            set i = i + 1
        endloop
    endfunction
   
    function AddPlayerBasicIncMpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIBMPR
                if playerIBMPR[playerId * columnIBMPR + i] == 0 then
                    set playerIBMPR[playerId * columnIBMPR + i] = value
                    call SortForPlayer_playerIBMPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Массив playerIBMPR заполнен.")
        return
    endfunction
    
    function DelPlayerBasicIncMpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIBMPR
                if playerIBMPR[playerId * columnIBMPR + i] == value then
                    set playerIBMPR[playerId * columnIBMPR + i] = 0
                    call SortForPlayer_playerIBMPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Удаляемое значение для playerIBMPR неверно.")
        return
    endfunction
    
    function GetPlayerBasicIncMpRegen takes integer playerId returns real
        local integer i = 1
        local integer iEnd = 10
        local real r = 1.00
        call SortForPlayer_playerIBMPR(playerId)
        loop
            exitwhen i > iEnd
                set r = r + playerIBMPR[playerId * columnIBMPR + i] * reducingEff[i]
            set i = i + 1
        endloop
        return r
    endfunction
    //\\
    
    //IMPR\\
    private function SortForPlayer_playerIMPR takes integer playerId returns nothing
        local integer i = 1
        local integer j
        local real buf
        loop
            exitwhen i > lineIMPR
            set j = i + 1
            loop
                exitwhen j > lineIMPR
                if playerIMPR[playerId * columnIMPR + i] < playerIMPR[playerId * columnIMPR + j] then
                    set buf = playerIMPR[playerId * columnIMPR + i]
                    set playerIMPR[playerId * columnIMPR + i] = playerIMPR[playerId * columnIMPR + j]
                    set playerIMPR[playerId * columnIMPR + j] = buf
                endif
                set j = j + 1
            endloop
            set i = i + 1
        endloop
    endfunction
   
    function AddPlayerIncMpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIMPR
                if playerIMPR[playerId * columnIMPR + i] == 0 then
                    set playerIMPR[playerId * columnIMPR + i] = value
                    call SortForPlayer_playerIMPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Массив playerIMPR заполнен.")
        return
    endfunction
    
    function DelPlayerIncMpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIMPR
                if playerIMPR[playerId * columnIMPR + i] == value then
                    set playerIMPR[playerId * columnIMPR + i] = 0
                    call SortForPlayer_playerIMPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Удаляемое значение для playerIMPR неверно.")
        return
    endfunction
    
    function GetPlayerIncMpRegen takes integer playerId returns real
        local integer i = 1
        local integer iEnd = 10
        local real r = 1.00
        call SortForPlayer_playerIMPR(playerId)
        loop
            exitwhen i > iEnd
                set r = r + playerIMPR[playerId * columnIMPR + i] * reducingEff[i]
            set i = i + 1
        endloop
        return r
    endfunction
    //\\

    //DMPR\\
    function AddPlayerDecMpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        set value = 1 - value
        loop
            exitwhen i > columnDMPR
                if playerDMPR[playerId * columnDMPR + i] == 1.00 then
                    set playerIMPR[playerId * columnIMPR + i] = value
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Массив playerDMPR заполнен.")
        return
    endfunction
    
    function DelPlayerDecMpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        set value = 1 - value
        loop
            exitwhen i > columnDMPR
                if playerDMPR[playerId * columnDMPR + i] == value then
                    set playerDMPR[playerId * columnDMPR + i] = 1.00
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Удаляемое значение для playerDMPR неверно.")
        return
    endfunction
    
    function GetPlayerDecMpRegen takes integer playerId returns real
        local integer i = 1
        local integer iEnd = 50
        local real r = 1.00
        loop
            exitwhen i > iEnd
                set r = r * playerDMPR[playerId * columnDMPR + i]
            set i = i + 1
        endloop
        return r
    endfunction
    //\\ 
/*------------------------------------------------------------------------------------------------------------------------------------------------------------*/

    
/*-------------------Увеличение базовой регенерации здоровья, общей регенерации здоровья, уменьшение общей регенерации здоровья-------------------------------*/
    //IBHPR\\
    private function SortForPlayer_playerIBHPR takes integer playerId returns nothing
        local integer i = 1
        local integer j
        local real buf
        loop
            exitwhen i > lineIBHPR
            set j = i + 1
            loop
                exitwhen j > lineIBHPR
                if playerIBHPR[playerId * columnIBHPR + i] < playerIBHPR[playerId * columnIBHPR + j] then
                    set buf = playerIBHPR[playerId * columnIBHPR + i]
                    set playerIBHPR[playerId * columnIBHPR + i] = playerIBHPR[playerId * columnIBHPR + j]
                    set playerIBHPR[playerId * columnIBHPR + j] = buf
                endif
                set j = j + 1
            endloop
            set i = i + 1
        endloop
    endfunction
   
    function AddPlayerBasicIncHpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIBHPR
                if playerIBHPR[playerId * columnIBHPR + i] == 0 then
                    set playerIBHPR[playerId * columnIBHPR + i] = value
                    call SortForPlayer_playerIBHPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Массив playerIBHPR заполнен.")
        return
    endfunction
    
    function DelPlayerBasicIncHpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIBHPR
                if playerIBHPR[playerId * columnIBHPR + i] == value then
                    set playerIBHPR[playerId * columnIBHPR + i] = 0
                    call SortForPlayer_playerIBHPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Удаляемое значение для playerIBHPR неверно.")
        return
    endfunction
    
    function GetPlayerBasicIncHpRegen takes integer playerId returns real
        local integer i = 1
        local integer iEnd = 10
        local real r = 1.00
        call SortForPlayer_playerIBHPR(playerId)
        loop
            exitwhen i > iEnd
                set r = r + playerIBHPR[playerId * columnIBHPR + i] * reducingEff[i]
            set i = i + 1
        endloop
        return r
    endfunction
    //\\
    
    //IHPR\\
    private function SortForPlayer_playerIHPR takes integer playerId returns nothing
        local integer i = 1
        local integer j
        local real buf
        loop
            exitwhen i > lineIHPR
            set j = i + 1
            loop
                exitwhen j > lineIHPR
                if playerIHPR[playerId * columnIHPR + i] < playerIHPR[playerId * columnIHPR + j] then
                    set buf = playerIHPR[playerId * columnIHPR + i]
                    set playerIHPR[playerId * columnIHPR + i] = playerIHPR[playerId * columnIHPR + j]
                    set playerIHPR[playerId * columnIHPR + j] = buf
                endif
                set j = j + 1
            endloop
            set i = i + 1
        endloop
    endfunction
   
    function AddPlayerIncHpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIHPR
                if playerIHPR[playerId * columnIHPR + i] == 0 then
                    set playerIHPR[playerId * columnIHPR + i] = value
                    call SortForPlayer_playerIHPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Массив playerIHPR заполнен.")
        return
    endfunction
    
    function DelPlayerIncHpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        loop
            exitwhen i > columnIHPR
                if playerIHPR[playerId * columnIHPR + i] == value then
                    set playerIHPR[playerId * columnIHPR + i] = 0
                    call SortForPlayer_playerIHPR(playerId)
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Удаляемое значение для playerIHPR неверно.")
        return
    endfunction
    
    function GetPlayerIncHpRegen takes integer playerId returns real
        local integer i = 1
        local integer iEnd = 10
        local real r = 1.00
        call SortForPlayer_playerIHPR(playerId)
        //call dbgT(R2S(playerIHPR[playerId * columnIHPR + 1]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 2]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 3]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 4]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 5]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 6]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 7]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 8]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 9]) + "|" + R2S(playerIHPR[playerId * columnIHPR + 10]) )
        loop
            exitwhen i > iEnd
                set r = r + playerIHPR[playerId * columnIHPR + i] * reducingEff[i]
            set i = i + 1
        endloop
        return r
    endfunction
    //\\

    //DHPR\\
    function AddPlayerDecHpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        set value = 1 - value
        loop
            exitwhen i > columnDHPR
                if playerDHPR[playerId * columnDHPR + i] == 1.00 then
                    set playerIHPR[playerId * columnIHPR + i] = value
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Массив playerDHPR заполнен.")
        return
    endfunction
    
    function DelPlayerDecHpRegen takes integer playerId, real value returns nothing
        local integer i = 1
        set value = 1 - value
        loop
            exitwhen i > columnDHPR
                if playerDHPR[playerId * columnDHPR + i] == value then
                    set playerDHPR[playerId * columnDHPR + i] = 1.00
                    return
                endif
            set i = i + 1
        endloop
        call BJDebugMsg("Ошибка: Удаляемое значение для playerDHPR неверно.")
        return
    endfunction
    
    function GetPlayerDecHpRegen takes integer playerId returns real
        local integer i = 1
        local integer iEnd = 50
        local real r = 1.00
        loop
            exitwhen i > iEnd
                set r = r * playerDHPR[playerId * columnDHPR + i]
            set i = i + 1
        endloop
        return r
    endfunction
    //\\ 
/*------------------------------------------------------------------------------------------------------------------------------------------------------------*/

    //Инициализация
    private function sfInit takes nothing returns nothing
        local integer i
        local integer j
        
        set i = 1
        loop
            exitwhen i > lineDHPR
            set j = 1
            loop
                exitwhen j > columnDHPR
                set playerDHPR[i * columnDHPR + j] = 1.00
                set j = j + 1
            endloop
            set i = i + 1
        endloop
        
        set i = 1
        loop
            exitwhen i > lineDMPR
            set j = 1
            loop
                exitwhen j > columnDMPR
                set playerDMPR[i * columnDMPR + j] = 1.00
                set j = j + 1
            endloop
            set i = i + 1
        endloop
        
        set reducingEff[1] = 1.00
        set reducingEff[2] = 0.75
        set reducingEff[3] = 0.56
        set reducingEff[4] = 0.42
        set reducingEff[5] = 0.32
        set reducingEff[6] = 0.24
        set reducingEff[7] = 0.18
        set reducingEff[8] = 0.13
        set reducingEff[9] = 0.10
        set reducingEff[10] = 0.08
    endfunction
    
endlibrary
HPRegeneration
library HPRegeneration initializer hprInit uses SystemsFunc

    globals
        private real array playerHPR
        private constant real perStr = 0.1
        private constant real basicHPR = 0.00
        private constant real periodHPR = 0.3
    endglobals
    
    function GetPlayerBasicHpRegen takes integer playerId returns real
        return GetHeroStr(playerHero[playerId], true) * perStr + basicHPR
    endfunction
   
    function GetPlayerHpRegen takes integer playerId returns real
        return playerHPR[playerId]
    endfunction
   
    function AddPlayerHpRegen takes integer playerId, real value returns nothing
        set playerHPR[playerId] = playerHPR[playerId] + value
    endfunction
    
    function DelPlayerHpRegen takes integer playerId, real value returns nothing
        set playerHPR[playerId] = playerHPR[playerId] - value
    endfunction
    
    private function hprAction takes nothing returns nothing
        local real AddHP
        local integer pId
        local integer i
        local integer iEnd
        set i = 1
        set iEnd = players
        loop
            exitwhen i > iEnd
            set pId = GetPlayerNumber(i)
            set AddHP = (GetPlayerBasicHpRegen(pId) * GetPlayerBasicIncHpRegen(pId) + GetPlayerHpRegen(pId)) * GetPlayerIncHpRegen(pId) * GetPlayerDecHpRegen(pId)
            set AddHP = AddHP * periodHPR
            call SetUnitState(playerHero[pId], UNIT_STATE_LIFE, GetUnitState(playerHero[pId], UNIT_STATE_LIFE) + AddHP)
            set i = i + 1
        endloop
        
    endfunction
    
    private function hprInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterTimerEvent(t, periodHPR, true)
        call TriggerAddAction(t, function hprAction)
        set t = null
    endfunction
    
endlibrary
MPRegeneration
library MPRegeneration initializer mprInit uses SystemsFunc

    globals
        private real array playerMPR
        private constant real perInt = 0.05
        private constant real basicMPR = 0.00
        private constant real periodMPR = 0.3
    endglobals
    
    function GetPlayerBasicMpRegen takes integer playerId returns real
        return GetHeroInt(playerHero[playerId], true) * perInt + basicMPR
    endfunction
   
    function GetPlayerMpRegen takes integer playerId returns real
        return playerMPR[playerId]
    endfunction
   
    function AddPlayerMpRegen takes integer playerId, real value returns nothing
        set playerMPR[playerId] = playerMPR[playerId] + value
    endfunction
    
    function DelPlayerMpRegen takes integer playerId, real value returns nothing
        set playerMPR[playerId] = playerMPR[playerId] - value
    endfunction
    
    private function mprAction takes nothing returns nothing
        local real AddMP
        local integer pId
        local integer i
        local integer iEnd
        set i = 1
        set iEnd = players
        loop
            exitwhen i > iEnd
            set pId = GetPlayerNumber(i)
            set AddMP = (GetPlayerBasicMpRegen(pId) * GetPlayerBasicIncMpRegen(pId) + GetPlayerMpRegen(pId)) * GetPlayerIncMpRegen(pId) * GetPlayerDecMpRegen(pId)
            set AddMP = AddMP * periodMPR
            call SetUnitState(playerHero[pId], UNIT_STATE_MANA, GetUnitState(playerHero[pId], UNIT_STATE_MANA) + AddMP)
            set i = i + 1
        endloop
        
    endfunction
    
    private function mprInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        call TriggerRegisterTimerEvent(t, periodMPR, true)
        call TriggerAddAction(t, function mprAction)
        set t = null
    endfunction
    
endlibrary

Принятый ответ

Всё ок будет, главное оп лимит учесть.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
3 года назад
0
Morningstar, я уже устал от костылей, это система прекрасно работает. Полностью триггерный реген маны, хп. Также сделаю и увеличение маг. урона и другие прикольные свойства.

Тем более мне нужны, чтоб увеличение работало на предметные свойства и т.д

Да и в системе все баффы стакаются т.к мне нужно

map_maiker, То что хочу, уже сделал.

оп лимит
Ты о чем?

rsfghd, операций не много, лимит потока не будет превышен.

сорт четырех двумерных массивов для КАЖДОГО игрока
массивов не 4*12, а 4, сортируется 20 элементов для каждого игрока.
0
27
3 года назад
0
KaneThaumaturge, ну если максимум игроков 10, то 4*20*10=800 элементов каждые 0.3 сек?
0
19
3 года назад
0
rsfghd, да
3
28
3 года назад
3
Всё ок будет, главное оп лимит учесть.
Принятый ответ
0
27
3 года назад
0
KaneThaumaturge, ну так оп лимит на 1.26 в районе 700-800~, я не помню точно
1
20
3 года назад
Отредактирован biridius
1
70к там, на 700 операций далеко не уедешь
по теме не должно ничего лагать если там тупо сравнения-присвоения без всяких вейтов и созданий юнитов, хоть сто раз в сек делайте
0
19
3 года назад
0
biridius, PT153, Спасибо.
1
9
3 года назад
1
Загуглить методы сортировок слишком сложно?
0
19
3 года назад
0
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.