История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
В играх есть такая оптимизация называется пространственное хеширование (spatial hashing) суть её заключается в том что у тебя в сцене могут быть 10005000 объектов и тебе в момент времени нужно узнать с какими из них можно взаимодействовать. Для этого пространство разбивается на блоки фиксированной ширины и высоты, а каждое действие объекта приводит к пересчёту того в каком блоке он сейчас находится, так игрок окружённый миллионом шариков может взаимодействовать лишь с 50тью например, лопнув их иголкой, а до остальных он просто не дотянется и они будут просто проигнорированы всеми расчётами.
Суть в том что пространство можно заменить на время, к блоки на временные отрезки, действие пользователя приводит к тому что он помещается во временной отрезок (аля пространственный блок) ближе к которому находится.
Если пользователь запрашивает количество пользователей онлайн, то сначала так как он произвёл действие пересчитывается в какой блок времени попал он, его туда и помещаем. Затем мы смотрим на текущее время ищем блок текущего времени и отображаем с нужной точностью кто онлайн, сейчас, в течении часа и двух часов и так далее просто охватывая выборку с всё большего пространства, ну например если он челиков нет инфы два часа, а наш блок размером в час то в выдачу попадут лишь те кто проявлял активность в ближайший час и всё.
хранить всё в оперативке.
Вот для наглядности онлайн пример
Подвигай квадратик и просто представь что он это текущий час в сутках который постоянно движется, пространство это время, а шарики это пользователи положение которых соответствует их последней активности.
Так можно компактно хранить и обрабатывать миллионы записей в реальном времени, большая часть данных отдачи будет просто не обрабатываться, например если таймаут активности час, то все кто вне этого часа просто никогда не будут обработаны. Вся нагрузка это будет вынуть ники и отдать его пользователю, то есть тупо трафик.
Единственный минус, тебе нужно по любому действию пользователя перемещать его в этом временном пространстве. Но, это фигня и на грани погрешности в сравнении с отдачей пользователю данных в ответ на его активность.
Исправление LINUX-ORG-RU, :
В играх есть такая оптимизация называется пространственное хеширование (spatial hashing) суть её заключается в том что у тебя в сцене могут быть 10005000 объектов и тебе в момент времени нужно узнать с какими из них можно взаимодействовать. Для этого пространство разбивается на блоки фиксированной ширины и высоты, а каждое действие объекта приводит к пересчёту того в каком блоке он сейчас находится, так игрок окружённый миллионом шариков может взаимодействовать лишь с 50тью например, лопнув их иголкой, а до остальных он просто не дотянется и они будут просто проигнорированы всеми расчётами.
Суть в том что пространство можно заменить на время, к блоки на временные отрезки, действие пользователя приводит к тому что он помещается во временной отрезок (аля пространственный блок) ближе к которому находится.
Если пользователь запрашивает количество пользователей онлайн, то сначала так как он произвёл действие пересчитывается в какой блок времени попал он, его туда и помещаем. Затем мы смотрим на текущее время ищем блок текущего времени и отображаем с нужной точностью кто онлайн, сейчас, в течении часа и двух часов и так далее просто охватывая выборку с всё большего пространства, ну например если он челиков нет инфы два часа, а наш блок размером в час то в выдачу попадут лишь те кто проявлял активность в ближайший час и всё.
хранить всё в оперативке.
Вот для наглядности онлайн пример
Подвигай квадратик и просто представь что он это текущий час в сутках который постоянно движется, пространство это время, а шарики это пользователи положение которых соответствует их последней активности.
Так можно компактно хранить и обрабатывать миллионы записей в реальном времени, большая часть данных отдачи будет просто не обрабатываться, например если таймаут активности час, то все кто вне этого часа просто никогда не будут обработаны. Вся нагрузка это будет вынуть ники и отдать его пользователю, то есть тупо трафик.
Единственный минус, тете нужно по любому действию пользователя перемещать его в этом временном пространстве. Но, это фигня и на грани погрешности в сравнении с отдачей пользователю данных в ответ на его активность.
Исходная версия LINUX-ORG-RU, :
В играх есть такая оптимизация называется пространственное хеширование (spatial hashing) суть её заключается в том что у тебя в сцене могут быть 10005000 объектов и тебе в момент времени нужно узнать с какими из них можно про взаимодействовать. Для этого пространство разбивается на блоки фиксированной ширины и высоты, а каждое действие объекта приводит к пересчёту того в каком блоке он сейчас находится, так игрок окружённый миллионом шариков может взаимодействовать лишь с 50тью например, лопнув их иголкой, а до остальных он просто не дотянется и они будут просто проигнорированы всеми расчётами.
Суть в том что пространство можно заменить на время, к блоки на временные отрезки, действие пользователя приводит к тому что он помещается во временной отрезок (аля пространственный блок) ближе к которому находится.
Если пользователь запрашивает количество пользователей онлайн, то сначала так как он произвёл действие пересчитывается в какой блок времени попал он, его туда и помещаем. Затем мы смотрим на текущее время ищем блок текущего времени и отображаем с нужной точностью кто онлайн, сейчас, в течении часа и двух часов и так далее просто охватывая выборку с всё большего пространства, ну например если он челиков нет инфы два часа, а наш блок размером в час то в выдачу попадут лишь те кто проявлял активность в ближайший час и всё.
хранить всё в оперативке.
Вот для наглядности онлайн пример
Подвигай квадратик и просто представь что он это текущий час в сутках который постоянно движется, пространство это время, а шарики это пользователи положение которых соответствует их последней активности.
Так можно компактно хранить и обрабатывать миллионы записей в реальном времени, большая часть данных отдачи будет просто не обрабатываться, например если таймаут активности час, то все кто вне этого часа просто никогда не будут обработаны. Вся нагрузка это будет вынуть ники и отдать его пользователю, то есть тупо трафик.
Единственный минус, тете нужно по любому действию пользователя перемещать его в этом временном пространстве. Но, это фигня и на грани погрешности в сравнении с отдачей пользователю данных в ответ на его активность.