adic3x
offline
Опыт:
108,439Активность: |
[Task] Движение снарядов #2
или "отсроченная обработка динамически расширяемых данных"
сутьсначала я наверное обрисую ситуацию, а потом поясню уже саму задачу... данные - некоторые характеристики снаряда (к примеру координаты, векторы, юнит-для визуального ряда и т.д.) обработка - функция, в области видимости которой должны быть доступны соответсвующие данные т.е. если я говорю обработать данные отсроченно - это значит что в функцию должны быть сообщены эти данные. причем важно что таких груп данных может быть много к примеру есть функция function Add takes unit u, real x, real y returns *** - в нее мы сообщаем наши данные, потом с помощью таймера ждем некоторое время и в функцию function Move takes unit u, real x, real y returns nithng мы должны их передать, причем также в последней функции должна быть возможности отчитски этих данных ну к примеруесть спелл, который создает снаряд, который летит, и при встрече с югнитом что либо происходит. по сути нам надо сделать мультиинстансовую систему обработки таких снарядов (ну и хранения данных) - т.е. такой спелл должны иметь возможность безбагово кастовать много юнитов одновременно но, важно также то, что у нас есть несколько типов снарядов (к примеру один охотиться на юнитов, другой летит в 3д и т.д.) т.е. для каждого из них должна вызываться своя функция Add/Move шаблонтут я примерно напишу как это дб выглядить: Код:
сразу оговорюсь, что передача в функцию через "такес" тут невозможно, потому что данные должны быть изменяемыми, т.е. я привожу это только для примера вот, как это должно работать Код:
после чего через равные отрезки времени должны вызываться две функции - Мове_00 (в нее сообщаеться 5, там оно уменьшается на 1, значит в след раз должно быть сообщено 4 и т.д. после того как данные приравняются к нюлю это должгны быть прекращено) и точно также с Мове_02 ка бы это выглядело на SCVКод:
это только для одного типа (00), но это очень неоптимально тут хранение данных организованно в кеше, а передача их за счет аттача к хендлу таймера задачапредложить оптимальный вариант хранения данных, алгоритм их расширения и сужения (ну т.е. вызов функций Адд и удаления данных) а также их обработку в соответсвующих типу данных функциях условиявыкладываем тут свои варианты, никаких сложных ограничений нет, но все должно быть очень производительно, т.к. предпологается что на карте одновременно может обрабатываться и 64 таких "комплекта" данных разных типов » old вобщем нетривиальная задача от мну) у меня в карте предположим существует 4 типа снарядов (к примеру один отталкивается от террайна, другой ищет деструбы, другой тип юнитов и т.д.) вобщем смысл в том что! для каждого из них используется свой алгоритм одновременно скажем на карте сущетсвуют от 4 до 64 снарядв (ну мб и больше и мб их вообще 0) что сделать4 функции, к примеру AddPrj_00; AddPrj_01; AddPrj_02 ... и Move_00; Move_01 теперь, каждая из них должна создавать снаряд... что такое снаряд - некоторые данные (его текущие координаты, юнит, владелец и т.д. вобщем это не важно) и при этом эти данные должны передаваться в соответсвующие функции требования: юзабельность т.е. все должно быть достаточно удобно кодеру + нелагуче! т.е. можно просто повысить кол во сработок в сек. и разница будет налицо хорошо, я чувствую написанно тут несовсем ясно... к примеру: Код:
после этого через ХХ сек должны вызываться функции Move_00 (в нее я должен иметь возможность обратитьсяк unit, to 1 and to 2), и Move_02 (u, x and y соответсвенно) т.е. єто все нужно к примеру для карт типа того же ТсХ =) (там много снарядов и т.д.) причем! само движение и т.д.нас не волнует, нужно сделать именно систему для хранения данных + их возможность их отсроченного применения) ну вот думаю теперь ясно))) Отредактировано ADOLF, 12.07.2008 в 09:50. |
11.07.2008, 21:11 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Radiant
Silence
offline
Опыт:
4,907Активность: |
Newgenpack-а нет, участвовать бесполезно( А вообще имхо, задача написана неиочень понятно, сначала про прожектайлы, потом про систему хранения данных, запутано както... |
11.07.2008, 21:21 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
а прожектилы это что? это и естб данные
Цитата:
О_о скачать сложно?! + он по сути не нужен) |
|
11.07.2008, 21:55 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
ADOLF
Цитата:
ну а твоя мысль заключаетьса в бинарном дереве что ли ? =) теоретически можно стартануть 4 потока. но думаю 2 ифа будут быстрей =)))) я вот лично не понял сути задачи =) |
|
11.07.2008, 22:02 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Цитата:
я тоже, ну я понял вроде надо сделать функции созданию юнитов, потом создать таймер, и для каждого создного прожектила вызывать в таймеру свою функцию Move_xx, в щависимости от какой функции он был создан AddPr_xx т.е. написать просто систему переброса даных от создания к таймеру, я прав? |
|
11.07.2008, 22:06 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Цитата:
ну имхо несовсем, как вариант может быть и не дерево а несколько потоков или циклов Цитата:
я имею ввиду что писать СетЮнитХ(...) ненадо) ADOLF добавил: Jon, да наверное... ну смотрите, я кастую спелл, он создает юнита, вася кастует спел, тот спелл тоже создает юнита система должна приаатачить к юнитам к примеру координаты, владельца и т.д. и потом через некоторые отрезки времени двигать их, но разными методами) |
||
11.07.2008, 22:16 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
ADOLF ты чётко сформулируй свою задачю а не Х того Х иного... и если Х это большое число то надо юзать EvaluateTrigger и группы юнитов...
|
11.07.2008, 22:25 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Код:
после вызова функции Адд надо что бы к примеру в течение пусть 5 секунд через равные отрезки времени вызывалась функция Мове (с соотв. индексом) а потом вызывалась бы Ремове, но ремове должна также вызываться и из Мове (к примеру выход за границы карты) |
11.07.2008, 22:34 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
обновил первый пост, думаю теперь дб яснее) |
12.07.2008, 13:42 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Цитата:
Может так? Но если ExecuteFunc уходит в другой поток, то понадобятся многочисленные ифы. Или есть другой способ запустить в том же потоке записанную функцию. Код:
|
|
12.07.2008, 23:05 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ShadoW DaemoN
offline
Опыт:
37,078Активность: |
Вот примерно как я себе представляю реализацию решения данной задачи.
Если понадобится добавить какой-либо тип прожектила, то мы пишем под него структуру вида: Код:
и функцию добавления, вида: Код:
|
12.07.2008, 23:23 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
имхо моя мысль заключаетьса в том. что задачя так же поставлена не правильно как и в преведущем случие.
т.е. ты придумал искутвеные условия лишбы это было "сложней" (хотя для меня тока запутаней). что бы раскрыть потенцыал алгоритма надо знать точную цель "что это должно делать" а ты указываеш "как это должно делать". ты заставляеш других кодить по своей логики что есть банальный phail =) что тебе надо динамичски изменимый продж ?
если это Х возможных функии то это делаетьса через TriggerEvaluate хотя второй вариант являетьса непродуманым концептом. реально вещи которые надо Евалуейтить это евенты. удар об землю, столкновение, смерть проджектайла еще чёнить... я знаю что ты это не прочитаеш еще 2 недели :Р но всё же. |
13.07.2008, 14:04 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Снёс Касперского, заменил worldedit.exe - вернул NewGen.
Посмотрел, чего я творил 3 месяца назад. Оцените, может это то, что ищется.
И вообще - глупо или пойдёт?
Тестовый эффект запускается Esc. |
14.07.2008, 19:32 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Radiant
Silence
offline
Опыт:
4,907Активность: |
ShadoW DaemoN, тыбы показал это на примере...
Sebra, не плохо, но помоему это совсем нито... |
15.07.2008, 12:33 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
Цитата:
Разве? Вызываем Add() - регулярно вызывается step(). Только параметры не в вызове функции, а в структуре записаны. Для каждого типа объектов Add и Step свои. А двигает step что-то, наблюдает за чем-то или так себе крутится - дело десятое. Там ещё DoOnce - вот это не то - так, завалялось, оцените заодно. |
|
15.07.2008, 18:32 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
ShadoW DaemoN
offline
Опыт:
37,078Активность: |
Sebra, хмм, где-то я уже видел подобную карту...
Ну интерфейсы я тоже использую, обрабатывающий цикл же сделан у меня по-другому. Я показывал Адольфу свой код - он загадочно ответил "да, вроде", так что мы на правильном пути) Radiant, сейчас времени нет. |
15.07.2008, 20:34 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sebra
offline
Опыт:
5,603Активность: |
ADOLF, скажи словечко... то/не то? |
17.07.2008, 18:42 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
dk
offline
Опыт:
60,293Активность: |
Он две недели не появится, так что... |
18.07.2008, 04:18 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Radiant
Silence
offline
Опыт:
4,907Активность: |
А мне вар наконец принесли, так что тоже постараюсь поучаствовать^^ |
18.07.2008, 09:51 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
Цитата:
ну по сути цикл с тригер евалуате, но это действительно долго т.е. стоит предумать нечто подобно... нет, функция одно для каждого снаряда, она не меняеться, но может быть несколько разных типов снарядов) так, вижу) свдн сделал то не не так, сейчас обьясню все... я говорил что ооп лажа уже но вобщем) я сразу скажу что такой код мне немного не по дуже, ибо не сразу видна суть. я люблю когда все на более низком уровне) по суте если разрести все злое ооп, выйдет, что использованна структура на паралельных массивах, которая так же содержит еще один обьект (читать индекс к массивам, хотя он будет таким же как и у самих снарядов - как результат при создании снаряда дважды срабатывает механизм аллокации и возращает тот же индекс, хотя я и неуверен) + по моему даже на ооп можно было сделать не так запутанно =))) теперь про сам цикл полиморфенный метод срабатывает за счет ТригерЕвалуате из массива тригеров с индексом типа снаряда, как итог мы получаем медленный и запутанный алгоритм, хотя и работающий вроде правильно + имхо цикл по все снарядам с проверкой на созданность можент также быть медленным теперь по второй карте бай себра) вроде все тоже норм, но, я так понял ты удаляешь из цикла обькта в самом цикле? хз, но впринципе приемлимо, но опять же тут идет тот же ТригерЕвалуате (который как правильно подметил Тс ресурсоемкий), вот только чего я немогу вкурить зачем каллс коунтер и первый цикл? зы, извините за отсутсвие, завтро попробую выложить свой вариант) ADOLF добавил: а вообще молодцы, хотя бы за то что поняли задачу) ADOLF добавил: подумайте над оптимизацией цикла и выполнения не через ТригерЕвалуте подсказка: есть на компах тема Execute vx Evaluate, хотя и там я дал не совсем тот вариант))) |
|
28.07.2008, 15:04 | #20
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|