XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Myth
The Temple
offline
Опыт: 19,141
Активность:
заменил бж функцию MultiboardSetItemValueBJ...
утечек стало в разы меньше.
такой теперь вопрос:
какие функции работы с mb ещё вызывают утечки?
и на какие нативки их можно заменить?
Myth добавил:
я так понимаю что функции
set text color и set icon?
Старый 04.03.2011, 21:08
Hanabishi
COOL STATUS
offline
Опыт: отключен
Myth, все, которые как-либо затрагивают элементы
нативки те же, только без окончания БЖ, но в них нельзя ставить 0, для влияния на все строки/столбцы
Старый 04.03.2011, 22:10
Скайнет
Kicked by ZlaYa1000
offline
Опыт: 8,234
Активность:
Myth, везде, где есть mbitem. а где он есть - нужно смотреть в начинку бж функции
Старый 04.03.2011, 22:51
Myth
The Temple
offline
Опыт: 19,141
Активность:
и последний вопрос:
я все не могу понять как открыть "начинку" бж функции?
Старый 05.03.2011, 08:23
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
Myth, вытащи из архива war3patch.mpq файл scripts\blizzard.j и ищи там.
Ну а если стоит JNGP то проблем быть не должно. Ctrl+клик на функцию и всё.
Старый 05.03.2011, 08:30
Myth
The Temple
offline
Опыт: 19,141
Активность:
а функцию нельзя там же и переписать?
или придётся полюбому писать отдельно и вызывать вместо стандартной?
я имею ввиду переписать только в рамках карты.
Старый 05.03.2011, 14:27
Hanabishi
COOL STATUS
offline
Опыт: отключен
Myth, блин, модифицируй функцию и толкай в нестандартный код (только имя измени)
я тоже кстати их изменял в одной своей карте, вот код:
//оптимизированные функции работы с мультибордами
function MultiboardSetItemValueNorm takes multiboard mb, integer col, integer row, string val returns nothing
    local integer curRow = 0
    local integer curCol = 0
    local integer numRows = MultiboardGetRowCount(mb)
    local integer numCols = MultiboardGetColumnCount(mb)
    local multiboarditem mbitem = null
    loop
        set curRow = curRow+1
        exitwhen curRow>numRows
        if (row==0 or row==curRow) then
            set curCol = 0
            loop
                set curCol = curCol+1
                exitwhen curCol>numCols
                if (col==0 or col==curCol) then
                    set mbitem = MultiboardGetItem(mb, curRow-1, curCol-1)
                    call MultiboardSetItemValue(mbitem, val)
                    call MultiboardReleaseItem(mbitem)
                endif
            endloop
        endif
    endloop
    set mbitem = null //этот параметр забыли обнулять в стандартных, а память он засоряет
    set mb = null
endfunction

function MultiboardSetItemIconNorm takes multiboard mb, integer col, integer row, string iconFileName returns nothing
    local integer curRow = 0
    local integer curCol = 0
    local integer numRows = MultiboardGetRowCount(mb)
    local integer numCols = MultiboardGetColumnCount(mb)
    local multiboarditem mbitem = null
    loop
        set curRow = curRow+1
        exitwhen curRow>numRows
        if (row==0 or row==curRow) then
            set curCol = 0
            loop
                set curCol = curCol+1
                exitwhen curCol>numCols
                if (col==0 or col==curCol) then
                    set mbitem = MultiboardGetItem(mb, curRow-1, curCol-1)
                    call MultiboardSetItemIcon(mbitem, iconFileName)
                    call MultiboardReleaseItem(mbitem)
                endif
            endloop
        endif
    endloop
    set mbitem = null //<<<
    set mb = null
endfunction

function MultiboardSetItemWidthNorm takes multiboard mb, integer col, integer row, real width returns nothing
    local integer curRow = 0
    local integer curCol = 0
    local integer numRows = MultiboardGetRowCount(mb)
    local integer numCols = MultiboardGetColumnCount(mb)
    local multiboarditem mbitem = null
    loop
        set curRow = curRow+1
        exitwhen curRow>numRows
        if (row==0 or row==curRow) then
            set curCol = 0
            loop
                set curCol = curCol+1
                exitwhen curCol>numCols
                if (col==0 or col==curCol) then
                    set mbitem = MultiboardGetItem(mb, curRow-1, curCol-1)
                    call MultiboardSetItemWidth(mbitem, width/100.0)
                    call MultiboardReleaseItem(mbitem)
                endif
            endloop
        endif
    endloop
    set mbitem = null //<<<
    set mb = null
endfunction

