<?xml version="1.0"?><!-- generator="bbPress" -->

<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

<channel>
<title>Erlang по-русски. Форум Тема: Какую структуру данных выбрать?</title>
<link>http://erlang.dmitriid.com/forum/</link>
<description>Erlang по-русски. Форум Тема: Какую структуру данных выбрать?</description>
<language>en</language>
<pubDate>Tue, 18 Nov 2008 04:18:25 +0000</pubDate>

<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-38</link>
<pubDate>Mon, 01 Oct 2007 14:29:25 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">38@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Интересно. С этого момента мне уже сложно что-либо посоветовать, так как увы, в геймдеве, а темболее в MMO гемдеве более, чем несведущ :)&lt;/p&gt;
&lt;p&gt;Но интересно будет узнать, как оно будет дальше развиваться. Блог о похождениях планируется? :)&lt;/p&gt;
&lt;p&gt;Кстати, я вспомнил/нашел вот такие ссылки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.erlang-consulting.com/thesis/mmog_server_in_erlang.html&quot;&gt;A Virtual World Distributed Server developed in Erlang as a Tool for analysing Needs of Massively Multiplayer Online Game Servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.erlang-fr.org/articles/thierry_mallard_001-en.html&quot;&gt;Is Erlang adapted to a massively multi-player online role game (MMPORG)?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.erlang.se/euc/03/proceedings/0950Mikael.pdf&quot;&gt;REI: An Online Video Gaming platform&lt;/a&gt; (к сожалению, проект более не существует, но идеи из презентации, думаю, можно будет почерпнуть)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;И еще я знаю, что MMORPG &lt;a href=&quot;http://www.vendetta-online.com/h/news.html&quot;&gt;Vendetta Online&lt;/a&gt; переписали код AI своих NPC на Эрланге, правда деталей они особо не сообщали (по ссылке см. новости за 25 июня, 18 июля, 4 августа, 18 августа).&lt;/p&gt;
&lt;p&gt;В общем, чем богаты... :)
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-37</link>
<pubDate>Sat, 29 Sep 2007 13:31:55 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">37@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Сам игрок это уже несколько объектов: физический, объёма V1, обасть видимости, объёма V2, область чата, объёма V3, дальность использования предмета в руках, объём V4. И этот список можно продолжить. Кроме игроков двигаются и другие предметы - мобы, НПЦ, просто ящики/бочки, если их пнуть. У меня похожая на вашу идея реализации, там каждый объект объёма V содержит список всех объектов которые в него попали целиком и список тех объектов, с которыми он пересекается. Можно добавить даже ячейки, это просто будет недвижимый объект, имеющий объём - и он будет включать все мелкие объекты, а саму ячейку будет как ты сказал &quot;всасывать&quot; любой крупный объект. + у меня там сортировка для бытрого определения соседних объектов, она после каждого перемещения делается.&lt;br /&gt;
Требования про 2 мкс из первого поста - это с учётом всех этих оптимизаций, считал для 1000 игроков. 60 млн объектов - это в основном ландшафт. Локация 4 на 4 км, изменение высоты каждый метр = 16 млн объектов. Делаем 20 млн для учёта игроков, деревьев и всего остального. Раскладываем по 3-м осям пространства (x, y, z) - и того 60 млн объектов).&lt;br /&gt;
Потом я решил вынести ландшафт в отдельную структуру, в карту высот. Но тогда мне нужны массивы, а их нету в эрланге. В общем похоже физику я буду делать на сях.
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-36</link>
<pubDate>Fri, 28 Sep 2007 13:56:44 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">36@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;&amp;gt; И мы будем иметь 10 000 локальных списков, каждый под свою ячейку, каждый из которых надо обрабатывать. И в сумме это даст тот же самый объём объёктов, и даже больше&lt;/p&gt;
&lt;p&gt;Объем-объемом, но каждый из этих списков будет обрабатываться не одним процессом, а, скажем, тысячью. Да еще в дереве каком-нить, например:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
- глобальный супервизор района&lt;br /&gt;
&amp;#160; |&lt;br /&gt;
&amp;#160; &amp;#160; - супервизор кластера ячеек&lt;br /&gt;
&amp;#160; &amp;#160; &amp;#160; |&lt;br /&gt;
&amp;#160; &amp;#160; &amp;#160; &amp;#160; - супервизор ячейки&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;где глобальный супервизор занимается только регистрацией входящих/исходящих из района игроков&lt;/p&gt;
&lt;p&gt;его worker'ы - это супервизоры кластеров ячеек, коорые отслеживают состояние каких-либо перемещающихся объектов в пределах кластера&lt;/p&gt;
&lt;p&gt;их worker'ы собственно занимаются обработкой объектов непосредственно в ячейке - обработка всех необходимых collisions и проч.&lt;/p&gt;
&lt;p&gt;Это если максимально упростить. Можно представить себе &quot;плавающий супервизор&quot;, привязаный к игроку, который всасывает в себя ячейки по мере перемещения из pool'а ячеек (ну и забывает о ненужных ячейках по мере продвижения).&lt;/p&gt;
&lt;p&gt;Ячейки могут быть произвольно большими - например, на расстояние выстрела из лука.
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-35</link>
<pubDate>Fri, 28 Sep 2007 13:37:13 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">35@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;2 ЗВЕР. Я тебя понял, но я делаю ММОРПГ. Игроки могут разбрестись по всей карте, и в идеале они даже должны так сделать - если на карте есть незаполненые игроками места - это плохая карта. А раз они все разбрелись, то заполнили все ячейки. И мы будем иметь 10 000 локальных списков, каждый под свою ячейку, каждый из которых надо обрабатывать. И в сумме это даст тот же самый объём объёктов, и даже больше (ведь 1 объёкт попадёт в списки всех соседних по отношению к нему ячеек, т.е. будет 9 копий этього объекта).&lt;br /&gt;
Я придумал более сложную систему сортировки, т.к. эрланг позволяет создавать очень сложные структуры из-за своей безтиповости.&lt;br /&gt;
Но всё равно у меня есть ландшафт и дял него есть карта высот. А карта высот это двумертый массив, в котором x и y индексы, а z получаемое значение. Вот и жалею что в эрланге нету массивов(
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-34</link>
<pubDate>Fri, 28 Sep 2007 09:26:54 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">34@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;&amp;gt; Буду надеятся что nth работает достаточно быстро&lt;/p&gt;
&lt;p&gt;К сожалению, nth - это линейный поиск, то есть на больших списках он буде дико тормозить :)&lt;/p&gt;
&lt;p&gt;Кстати, есть же другие способы ранения объектов - двоичные деревья, например.
&lt;/p&gt;</description>
</item>
<item>
<title>3BEP   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-33</link>
<pubDate>Fri, 28 Sep 2007 00:16:05 +0000</pubDate>
<dc:creator>3BEP</dc:creator>
<guid isPermaLink="false">33@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Наверно я плохо объяснил свою мысль. Попробую поподробнее.&lt;br /&gt;
Вместо глобального списка использовать набор локальных списков, каждый из которых считается в своем потоке. Для построения таких локальных списков карту разделить на ячейки. Ячейки могут быть как пассивные - сообщают список находящихся в них объектов по запросу, так и активные - рассылают подписавшимся объектам события входа/выхода.&lt;br /&gt;
Для примера, предположим что квадратная карта разделена на 100х100 ячеек. &quot;Поле зрения&quot; каждого из объектов не более одной ячейки. Тогда объект находящийся в центре одной из ячеек может &quot;увидеть&quot; только объекты в своей и восьми соседних ячейках. Если объекты распределены равномерно по всей карте - то локальный список будет составлять только 9/10000 от общего числа объектов. Остальные объекты в этот список просто не попадут. Меняя размер ячейки и радиус &quot;поля зрения&quot; можно регулировать размеры этого локального списка. И соответственно время отклика. Так как для каждого игрока создается свой локальный список и обрабатывается этот список независимо от остальных, то получаем фиксированное время отклика и прекрасно масштабируемую систему.
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-32</link>
<pubDate>Thu, 27 Sep 2007 18:29:31 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">32@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Сетка на карте конечно будет. Но количество объектов это не поменяет). Буду надеятся что nth работает достаточно быстро. Если он пробегает весь список до индекса - это плохо.
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-31</link>
<pubDate>Mon, 24 Sep 2007 07:23:21 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">31@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;&amp;gt; Теперь мне надо найти аналог массива в эрланге, т.е. доступ по индексу чтоб был. Есть такое?&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.erlang.org/doc/man/lists.html&quot;&gt;&lt;code&gt;lists:nth/2&lt;/code&gt;&lt;/a&gt; - доступ к элементам списка по индексу:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;code&gt;&lt;br /&gt;
L = &amp;#91;a, b, c],&lt;br /&gt;
lists:nth(2, L). %% вернет b&lt;br /&gt;
&lt;/code&gt;
&lt;/p&gt;&lt;/blockquote&gt;</description>
</item>
<item>
<title>3BEP   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-30</link>
<pubDate>Sat, 22 Sep 2007 22:05:53 +0000</pubDate>
<dc:creator>3BEP</dc:creator>
<guid isPermaLink="false">30@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Я бы предложил набросить на карту сетку с большим размером ячейки. Каждую ячейку выделить в отдельный объект, знающий кто в ней находится и знающий ближайшие соседи-ячейки. Тогда при входе в ячейку игровой объект регистрируется сам - только свой идентификатор (возможно PID). При выходе из ячейки - сообщает об этом. Ну и может запросить список зарегистрированных в ячейке объектов. Игровой объект может сам определять свою траекторию и опрашивать близкие к ней ячейки. А всего остального для такого объекта не существует - микровселенная.
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-29</link>
<pubDate>Sat, 22 Sep 2007 19:12:27 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">29@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Да, но как определить какие объекты ему нужны для взаимодействия? Вот для этого и создано общее индексированое хранилище. Потом во время взаимодействия для объектов создаётся свой процесс и уже в этом процессе они локально обсчитываются.&lt;br /&gt;
Я решил убрать из хранилища землю. Тогда конечно появляются неприятности с подземными ходами/тоннелями, но зато экономия памяти весьма значительна.&lt;br /&gt;
Теперь мне надо найти аналог массива в эрланге, т.е. доступ по индексу чтоб был. Есть такое?
&lt;/p&gt;</description>
</item>
<item>
<title>3BEP   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-28</link>
<pubDate>Thu, 20 Sep 2007 01:39:45 +0000</pubDate>
<dc:creator>3BEP</dc:creator>
<guid isPermaLink="false">28@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;А единое хранилище такой большой емкости действительно необходимо?&lt;br /&gt;
Может имеет смысл отказаться от единой сцены в пользу концепции &quot;каждый объект - пуп своей вселенной&quot;. Маленькой такой вселенной, куда входят только те объекты с которыми возможно взаимодействие в ближайшие несколько секунд. И хранить для каждого объекта только его собственную вселенную.
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-27</link>
<pubDate>Wed, 19 Sep 2007 13:14:54 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">27@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Вот еще ответ: &lt;/p&gt;
&lt;p&gt;здесь: &lt;a href=&quot;http://rsdn.ru/forum/message/2662478.1.aspx&quot; rel=&quot;nofollow&quot;&gt;http://rsdn.ru/forum/message/2662478.1.aspx&lt;/a&gt;&lt;br /&gt;
и продолжение: &lt;a href=&quot;http://rsdn.ru/forum/message/2662503.1.aspx&quot; rel=&quot;nofollow&quot;&gt;http://rsdn.ru/forum/message/2662503.1.aspx&lt;/a&gt;
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-26</link>
<pubDate>Wed, 19 Sep 2007 07:58:20 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">26@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;&amp;gt; Нет, я не знаю этого сайта&lt;/p&gt;
&lt;p&gt;просто у вас на сайте он есть :)&lt;/p&gt;
&lt;p&gt;&amp;gt; Тоже склоняюсь к мнезии, но хотел знать, может что получше по производительности есть.&lt;/p&gt;
&lt;p&gt;в общем, на РСДН сказали, что надо писать на С :) &lt;a href=&quot;&quot;&gt;http://rsdn.ru/forum/message/2661952.aspx&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Такое очень сложно сделать без мутируемых структур — говорю по опыту&lt;/p&gt;
&lt;p&gt;Проще взять и написать модуль на С++, с использованием Boost.MultiIndex. Естественно, все должно хранится в памяти.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;В erlang-questions же &lt;a href=&quot;http://forum.trapexit.org/mailinglists/viewtopic.php?t=9730&quot;&gt;предложили&lt;/a&gt; использовать BerkleyDB (где-то в рассылке пробегала ссылка на драйвера к BDB). &lt;a href=&quot;http://lionet.livejournal.com/18422.html&quot;&gt;Говорят&lt;/a&gt;, что появится нативный драйвер к BDB от SleepyCat/Oracle.&lt;/p&gt;
&lt;p&gt;В общем, хз :) &lt;/p&gt;
&lt;p&gt;Вообще-то хорошо бы еще задать вопрос о возможной архитектуре на специализированных геймерских форумах. Возможно, не придется манипулировать таким количеством объектов :)&lt;/p&gt;
&lt;p&gt;Вот еще получил такое вот письмо:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
You'd need fragmented mnesia tables. If you want to put this all on&lt;br /&gt;
one node, you have to use 64-bit erlang. You'll need a lot more than&lt;br /&gt;
3GB as you need space for the index tables for all other columns.&lt;br /&gt;
Forget about dets if you need read access in 2us. You have to use&lt;br /&gt;
mnesia disc_copies.
&lt;/p&gt;&lt;/blockquote&gt;</description>
</item>
<item>
<title>architect   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-25</link>
<pubDate>Tue, 18 Sep 2007 18:28:23 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">25@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Нет, я не знаю этого сайта. Я хочу писать сервак для ММОРПГ на эрлаанге. 60 миллионов объектов - это для обнаружения коллизий (тут и физика, и поле видимости, и чат и вообще всё что можно придумать о взаимодействии объектов в пространстве). Сейчас думаю над архитектурой и читаю про библиотеки разные. Тоже склоняюсь к мнезии, но хотел знать, может что получше по производительности есть.
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-24</link>
<pubDate>Tue, 18 Sep 2007 17:53:48 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">24@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;ЗЫ. В качестве полного оффтопа :) &lt;/p&gt;
&lt;p&gt;Не знаю, имеешь ли ты отношение непосредственно к heroez.net, но я там когда-то давно был зарегистрирован и даже активно участвовал на самой заре под ником Illiarian. Если вдруг знакомы будет интересно (8 миллиардов сайтов и тут на тебе - знакомые :) )
&lt;/p&gt;</description>
</item>
<item>
<title>dmitriid   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-23</link>
<pubDate>Tue, 18 Sep 2007 17:49:28 +0000</pubDate>
<dc:creator>dmitriid</dc:creator>
<guid isPermaLink="false">23@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Предположу, что используя ets/dets или mnesia.&lt;/p&gt;
&lt;p&gt;Продублировал этот вопрос на RSDN, &lt;a href=&quot;http://rsdn.ru/forum/message/2661663.1.aspx&quot; rel=&quot;nofollow&quot;&gt;http://rsdn.ru/forum/message/2661663.1.aspx&lt;/a&gt; и в erlang-questions. Посмотрим, что ответят гуру :)
&lt;/p&gt;</description>
</item>
<item>
<title>architect   "Какую структуру данных выбрать?"</title>
<link>http://erlang.dmitriid.com/forum/topic/11#post-22</link>
<pubDate>Tue, 18 Sep 2007 16:36:35 +0000</pubDate>
<dc:creator>architect</dc:creator>
<guid isPermaLink="false">22@http://erlang.dmitriid.com/forum/</guid>
<description>&lt;p&gt;Мне надо обрабатывать очень большой массив однотипных структур - всего их порядка 60 миллионов. Каждая структура вида {PID, type (atom), direct (atom), index (Integer), nextind (Integer), prevind (Integer), position (Integer)}. Я думаю такая структура займёт около 50 байт, и того на весь массив надо 60 * 50 = 3 ГБ. А это значит массив желательно должен частично сбрасываться на диск. Плюс нужен быстрый доступ по полям PID, index, nextind, prevind: время поиска нужной структуры по этим полям должно составлять около 2 мкс, время их записи - столько же. Запись и чтение часто идёт в одни и те же структуры (обчно их всего около 30 000, остальные просто ждут). Вопрос: как мне организовать такой массив?
&lt;/p&gt;</description>
</item>

</channel>
</rss>
