Полезное

Мы Вконтакте

Discord канал

#
Пред.
12
Модератор: icms
Аватара пользователя
Пользователь
Сообщения: 12
Здравствуйте. Делаю сетевую RTS. Проблема давно зрела, но сейчас встала ребром.

Еще давно была нужда хранить в связанных списках данные и быстро их искать, например PlayerID\PC\PlayeDataObj
Я знаю, что БП функция Find\Get (map\array) работает невероятно быстро, чего нельзя сказать о ForEach.
В итоге родил БП-класс с 3мя MAP ID\PC PC\ID ID\DATA, который с помощью FIND вполне успешно со своей задачей справлялся.

Но тут плавно подошло время делать подсистему юнитов.
А тут уже надо хранить целый ворох информации. В данный момент мне требуется хранение в связанном списке следующих значений.

UnitID\UnitTeam\UnitsPlayer\UnitRef\UnitType

Зачем? Для гибкости управления. Например, что бы я мог обратится к системе с запросом - ссылки на всех юнитов типа А, игрока 2.
Или - игроки владеющие юнитами типа Б.

И тут уже даже десятком MAP не ограничишься, придется делать ForEach как не крути.

Какой может быть выход? Написать класс на плюсах? Хотелось бы максимально отдалить этот момент, что бы не терять скорость прототипирования и я в них не силен, но при отсутствии выбора - сделаю, какой контейнер мне использовать?
Аватара пользователя
Пользователь
Сообщения: 4069
ну сделай несколько массивов или структуру, и обращайся к ним. Я думаю пару сотен итераций погоды не делают, если уж там тысяча юнитов типа А, просто сделай рассинхрон на несколько кадров, например каждый нечетный кадр, обращайся к 100 юнитам из групы А, за пол секунды обратишься ко всем без всякого заметного для глаза лага.

Тоесть ForLoop произведется не в одном кадре, а например за 15.
Аватара пользователя
Пользователь
Сообщения: 12
Prytaleks писал(а):
ну сделай несколько массивов или структуру, и обращайся к ним. Я думаю пару сотен итераций погоды не делают, если уж там тысяча юнитов типа А, просто сделай рассинхрон на несколько кадров, например каждый нечетный кадр, обращайся к 100 юнитам из групы А, за пол секунды обратишься ко всем без всякого заметного для глаза лага.

Тоесть ForLoop произведется не в одном кадре, а например за 15.


У меня посреди некой функции потребовалось узнать кол-во "Юнитов типа А, у игрока Б" и что дальше? Делить функцию на две и ожидать результата? Это звучит как костылище, которое ведет к жесточайшим макаронам.
Тут не то, что бы я боюсь что ForEach у меня сожрет весь CPU, я просто не хочу отдавать ей знатный кусок в некоторых невезучих кадрах, который ей можно не отдавать.

Тем более те же плюсовые средства могут сделать это в мгновение ока. (мне не надо перебирать тысячи юнитов за раз, наоборот возможно за кадр мне придется делать несколько подобных запросов, но при сильно меньшем размере массивов, может быть 150 в каждом)
Аватара пользователя
Пользователь
Сообщения: 4069
Bogul писал(а):
У меня посреди некой функции потребовалось узнать кол-во "Юнитов типа А, у игрока Б" и что дальше?

заноси все в нужные массивы, узнать длину массива не проблема.
Аватара пользователя
Пользователь
Сообщения: 12
Prytaleks писал(а):
Bogul писал(а):
У меня посреди некой функции потребовалось узнать кол-во "Юнитов типа А, у игрока Б" и что дальше?

заноси все в нужные массивы, узнать длину массива не проблема.


Так для того, что бы узнать длину массива, нужно сначала сформировать массив из 2х, проходясь ForEach'ем и удаляя не совпадающие значения.

Так же содержание всех эти списков очень громозко и хреново расширяемо. И не то, что бы оно выглядело лучшим решением.
Чем делать это так, легче на ++ уж.
Аватара пользователя
Пользователь
Сообщения: 4069
может я чегото не понимаю но длина массива узнается нодой Length, пиши лучше на с++))
Аватара пользователя
Пользователь
Сообщения: 12
Prytaleks писал(а):
может я чегото не понимаю но длина массива узнается нодой Length,


Да, но для запроса "Давай сюда все ID танков игрока1"
Нужно взять массив "ID юнитов игрока1" и выкинуть из него все ID не содержащиеся в массиве "ID юнитов типа танк".
А ведь, если я захочу не ID, а референсы, то мне придется еще сверх этого парсить MAP "ID юнитов - Референсы"
Или содержать еще с десяток простых.

И вообще, содержать по массиву на каждый параметр по которому хочется быстро получать списки это как то не гибко.

Prytaleks писал(а):
пиши лучше на с++))

Но я не хочу =(
Последний раз редактировалось Bogul 30 янв 2019, 15:15, всего редактировалось 1 раз.
Аватара пользователя
Пользователь
Сообщения: 4069
кстати количество юнитов типа А, также можно хранить в интежере, также порядковый номер в массиве можно хранить в юните. Помоему ты сам себя пугаешь и стараешься видеть все более сложным. МБ это и хорошая тактика я не пробовал.
Аватара пользователя
Пользователь
Сообщения: 4069
Bogul писал(а):
Но я не хочу =(

тогда не пиши))
Аватара пользователя
Пользователь
Сообщения: 12
Prytaleks писал(а):
кстати количество юнитов типа А, также можно хранить в интежере


А мы и не говорим про "кол-во юнитов типа А", мы говорим, про "кол-во юнитов типа А у игрока Б.
Не ну можно конечно под каждый вариант иметь массив и переменную. Но тут встает уже сложность обслуживания этого дела. Ибо 9 типов юнитов, 6 игроков, 2 команды.
Это 72 массива. =)

Prytaleks писал(а):
Также порядковый номер в массиве можно хранить в юните.

А он и хранится, это ID. Порядковый номер в изначальном массиве референсов.

Prytaleks писал(а):
тогда не пиши))

Но мне нужно =(


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница