DioD
offline
Опыт:
45,134Активность: |
Создание MUI без использования ретурн бага
Как пример я возьму то что написал для этой цели уже давно, хотя баги могут быть, так что если вдуг что-то всплывёт пишите письма.
Как вам должно быть известно на данный момент для создания стэка объектов, мы привыкли называть это SCV хотя это вовсе не так, кеш это хеш таблица по которой движок варкравта осуществяет поиск каждый раз при обращении к нему, чем больше данных сохранено тем больше времени это займёт. Это создаёт очень серьёзную проблему невозможности высвобождать записи из кеша при потере объекта - хоста на который эти данные были записаны, таким образом все данные что были сохранены в кеш и не очищены вовремя остануться там навсегда, вызывая всё большую и большую задержку в обращении к кешу в дальнейшем. Вторая проблема это обработка тех самых объектов типа handle что были удалены при работе вне кеша, в таком случае движок выделит хэндл другому объекту хотя в кеше остались данные записаные для совсем другого объекта, это как правило вызывает остановку ввыполнении какого либо действия, или нарушает ход действия совсем других событий, что так-же является неприятным. Третья, незначительная проблема это строки что остаются в памяти навсегда и замедляют обработку кеша и не только его со временем. Выход из сложившейся ситуации только один, для событий что происходят часто и не требуют каких либо извратов использовать массивы, из преимуществ можно выделить то что данные не могут потерятся в принципе, можно не опасаясь за что либо обнулять таймеры и разрушать триггеры, хэндл этих объектов сохранён и находиться в безопасности. Как пример такого выделения данных я могу предложить код выделения ячейки от SDARS. Код:
Структура что получается при использовании этого механизма выделения это двумерный массив 32*256 первый подмассив имеет границы 0-255 второй 256-511 смещение по 256 определяется так называемым OffSet значением что сдвигает область по объёму массива, но это не мешает вам изменить размерность и получить например 64 офсета по 128 значений или 16 по 512 это зависит от того какую вы цель преследуете, если по мне то 128 объектов вполне достаточно для выполнения любой операции. Для упрощения получения свободной ячейкивводиться логическая перменная что определяет выделение ячейки строго по порядку, от сюда и название StaticDataArrays это число можно убрать и тогда пробег по массиву будет проходить динамически и все объекты будут укладываться в несколько первых ячеек массива, но это создаст эффект кеша при потере хэндлов, чем больше размер одного офсета тем долше сохраняются ссылки на объекты и тем дольше записи находятся в безопасности. второй цикл создан искючительнодля проверки не занял ли слот чем либо, слот занимается исключительно триггером, таким образом проверить используется ли он невозможно впринципе, так как ведущее логическое число отсчитывает порядок ситуация при которой ячейка становиться занятой есть ошибка где-то в коде, так как цели для которых используется тот или иной массив различны, например для одного спелла вы можете использовать один диапозон для другого другой, найти ошибкуц не составит труда, достаточно добавить дебаг сообщение или что-тов этом роде и всё будет отлично. Как вы могли заметить сразу после проведения всех проверок функция записывает следующий свободный слот всоответствующую перменнную, уникальную для каждого оффсета, таким образом вы моежете отслеживать темпы использования того или иного массива и перераспределять ресурсы в дальнейшем что может быть очень важным при построении сложных систем. Итак о перменных что были задействованы внутри функции. Код:
заголовок как вы видите вполне простой, первоеприсвоение создано для того что-бы не путаться, впринципе оно не нужно вовсе. Код:
После всех изысканий в пределах логики, а вернее после обработки входных параметров происходят некоторые проверки, а именно Код:
итак часть два, получение информации измассивов.... Код:
Вторая часть механизма оперирования массивов, получение данных из массива. Так как ретурн баг мы неиспользуем остаётся только перебор. Ну тут сложностей увы никаких нет и долго я рассказывать не буду, оффсет передаётся вручную увы вы не сможете контролировать сразу весь массив целиком,но вот 256 ячеек запомнить вполне можно, особенно если вы ловите глюки. после передачи оффсета происходит определение рамок оффсета и начинается поиск триггера из которого эта функция запущена, если объекта нету вы получите верхнюю границу массива, это моя недоработка так что вам будет чем занятьсяна досуге, попробуйте ёё исправить. Еще в алгоритм поиска не включено логическое число что должно определять первый занятый слот, а не первый свободный как в функции выше, исходя из нескольких простых определений вы сможете исправить эту особенность поиска данных по массиву. 1) выделеный объект всегда будет занят, функций отмотки просто нет, если слот в массиве выделен он будет занят в любом случае, хотя функцию отмотки можно собрать, она будет опасна по определению таккак может отмотать не то что надо. 2) после получения объекта не обязательно что он будет удалён, но обязательно что онвсё еще существует, это вторая функция SDARS , как вам должно быть известно RS это система что прекомпилировала данные перед обработкой, тут так-же, вскоре а вернее если будет времяяпокажу как это работает, хотя это будет просто кошмарно смотреться 3) нци последнее правило, удалёный объект больше несуществует его ячейку нельзя использовать но можно занять вновь. кстати о очищении массивов, тут тоже есть функция... Код:
Функция очищения никогда не осуществляется автоматически и не перематывает какие либо числа, так как ошибочный вызов её 2-3 раза подряд мог убить весь массив. Ну и основная функция это убийство указаной ячейки во всех доступных массивах, если вы будете использовать 3d массив 2*32*128, то надо будет убивать сразу по две ячейки, хотя это неважно. последняя функция просто регестрирует триггер как таймер, сохраняя его действие для защиты от утечки. ну а теперь краткая инструкция по 3д массиву. Пишу как пример, работать это не будет, просто посмотрите алгоритм Код:
Как вы можете видеть нет ничего сложно в выделении 2х 3х и даже 4х мерных массивов, можно сделать неограниченое число измерений и использовать их. В этом отношении кеш сильно проигрывает так как использование математических законов на строках тупо. |
11.11.2006, 12:38 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
Там не намного больше времени уходит. Поиск бинарный, поэтому количество итераций при поиске равно log(2,COUNT), а это не так существенно
Да и потом, кеш (в нормальных картах) каждый раз на загрузки флешится, либо весь, либо выборочно Цитата:
Насколько я понял, это реализация принципа кеша на массивах, оптимизированная в некоторых местах Вспоминается как Алексей предлагал для увеличения скорости работы с массивами выбирать несколько случайных элементов перед вставкой =) |
|
11.11.2006, 14:37 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
не поняли фишки немножко
Массив интегеров что хранит в себе номера свободных ячеек в первых 4000 слотов и занятых во второй 4000 слотов, таким образом ячейки массива становятся группой различных объектов и не пересекают друг друга.
про рандом число, так вот оно реализовано на RS компоненте, и выбор будет происходить из гарантировано свободных ячеек, тоесть рандом никогда невыпадет на занятую ячейку.
Основная сложностьв том что я по такому алгоритму мыслить не могу, и немогу представить себе структуру полностью, что тормозит развитие этой системы.
|
11.11.2006, 14:51 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
теперь мне понятно, надо более внимательно вчитаться в код
я уже не раз обьяснял почему в общем случае рандом в таких системах - полный бред =) |
11.11.2006, 14:59 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
рандом конечно бред ноесли очень хочется пожалуста, лучше делать через таблицу
массивы
ну можно взять пример например такой работы
|00000000000000000000000000000000000000000000000000|
сектор что содержит свободные ячейки
|11111111100000000000000000000000000000000000000000|
позанимали ячеек например, так вот сектор сдвинется наколичество занятых ячеек а номера занятых будут добавлены во второй сектор
|00000000000000000000000000000000000000000|
свободные |1111111111|
занятые
как мы видиму нас есть занятые ячейкииесть свободные
так вот объекты мы будем искать в одном местеа ячейки в другом
таким образом количество поисков будет резко сокращено единственная проблема это высвобождение ячеек после того как они были заняты, если делать это автоматом получаетсянемножко бред, если в ручную,то ошибка пользователя убъёт массив итак впримере у нас освободилась ячейка 6 из массива 3-12 размеры массивов храняться в служебном массиве, так что можноанализировать использование
000|1111101111|000
вот у нас такой вот сектор, и мы это знаем, для освобождения ячейки нам надо
и добавить этот номерв массив свободных ячеек так какситуация 3-12 недостижима при автоконтроле она приобразуется в 1-10 а после в 1-9 таким образом мы дефрагментировали объём данныхи нам не нужно использовать рандом поиск вовсе, так как у нас все значения строго зафиксированы в некой группе, отсюда и название. |
11.11.2006, 15:38 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Iron
Листовой
offline
Опыт:
24,427Активность: |
DioD, а чем тебе не нравится обычная система пробегания циклом по массиву с выискиванием свободной ячейки? При максимальном размере массива в 8192 это не такая уж и долгая операция. + мы получаем гибкую систему в которой у нас нет ограничения на 4000 обьектов, а могут быть задействованы все 8192.
Или я чего-то недопонимаю? Тогда plz обьясни. |
14.11.2006, 22:43 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
SDARSv2 снимает все ограничения по перебору ибо он больше не нужен вовсе, забудьте это слово. перебор нужен только для получения неименованых объектов из массива, да и то перебор в этом случае будет минимален.
SDARSv3 предпологает 64*64*2 тоесть 3 измерения, еще можно 16*16*16*16 но это маловажно так как представить себе 4 измерения человек не может и пользоваться этой модификацией так-же не сможет. 2 измерения это оффсет и модуль 3 измерения это оффсет модуль и "клон раздел" 4 измерения это оффсет, модуль клон раздел в каждом оффсете и общий клон раздел тоесть занимая скажем оффсет 1 модуль 1 мы получаем доступ еще к двум местам для сложения данных минус этой системы статичность, как работают динамические массивы можно увидеть в теме с тест версиями, первая работа внутри вторая работа извне. http://xgm.guru/forum/showthread.php?t=7705 могу конечно описывать долго но это проще понять самому, особенно если учесть что в этой теме есть инфа по алгоритму |
15.11.2006, 06:53 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
используйте кучу и будет вас счатье. перебор сосёт. |
20.11.2006, 02:49 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,134Активность: |
вот ты мне объясни как в кеше вар ищёт данные? не перебор хочешь сказать? |
20.11.2006, 12:35 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
Цитата:
нет, конечно! я уже задолбался писать людям типа тебя и тоадкопа, чтобы почитали книжки по алгоритмам. |
|
20.11.2006, 23:22 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
нет, не перебор. оптимальный метод для таких вещей - хеш функция, но это слишком сложно (функцию сложно хорошую задать, а универсальную вообще невозможно), поэтому используется хеш-таблица. У хеш-таблицы есть индексное поле, индексируется оно почти наверняка бинарным деревом (см. std.map). То есть если перебор хеш таблицы - N итераций, то бинарный поиск - это log(2,N). Насколько мне известно, лучше алгоритма пока не придумано
NETRAT добавил: То есть при условии грамотной реализации, любые извращения на эту тему остаются всего лишь извращениями. Правда, насколько мне удалось познакомиться с методами близзов, я не исключаю что написана эта система была не так как нам хотелось бы(и не так как нам было бы удобнее и быстрее) |
21.11.2006, 05:11 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
DioD в конечном случаи важна производительность и если она быстрей кеша то можно это юзать иначе не имеет никакого смысла... и поверь сравнительно кеш не такой уж и медленый.
Цитата:
Toadcop добавил: а чё карты примера нету ? |
|
21.11.2006, 15:46 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|