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

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

Ответ
 
ZeToX2007

offline
Опыт: 7,009
Активность:
ZeDCS
Системка, позволяющия к хендлу прикрипить вашу структуру. Работает быстрее чем хештаблица
(6000 вызовов, заметно было, что эта система меньше тормозила) сделанно при помощи cJass (огромное спасибо ADOLF'у)

использовать довольно просто у нас есть какая либо структура и хендл.

Код:
local timer T = CreateTimer()
local cord c = c.create()

SaveStruct(T,c)


Этим действием мы прикрипили структуру.

Код:
local timer T = GetExpiredTimer()
local cord c = 0

LoadStruct(T,c)


Здесь все наоборот, к переменной с, задали значения...

Вообще код прост, сделал несколько видов поисков (в основном бинарный и упорядочный)
Прикрепленные файлы
Тип файла: w3x ZeDCS.w3x (23.6 Кбайт, 25 просмотров )
Тип файла: w3x ZeDCS2.w3x (23.9 Кбайт, 27 просмотров )

Отредактировано ZeToX2007, 12.09.2009 в 20:34.
Старый 12.09.2009, 15:43
LordSerga

offline
Опыт: 3,809
Активность:
Просто нет слов!!! супер. щас в JNPG заценю
Старый 12.09.2009, 18:49
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Если юзаешь cjass, то юзай по полной. Ифы можно было блоками писать - нагляднее. И к тому же, делай блин отступы ^^. И документацию напиши в карте.
integer array Mx1,Mx2,Mx3,Mx4,Mx5,Mx6,Mx7,Mx8
integer Nm = 0,nmm = 0

// Для версий -1.23
// function GetHandleId takes handle h returns integer
// return h
// return 0
// endfunction


//бинарный
define {
    LoadStructBinary(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        if (Nm > 32764) {
            if (Nm > 49146) {
                if (Nm > 57337) {
                    stuct = Mx8[Nm - 57337]
                } else {
                    stuct = Mx7[Nm - 49146]
                }
            } elseif (Nm > 40955) {
                stuct = Mx6[Nm - 40955]
            } else {
                stuct = Mx5[Nm - 32764]
            }
        } elseif (Nm > 16382) {
            if (Nm > 24573) {
                stuct = Mx4[Nm - 24573]
            } else {
                stuct = Mx3[Nm - 16382]
            }
        } elseif (Nm > 8191) {
            stuct = Mx2[Nm - 8191]
        } else {
            stuct = Mx1[Nm]
        }
    }
        
    SaveStructBinary(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        if (Nm > 32764) {
            if (Nm > 49146) {
                if )Nm > 57337) {
                    Mx8[Nm - 57337] = stuct
                } else {
                    Mx7[Nm - 49146] = stuct
                }
            } elseif (Nm > 40955) {
                Mx6[Nm - 40955] = stuct
            } else {
                Mx5[Nm - 32764] = stuct
            }
        } elseif (Nm > 16382) {
            if (Nm > 24573) {
                Mx4[Nm - 24573] = stuct
            } else {
                Mx3[Nm - 16382] = stuct
            }
        } elseif (Nm > 8191) {
            Mx2[Nm - 8191] = stuct
        } else {
            Mx1[Nm] = stuct
        }
    }

    //упорядочный 2
    LoadStruct2(Handle,stuct) ={
        Nm = GetHandleId(Handle)-1048500
        nmm =Nm/8191
        if (nmm == 0 ) {
            stuct = Mx1[Nm]
        } elseif (nmm == 1) {
            stuct = Mx2[Nm-8191]
        } elseif (nmm == 2) {
            stuct = Mx3[Nm - 16382]
        } elseif (nmm == 3) {
            stuct = Mx4[Nm - 24573]
        } elseif (nmm == 4) {
            stuct = Mx5[Nm - 32764]
        } elseif (nmm == 5) {
            stuct = Mx6[Nm - 40955]
        } elseif (nmm == 6) {
            stuct = Mx7[Nm - 49146]
        } else {
            stuct = Mx8[Nm - 57337]
        }
    } 
    
    SaveStruct2(Handle,stuct) ={
        Nm = GetHandleId(Handle)-1048500
        nmm =Nm/8191
        if (nmm == 0) {
            Mx1[Nm] = stuct
        } elseif (nmm == 1) {
            Mx2[Nm-8191] = stuct
        } elseif (nmm == 2) {
            Mx3[Nm - 16382] = stuct
        } elseif (nmm == 3) {
            Mx4[Nm - 24573] = stuct
        } elseif (nmm == 4) {
            Mx5[Nm - 32764] = stuct
        } elseif (nmm == 5) {
            Mx6[Nm - 40955] = stuct
        } elseif (nmm == 6) {
            Mx7[Nm - 49146] = stuct
        } else {
            Mx8[Nm - 57337] = stuct
        }
    }

    //упорядочный
    LoadStruct(Handle,stuct) ={
        Nm = GetHandleId(Handle)-1048500
        if (Nm < 8192 ) {
            stuct = Mx1[Nm]
        } elseif (Nm < 16383 ) {
            stuct = Mx2[Nm-8191]
        } elseif (Nm < 24574 ) {
            stuct = Mx3[Nm - 16382]
        } elseif (Nm < 32765 ) {
            stuct = Mx4[Nm - 24573]
        } elseif (Nm < 40956 ) {
            stuct = Mx5[Nm - 32764]
        } elseif (Nm < 49147 ) {
            stuct = Mx6[Nm - 40955]
        } elseif (Nm < 57338 ) {
            stuct = Mx7[Nm - 49146]
        } else {
            stuct = Mx8[Nm - 57337]
        }
    } 
    
    SaveStruct(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        if (Nm < 8192 ) {
            Mx1[Nm] = stuct
        } elseif (Nm < 16383 ) {
            Mx2[Nm-8191] = stuct
        } elseif (Nm < 24574 ) {
            Mx3[Nm - 16382] = stuct
        } elseif (Nm < 32765 ) {
            Mx4[Nm - 24573] = stuct
        } elseif (Nm < 40956 ) {
            Mx5[Nm - 32764] = stuct
        } elseif (Nm < 49147 ) {
            Mx6[Nm - 40955] = stuct
        } elseif (Nm < 57338 ) {
            Mx7[Nm - 49146] = stuct
        } else {
            Mx8[Nm - 57337] = stuct
        }
    } 
    
    //смешанный
    SaveStructTbner (Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        if (Nm >32764) {
            if (Nm < 40956) {
                Mx5[Nm-32764] = stuct
            } elseif (Nm < 49146) {
                Mx6[Nm-40955] = stuct
            } elseif (Nm < 49147) {
                Mx7[Nm - 49146] = stuct
            } else {
                Mx8[Nm - 57337] = stuct
            }
        } elseif (Nm < 8192) {
            Mx1[Nm] = stuct
        } elseif (Nm < 16383) {
            Mx2[Nm-8191] = stuct
        } elseif (Nm < 24574) {
            Mx3[Nm-16382] = stuct
        } else {
            Mx4[Nm-24573] = stuct
        }
    }
    
    LoadStructTbner(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        if (Nm >32764) {
            if (Nm < 40956) {
                stuct = Mx5[Nm-32764]
            } elseif (Nm < 49146) {
                stuct = Mx6[Nm-40955]
            } elseif (Nm < 49147) {
                stuct = Mx7[Nm - 49146]
            } else {
                stuct=Mx8[Nm - 57337]
            }
        } elseif (Nm < 8192) {
            stuct=Mx1[Nm]
        } elseif (Nm < 16383) {
            stuct=Mx2[Nm-8191]
        } elseif (Nm < 24574) {
            stuct=Mx3[Nm-16382]
        } else {
            stuct=Mx4[Nm-24573]
        }
    }
    
//Mini
    LoadStructMini(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        nmm =Nm/8191
        if (nmm == 0) {
            stuct = Mx1[Nm]
        } elseif (nmm == 1) {
            stuct = Mx2[Nm-8191]
        } elseif (nmm == 2) {
            stuct = Mx3[Nm - 16382]
        } else {
            stuct = Mx4[Nm - 24573]
        }
    } 
    
    SaveStructMini(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        nmm = Nm/8191
        if (nmm == 0) {
            Mx1[Nm] = stuct
        } elseif (nmm == 1) {
            Mx2[Nm-8191] = stuct
        } elseif (nmm == 2) {
            Mx3[Nm - 16382] = stuct
        } else {
            Mx4[Nm - 24573] = stuct
        }
    }
}

Отредактировано Van Damm, 16.09.2009 в 01:53.
Старый 12.09.2009, 19:19
ZeToX2007

offline
Опыт: 7,009
Активность:
Компилиться стало с ошибками О_о
elseif ( Nm < 16383 ) then
set Mx2[Nm - 8191]=0
elseif ( Nm < 24574 ) then
set Mx3[Nm - 16382]=stuct
Для второго масива норм скомпилировалось для следующего stuct, по идеи все должно заменяться..
Старый 12.09.2009, 19:55
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Оо ты про код, что я дал? У меня всё ок
Старый 12.09.2009, 20:07
ZeToX2007

offline
Опыт: 7,009
Активность:
Van Damm, Я про сJass...

SaveStruct(T,0)

удалил эту строку сохранил, вставил и нормально сохранилось...
Старый 12.09.2009, 20:22
ZeToX2007

offline
Опыт: 7,009
Активность:
Решил по эксперементировать, пока не знаю к чему это приведёт:

Код:
SaveBinary2(Handle,stuct) = {
        Nm = GetHandleId(Handle)-1048500
        if (Nm > 32764) {
            if (Nm > 49146) {
                    Mx8[Nm - 57337] = stuct 
                    Mx7[Nm - 49146] = stuct
            } else {
                Mx6[Nm - 40955] = stuct
                Mx5[Nm - 32764] =  stuct
            }
        } elseif (Nm > 16382) {
                Mx4[Nm - 24573] = stuct
                Mx3[Nm - 16382] = stuct
        } else {
            Mx2[Nm - 8191] =  stuct
            Mx1[Nm] = stuct
        }
    }


как-то так вроде... действует ток на сейв... заменил if else, на одно присвоение переменной, обязательно протестию на скорость... на несколько строк код будет меньше... если это будет быстрей или почти равные по скорости, это позволит строить более эффективные алгоритмы...
Старый 13.09.2009, 23:22
ZeToX2007

offline
Опыт: 7,009
Активность:
Вышла новая версия ! ) карту выкладывать лень, поэтому код выложу тут.

Код:
integer cj_ind = 0;

define{
    <New Data> (Type,Name) = {
    Type array Name##1
    Type array Name##2
    Type array Name##3
    Type array Name##4
    Type array Name##5
    Type array Name##6
    Type array Name##7
    Type array Name##8}
    
    
    <Save Bin> (Name,Handle,variable) = {
        cj_ind = GetHandleId(Handle)-0xffff0
        
          if (cj_ind > 0x7999) {
            if (cj_ind > 0xbfff) {
                Name##8[cj_ind - 0xd000] = variable;
                Name##7[cj_ind - 0xc000] = variable;
            } else {
                Name##6[cj_ind - 0xa000] = variable;
                Name##5[cj_ind - 0x8000] = variable;
            }
        } elseif (cj_ind > 0x3fff) {
                Name##4[cj_ind - 0x6000] = variable;
                Name##3[cj_ind - 0x4000] = variable;
        } else {
            Name##2[cj_ind - 0x2000] = variable;
            Name##1[cj_ind] = variable;
        }
    }
        
    <Load Bin> (Name,Handle,variable) = {
        cj_ind = GetHandleId(Handle)- 0xffff0
        if (cj_ind > 0x7fff) {
            if (cj_ind > 0xbfff) {
                if (cj_ind > 0xdfff) {
                     variable = Name##8[cj_ind - 0xe000];
                } else {
                    variable = Name##7[cj_ind - 0xc000];
                }
            } elseif (cj_ind > 0x9fff) {
                variable = Name##6[cj_ind - 0xa000];
            } else {
                variable = Name##5[cj_ind - 0x8000];
            }
        } elseif (cj_ind > 0x3fff) {
            if (cj_ind > 0x5fff) {
                variable = Name##4[cj_ind - 0x6000];
            } else {
                variable = Name##3[cj_ind - 0x4000];
            }
        } elseif (cj_ind > 0x1fff) {
            variable = Name##2[cj_ind - 0x2000];
        } else {
            variable = Name##1[cj_ind];
        }
    }
    
    
    Load (Name,Handle,variable) = {
        cj_ind = GetHandleId(Handle)-0xffff0
        if (cj_ind < 0x1fff ) {
          variable = Name##1[cj_ind]
        } elseif (cj_ind < 0x3fff ) {
          variable = Name##2[cj_ind-0x2000]
        } elseif (cj_ind < 0x5fff ) {
          variable = Name##3[cj_ind - 0x4000]
        } elseif (cj_ind < 0x7fff ) {
          variable = Name##4[cj_ind - 0x6000]
        } elseif (cj_ind < 0x9fff ) {
          variable = Name##5[cj_ind - 0x8000]
        } elseif (cj_ind < 0xafff ) {
          variable = Name##6[cj_ind - 0xa000]
        } elseif (cj_ind < 0xcfff ) {
           variable = Name##7[cj_ind - 0xc000]
        } else {
           variable = Name##8[cj_ind - 0xe000]
        }
    } 
    
    Save (Name,Handle,variable) = {
        cj_ind = GetHandleId(Handle)-0xffff0
        if (cj_ind < 0x3fff ) {
            Name##1[cj_ind] = variable
            Name##2[cj_ind-0x2000] = variable
        } elseif (cj_ind < 0x7fff ) {
            Name##3[cj_ind - 0x4000] = variable
            Name##4[cj_ind - 0x6000] = variable
        } elseif (cj_ind < 0xbfff ) {
            Name##5[cj_ind - 0x8000] = variable
            Name##6[cj_ind - 0xa000] = variable
        } else {
            Name##7[cj_ind - 0xc000] = variable
            Name##8[cj_ind - 0xe000] = variable
        }
    } 
}
//test

New Data(integer,Lol)


выглядит довольно симпотично ^_^

ZeToX2007 добавил:
хотя нет, в редакторе лучше )

Отредактировано ZeToX2007, 22.09.2009 в 02:00.
Старый 22.09.2009, 01:46
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
< и > в названии дефайна нужны только если оно состоит из нескольких слов или содержит спецсимволы
Старый 22.09.2009, 01:50
ZeToX2007

offline
Опыт: 7,009
Активность:
Van Damm, забыл удалить )

ZeToX2007 добавил:
подправил вроде.
Старый 22.09.2009, 02:01
ScorpioT1000
Работаем
offline
Опыт: отключен
я заметил там GetHandleId - нахрена эта система? есть же XAT, очередной аналог..
Старый 22.09.2009, 03:18
ZeToX2007

offline
Опыт: 7,009
Активность:
ScorpioT1000, ХаТ экономичный(по колву строк), это быстрей.
Старый 22.09.2009, 13:33
Ответ

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

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

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

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



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