Как прицепить integer к типу юнита? И потом считать его?

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

Через хеш, структура + поиск по всем структурам медленнее будет.
globals
    key AttachIntParentKey
endglobals

function AttackInt takes integer rawcode, integer i returns nothing
    call SaveInteger(Hash, AttachIntParentKey, rawcode, i)
endfunction

function GetAttachedInt takes integer rawcode returns integer
    return LoadInteger(Hash, AttachIntParentKey, rawcode)
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
7
5 лет назад
Отредактирован Haikyo
1
Создать структуру, в которой будет храниться два int'а. Первый инт это ваше число, второй инт это тип юнита.
Имея тип юнита, вы можете перебором структур найти нужную структуру, а потом оттуда достать инт.
Примерный код:
struct UnitType
	int typeid
	int number
	
int func() 
	local id = GetTriggerUnit().GetTypeId()
	i = 0
	while (i < 100)
		if i.typeid == id
			return i.number
За ошибки извиняюсь, jass не мой родной язык.
5
28
5 лет назад
Отредактирован PT153
5
Через хеш, структура + поиск по всем структурам медленнее будет.
globals
    key AttachIntParentKey
endglobals

function AttackInt takes integer rawcode, integer i returns nothing
    call SaveInteger(Hash, AttachIntParentKey, rawcode, i)
endfunction

function GetAttachedInt takes integer rawcode returns integer
    return LoadInteger(Hash, AttachIntParentKey, rawcode)
endfunction
Принятый ответ
1
11
5 лет назад
1
Медленнее? Для глаза хотя бы заметно это?:) Постоянно удивляет этот байтодрочинг :) Который по факту в самой игре вообще никто не заметит - пример тому Дотка от Фрога :) Играется уже больше десятка лет, код супер-топорный, но не видел еще ни одной жалобы на то, что че то медленно работает, типа - "Ребят, у вас тут код надо исправить, медленно работает, сделайте через ХТ, а то эти 0.02 секунды слишком сильно влияют на мое АПМ в игре".
2
18
5 лет назад
Отредактирован Vlod
2
При большом количестве элементов поиск перебором оборвет поток исполнения, или код PT153 настолько сложный?
0
7
5 лет назад
0
Vlod, ну можно тогда использовать бинарный поиск, намного быстрее будет
0
11
5 лет назад
0
Хз через структуры делал целые БД для всех юнитов на карте и для всех айтемов, по 2.5 часа игры длились - и ничего не обрывалось и не начинало лагать. А тут вдруг начнет... Ну ок
0
7
5 лет назад
0
Мне помнится наоборот писали, что структуры быстрее будут, не уверен, что это так
Но в случае, если прикрепить нужно не одну цифру, а большее количество различных данных, хранить их в структуре будет эффективнее
0
20
5 лет назад
0
PT153:
Через хеш, структура тут медленнее будет.
globals
    key AttachIntParentKey
endglobals

function AttackInt takes integer rawcode, integer i returns nothing
    call SaveInteger(Hash, AttachIntParentKey, rawcode, i)
endfunction

function GetAttachedInt takes integer rawcode returns integer
    return LoadInteger(Hash, AttachIntParentKey, rawcode)
endfunction
спасибо, про хэшки совсем запамятовал

