Добавлен KaneThaumaturge
Хочу узнать, будет ли сильная нагрузка на карту, если каждые 0.3 сек. сортируется 4 "двумерных" массива.
Сортируется таким образом: Для каждого играющего игрока в 4 "двумерных" массивах сортируется 20 элементов по строке. Всего может быть 10 игроков.
Сортируется таким образом: Для каждого играющего игрока в 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
Принятый ответ
Всё ок будет, главное оп лимит учесть.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован biridius
по теме не должно ничего лагать если там тупо сравнения-присвоения без всяких вейтов и созданий юнитов, хоть сто раз в сек делайте