J
expert
offline
Опыт:
48,447Активность: |
[Task] Свободный индекс
Задача решена Markiz-ом, ему перечисленно 300 опыта.
Допустим, нам не нравится Кеш, и мы хотим перейти на массивы, конечно полностью заменить Кеш массивами нереально, или реально, но уже не оптимально, но частично - вполне возможно. Единственное что можно сделать, это минимизировать количество обращений к Кешу, а именно только к одному обращению. как это будет работать? Расскажу на примере движения прожектила на таймере: На начало у нас имеется несколько глобальных параллельных массивов (параллельных это значит, что у всех этих массивов под одним и тем же номером ячейки находится информация, сопоставленная одному объекту) Так же у нас будет массив булеонов (udg_Free), который обозначает – занят(true) или свободен(false) данный слот. И целочисленная переменная(udg_FreeIndex ), которая обозначает самый ближайший свободный слот, это нужно для уменьшения итераций цикла при поиске свободного слота. И вот как это будет выглядеть: Код:
FreeIndex() – устанавливает переменную udg_FreeIndex на значение самого ближайшего свободного слота, методом перебора. ClearIndex() – Очищает занятый слот, и после этого он снова свободный, и если он находится ближе чем текущее значение переменной udg_FreeIndex то присвоить его этой переменной как ближайший свободный слот. Т.е. применять ее когда таймер закончился. SetIndexObject() – Сначала обозначает этот слот как занятый, а потом через Кеш сопоставялет обьекту (в нашем случае таймеру) Номер этого слота. GetIndexObject() – Применяется в функции таймера и возвращает сопоставленный объекту индекс, чтобы брать всю информацию с параллельных массивов под тем же индексом. RemoveIndexObject() – Стирает информацию из Кеша для данного объекта, нужно когда таймер уже закончился. Вот пример использования: Код:
И серьезно, получается несколько быстрее чем если все делать через кеш, однако весь вид портит цикл при поиске слота... это... так сказать.. не по трукодерски Теперь Задача: Нужно сделать так чтобы в функции FreeIndex() не было цикла, т.е. находить свободный слот не перебором, в сразуже. Условия: Не трогать функции по работе с таймером, также можно добавить и свои функции… но только чтобы этот код с таймером работал… Разрешается использовать любой набор глобальных переменный. Отредактировано ShadoW DaemoN, 07.08.2008 в 00:24. |
02.08.2007, 17:34 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт:
6,885Активность: |
Как я думаю, нужно при удалении таймера изменить переменную udg_FreeIndex на
udg_FreeIndex - udg_Size, тогда не нужна будет глобалка udg_Free...просто сразу в udg_FreeIndex будет храниться номер ближайшей свободной ячейки...Jon, я правильно думаю...или нет? |
04.08.2007, 17:10 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
Alex_Hell нет! т.к. разные "снаряды" могут "лететь" разное время т.е. они не обязательно будут освобождатся по-порядку.
|
04.08.2007, 17:53 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт:
6,885Активность: |
Ну неправильно, так неправильно...вообщето я не очень то и сильно разбирался в этом коде... |
04.08.2007, 18:16 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Jon, вот мое решение, по теории должно работать:
Код:
Как видишь, Projectile_Move не трогать не удалось, и пришлось удалить кое-что. Никаких циклов. Свободный слот вычисляется сразу в GetIndex(). |
05.08.2007, 16:31 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
YasonDelAlt эм... код очень похож на мой
как будет время проверю... и че? все? только одын? |
06.08.2007, 20:40 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Jon, особых конструкционных особенностей нет, только добавился стек освобожденных слотов и исчезла функция с циклом (FreeIndex()).
|
06.08.2007, 21:29 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Markiz
offline
Опыт:
11,432Активность: |
мой вариант (чтобы затестить - выберите мк и заюзайте стормболт на вражеском лолодине)
кастом код карты: Код:
|
07.08.2007, 00:32 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
хм... работает...:): у меня 2 переменые и один масив.. у YasonDelAlt 2 масива и 2 обычные, а сдесь вроде одной переменой меньше.. это + P.S. хотя нет.. у YasonDelAlt и у меня не похожи... Отредактировано Jon, 11.07.2008 в 21:39. |
07.08.2007, 00:48 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Markiz, можешь объяснить, как это работает? Я что-то смотрю, смотрю и ни как не въеду.
|
09.08.2007, 08:53 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Markiz
offline
Опыт:
11,432Активность: |
YasonDelAlt
В массиве Indexes в ячейке i хранится следующий свободный индекс. В переменной FreeIndex хранится индекс первой незаполненной ячейки. При инициализации мы в каждую i ячейку пишем i+1. FreeIndex присваивается 0 по умолчанию. При добавлении индекса FreeIndex'у присваивается значение из ячейки массива. При удалении индекса K в массив в ячейку К пишется значение FreeIndex, а FreeIndex присваивается значение К Примечание: под первой незаполненной ячейкой мы подразумеваем не обязательно первую по порядку, но совершенно точно последнюю из освобожденных, поэтому "дырок" в массиве не возникнет. |
09.08.2007, 16:22 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Markiz, понял, интересный метод.
|
09.08.2007, 16:38 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
YasonDelAlt я сделал также, но несколько иначе
Jon добавил: но к сожелению у меня есть дырки в масиве, но работе это немешает, потому ща пока доминирует вариант марзика, если никто в ближайшее время ничего не предложит еще он победит |
09.08.2007, 16:41 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Jon, а у меня вообще два массива, так что получается его вариант - лучший. Только я не пойму, почему он делит и умножает индексы, лучше же использовать сложение и вычитание - быстрее работает.
|
10.08.2007, 20:56 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Markiz
offline
Опыт:
11,432Активность: |
YasonDelAlt
Это ты как деление заменишь вычитанием? о_О |
11.08.2007, 08:46 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YasonDelAlt
offline
Опыт:
862Активность: |
Markiz, если я правильно понимаю код, то все set index=index/udg_Size можно заменить на set index=index-udg_Size, а set index=index*udg_Size, на set index=index+udg_Size.
YasonDelAlt добавил: Что-то я торможу. До меня только-что дошло, что массив udg_Free использовался Jon'ом только для поиска свободных слотов. Вот мой исправленный вариант: Код:
|
11.08.2007, 15:06 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|