respect_gg:
Постоянно удивляет этот байтодрочинг :)
в этом вся суть XGM
1
11
5 лет назад
1
Haikyo:
Мне помнится наоборот писали, что структуры быстрее будут, не уверен, что это так
Но в случае, если прикрепить нужно не одну цифру, а большее количество различных данных, хранить их в структуре будет эффективнее
В этом и суть, я через структуры привязывал к юнитам (абсолютно к любым, которые были задействованы в карте) в районе 20-25 характеристик, так же у каждого айтема бонусы были сделаны через БД структуры - и как итог никаких лагов, никто не жаловался что че то медленно работает. Все летало и работало как часы. А весь этот байтодрочинг оставьте комьюнити, пусть хоть чем то займутся :)
5
18
5 лет назад
Отредактирован Vlod
5
Прежде ознакомьтесь пожалуйста с понятиями линейный поиск и хеш-таблица.
1
32
5 лет назад
1
Постоянно удивляет этот байтодрочинг :)
включаем минусаторы
Nazar проводил тесты, и доказал (случайно доказал), что нет никакой разницы в скорости, что 0,0001 это не быстрее, а люди пишущие про скорость двинуты на голову (Прости PT153, я не про тебя, ты нормальный)
2
28
5 лет назад
Отредактирован PT153
2
respect_gg, действительно, что быстрее, цикл через все возможные равкоды, у которого сложность O(N), или хеш, у которого сложность O(1) в среднем. При 1000 равкодах разница будет ощутима.

Ну и да, верное прикручивание структуры к юниту позволяет делать конвертацию туда и обратно за O(1). Ты же не делаешь линейный поиск, чтобы найти юнита. Мой комментарий относился к решению, что предложил Haikyo.
Так что наезд ни о чём, так-то структуры быстрее хеша, но разница невелика, ибо и там, и там O(1).

Haikyo:
Мне помнится наоборот писали, что структуры быстрее будут, не уверен, что это так
Но в случае, если прикрепить нужно не одну цифру, а большее количество различных данных, хранить их в структуре будет эффективнее
Верно, но при создании структуры нужно будет её сохранить в хеш по равкоду, чтобы избежать поиска.
0
32
5 лет назад
0
Насчет байтодрочерства - драколич уже доигрался, массовые жалобы на просадки фпс, ниже плинтуса. Вот когда оно приспичит, тогда будите заниматся оптимизацией.
Есть еще 1 костыльный метод, ро код самого юнита. Помню была даже статья на эту тему.
3
28
5 лет назад
Отредактирован PT153
3
Реализация для нескольких параметров через структуру.
globals
    constant hashtable Hash = InitHashtable()
endglobals

struct RawcodeData
    private key ParentKey

    readonly integer rawcode
    readonly integer param1
    readonly integer param2
    readonly integer param3
    
    static method create takes integer raw, integer param1, integer param2, integer param3 returns thistype
        local thistype this = allocate()
        set rawcode = raw
        set this.param1 = param1
        set this.param2 = param2
        set this.param3 = param3
        call SaveInteger(Hash, ParentKey, raw, this)
        return this
    endmethod
    
    method onDestroy takes nothing returns nothing
        call RemoveSavedInteger(Hash, ParentKey, rawcode)
    endmethod
    
    static method getByRawcode takes integer raw returns thistype
        return LoadInteger(Hash, ParentKey, raw)
    endmethod

endstruct
0
11
5 лет назад
Отредактирован respect_gg
0
quq_CCCP:
Насчет байтодрочерства - драколич уже доигрался, массовые жалобы на просадки фпс, ниже плинтуса. Вот когда оно приспичит, тогда будите заниматся оптимизацией.
Есть еще 1 костыльный метод, ро код самого юнита. Помню была даже статья на эту тему.
Лич залез далеко за "пределы" дозволенного и тут уже судить проблемы с его картой - не наше дело, пусть сам разбирается же, не?
Я про то, что этот байтодрочинг никому еще не помог. Помню еще в лохматые времена, на wc3 спорили про оптимизацию в Tides of Blood, и как итог - пришли все к выводу, что ничем эта оптимизация не поможет, карта играется нормально, код стабилен, функционал работает на 5+. Так зачем нужно это все? Вон на хайве TriggerHappy любит бенчмакртить эту фигню, так пусть и занимается
2
28
5 лет назад
Отредактирован PT153
2
Я про то, что этот байтодрочинг никому еще не помог.
Про какой "байтодрочинг" идёт речь? Про разницу между O(1) и O(N)?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.