function MultiboardSetItemStyleNorm takes multiboard mb, integer col, integer row, boolean showValue, boolean showIcon returns nothing
    local integer curRow = 0
    local integer curCol = 0
    local integer numRows = MultiboardGetRowCount(mb)
    local integer numCols = MultiboardGetColumnCount(mb)
    local multiboarditem mbitem = null
    loop
        set curRow = curRow+1
        exitwhen curRow>numRows
        if (row==0 or row==curRow) then
            set curCol = 0
            loop
                set curCol = curCol+1
                exitwhen curCol>numCols
                if (col==0 or col==curCol) then
                    set mbitem = MultiboardGetItem(mb, curRow-1, curCol-1)
                    call MultiboardSetItemStyle(mbitem, showValue, showIcon)
                    call MultiboardReleaseItem(mbitem)
                endif
            endloop
        endif
    endloop
    set mbitem = null //<<<
    set mb = null
endfunction
//конец функций работы с мультибордами
Hanabishi добавил:
только лишь добавить обнуление хендла итема
Старый 05.03.2011, 14:39
spellwerk

offline
Опыт: 4,869
Активность:
MultiboardReleaseItem решит все проблемы
Старый 05.03.2011, 14:45
Myth
The Temple
offline
Опыт: 19,141
Активность:
Hanabishi, понял что нестандартный код! хотелось решить красиво! )
только я так делаю:
((код jass
function MB_SetItemValue takes multiboard mb, integer col, integer row, string val returns nothing
local multiboarditem mbitem = MultiboardGetItem(mb, row - 1, col - 1)
call MultiboardSetItemValue(mbitem, val)
call MultiboardReleaseItem(mbitem)
set mbitem = null
endfunction
))
Spy_,
MultiboardReleaseItem решит все проблемы
поясни плз
Старый 05.03.2011, 15:02
Hanabishi
COOL STATUS
offline
Опыт: отключен
MultiboardReleaseItem
Myth, это удаляется из переменной мбитем, но в борде остаётся
Старый 05.03.2011, 15:06
Myth
The Temple
offline
Опыт: 19,141
Активность:
такой тогда последний вопрос:
у типа string есть область видимости?
переменную надо обнулять? смотрю просто, Hanabishi, ты не обнуляешь.
Старый 05.03.2011, 16:02
Hanabishi
COOL STATUS
offline
Опыт: отключен
в каком смысле область видимости?
нет, string не нужно обнулять
Старый 05.03.2011, 16:32
Myth
The Temple
offline
Опыт: 19,141
Активность:
в каком смысле область видимости?
ну переменные типа инт, реал и булеан имеют её
и когда выходят за её пределы, автоматически обнулятся.
а вот про стринг не знал :)
Старый 05.03.2011, 18:17
XyZoD

offline
Опыт: 2,073
Активность:
Не знаю как локалки могут вызывать утечки, гляньте карту близзов гранпри азерота и посмотрите обнулили ли они хотябы 1 локалку? Они наверняка знают больше любого из вас? Ещё бы C++ обнуляли бы...
Старый 05.03.2011, 18:30
Myth
The Temple
offline
Опыт: 19,141
Активность:
papapa071, близарды знают колдовство и магию :)
Старый 05.03.2011, 18:33
SkiL

offline
Опыт: 9,321
Активность:
papapa071, да ты же не прав, прочитай статьи про оптимизацию.
Старый 05.03.2011, 18:35
XyZoD

offline
Опыт: 2,073
Активность:
мне тут читать нечего я это знаю, подумай как движок примет переменную типа юнит или триггер? как стандартный float или int и как ты будеш обнулять их? null это вообще придумано близзами для юнитов чтобы их потом найти было нельзя по этой переменной. Вот например глобалки видимы везде и если она объявлена то она уже не удалится не как, она удалится только тогда когда выйдеш из игры, так же с локалками она автоматически удалится после выхода из функции. Если я не прав то получается и близзы тоже, получается пользователи умнее разработчиков...

Отредактировано papapa071, 05.03.2011 в 18:50.
Старый 05.03.2011, 18:43
Myth
The Temple
offline
Опыт: 19,141
Активность:
papapa071, то есть ты хочешь сказать что обнулять совсем ничего не нужно и всё на ура у всех будет, а слова "утечка" - слово паразит? )
Старый 05.03.2011, 18:50
XyZoD

offline
Опыт: 2,073
Активность:
Утечка вообще слово не официальное и даже не понятно кто придумал его, для всего что нужно обнулять есть оператор Destroy
Старый 05.03.2011, 18:52
Myth
The Temple
offline
Опыт: 19,141
Активность:
papapa071, ну вот смотри на моём примере:
у меня были большие утечки с мультибордом...
я обнулил переменную - они пропали (которые ожидалось что пропадут)
ЗЫ set x = null
Старый 05.03.2011, 18:56
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 03:25.