Пишу свою сборку с нуля

PowerPuffLove

Путник
Участник
Сообщения
19
Розыгрыши
0
Репутация
0
Реакции
2
Баллы
3
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
Vasyan.NET
Всем привет! Я вот уже 12 лет занимаюсь кодингом пять дней в неделю по 8 часов в день и решил попробовать ради эксперимента написать свою сборку.
В качестве ЯП буду использовать C# на .NET фреймворке. В помощь себе беру Claude c подпиской за 200 баксов и этот форум как источник костылей и велосипедов, информации о багах/дюпах. В качестве интереса готов ответить на все ваши вопросы и поделиться всей инфой по архитектуре ядра. Буду признателен если вы задушите меня техническими вопросами и будете меня критиковать на каждом шагу, чтобы я смог использовать вашу критику для улучшения будущей сборки. По поводу раздачи исходников я пока не решил - на данный момент исходники показывать не буду, но возможно после получения того или иного результата, поменяю свое мнение.

По плану в MVP хочу сделать серверную сборку для IL хроник, но с возможностью дальнейших расширений под любые будущие хроники. Я понимаю, что механики сильно меняются от хроники к хронике, некоторые кардинально, это будет учтено в архитектуре ядра. Такую дельту между хрониками планирую реализовывать в виде подключаемых и отключаемых плагинов.

Проанализировав код расшаренных Java сборок, я сделал вывод, что многопоточная архитектура с блокировками несет большой риск дэдлоков и гонок, приводящих к дюпам, поэтому я думаю сделать сборку на тиковой системе. Условно положим тик сервера = 100мс.

За время одного тика сервер буферизирует все приложенные к нему пакеты и в конце тика делает транзакционную запись в БД. Таким образом, если пользователь выкинул что-то из инвентаря на пол, операция удалить предмет из инвентаря и положить предмет на пол будет атомарна и выполнена в транзакции - если что-то пошло не так, то откатятся оба действия.

Также тиковый подход исключит любые гонки и блокировки потоков, но не запретит параллельную обработку буфера. В текущих ява сборках при PVP удар игрока по другому игроку может обработаться сервером не последовательно во времени, а по порядку, который определила ОС при обработке потоков. Мне кажется это нифига не честно :)

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

Также я откажусь от использования ООП для работы с игровыми объектами, чтобы исключить лишние аллокации и не загружать сборщик мусора. Но об этом я расскажу в следующем посте, если соберу позитивный фидбек от вас. Спасибо, что прочитали.
 
Т.е., получается у Вас будет 1 поток с тиком в 100мс ? А какой .net будете использовать ? А так да, это интересно, исходников С6 полно для изучения пакетки, ПТС тоже есть, так что проблем с инфой быть не должно.
 
Последнее редактирование:
Т.е., получается у Вас будет 1 поток с тиком в 100мс ? А какой .net будете использовать ? А так да, это интересно, исходников С6 полно для изучения пакетки, ПТС тоже есть, так что проблем с инфой быть не должно.
Нет, не один поток. Мир один, и тик у него один. Внутри тика работа идёт параллельно, единица работы - ячейка сетки видимости(об этом позже). Сначала намерения собираются параллельно, затем состояние меняется в конечной фазе тика. Сущности взаимодействующие в рамках одного тика обрабатываются одним потоком, например в разных частях карты два пвп 9х9 и мы совершенно спокойно можем расчитывать их взаимодействие через многопоток. Как я буду знать, что многопоток ничего не ломает? Ограничу число потоков на 1 и проверю результаты. Если совпадают - тест пройден. Pathfinding, сеть и БД работают вне тика, в своих пулах. На первых тестах хочу укладываться в 80 мс из 100 за тик. Тик задаётся параметром, можно поставить 50 мс.
Использовать буду .NET 10
 
идея прикольная за тик, но если это идея такая классная почему её никто не реализовал ?) есть ли подводные камни в этом
 
Почему я решил отказаться от ООП? Надо обработать огромное количество взаимодействий за один тик. Каждый проход по адресу - это промах кэша процессора. Также Stateful подход позволяет допускать ошибки при кодинге, любое персистентное состояние объекта - это риск и удар по детерминизму. Тобишь фарш невозможно откатить назад, я не смогу по логам точно воспроизвести ошибку или баг. В исходниках сборок для каждого класса я вижу куча непонятных ифов, проверок, опять же очень легко что-нибудь забыть и потерять.

Мне кажется для ядра такой игрухи как линейка подойдет Data-driven подход. Горячие данные будут храниться в массивах. Например массив хп всех игроков на сервере, массив эффектов, и т.д. Тогда память будет выделяться линейно и не будет никаких аллокаций в куче, что значительно ускорит обработку. При этом все операции требующие запись в БД будут обрабатываться в шаге Resolve. То есть в момент обработки тика будут накапливаться "намерения", а потом одной транзакцией в конце тика они будут попадать в БД. Но это пока в теории.

Сразу предвижу вопросы про то, что это будет похоже на пошаговую стратегию. Во-первых, клиент отлично интерполирует всё, во-вторых, сами анимации ударо и каста длятся сравнительно столько же. В любом случае, это надо будет тестировать на примере. уже.
Если вы считаете, что тут много подводных камней и булыжников, буду благодарен за любую критику и попытки сломать мою идею. Я попробую отбиться от любого комментария. В любом случае, это будет интересный эксперимент для меня и если я обсренькаюсь, то я по крайней мере зафиксирую здесь на форуме раз и навсегда, чтобы никто больше не пытался этого делать :) Токенов у меня вагон все равно.
 
Всем привет! Я вот уже 12 лет занимаюсь кодингом пять дней в неделю по 8 часов в день и решил попробовать ради эксперимента написать свою сборку.
В качестве ЯП буду использовать C# на .NET фреймворке. В помощь себе беру Claude c подпиской за 200 баксов и этот форум как источник костылей и велосипедов, информации о багах/дюпах. В качестве интереса готов ответить на все ваши вопросы и поделиться всей инфой по архитектуре ядра. Буду признателен если вы задушите меня техническими вопросами и будете меня критиковать на каждом шагу, чтобы я смог использовать вашу критику для улучшения будущей сборки. По поводу раздачи исходников я пока не решил - на данный момент исходники показывать не буду, но возможно после получения того или иного результата, поменяю свое мнение.

По плану в MVP хочу сделать серверную сборку для IL хроник, но с возможностью дальнейших расширений под любые будущие хроники. Я понимаю, что механики сильно меняются от хроники к хронике, некоторые кардинально, это будет учтено в архитектуре ядра. Такую дельту между хрониками планирую реализовывать в виде подключаемых и отключаемых плагинов.

Проанализировав код расшаренных Java сборок, я сделал вывод, что многопоточная архитектура с блокировками несет большой риск дэдлоков и гонок, приводящих к дюпам, поэтому я думаю сделать сборку на тиковой системе. Условно положим тик сервера = 100мс.

За время одного тика сервер буферизирует все приложенные к нему пакеты и в конце тика делает транзакционную запись в БД. Таким образом, если пользователь выкинул что-то из инвентаря на пол, операция удалить предмет из инвентаря и положить предмет на пол будет атомарна и выполнена в транзакции - если что-то пошло не так, то откатятся оба действия.

Также тиковый подход исключит любые гонки и блокировки потоков, но не запретит параллельную обработку буфера. В текущих ява сборках при PVP удар игрока по другому игроку может обработаться сервером не последовательно во времени, а по порядку, который определила ОС при обработке потоков. Мне кажется это нифига не честно :)

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

Также я откажусь от использования ООП для работы с игровыми объектами, чтобы исключить лишние аллокации и не загружать сборщик мусора. Но об этом я расскажу в следующем посте, если соберу позитивный фидбек от вас. Спасибо, что прочитали.
занимайтесь лучше этим и "вылизывайте" используя ИИ
толку будет в разы лучше, так как источник ОФФ сервер а не костыли и форум
 
занимайтесь лучше этим и "вылизывайте" используя ИИ
толку будет в разы лучше, так как источник ОФФ сервер а не костыли и форум
Да, я видел эту тему. Я скачал эти сорсы и тоже их использую для анализа
 
Да, я видел эту тему. Я скачал эти сорсы и тоже их использую для анализа
В качестве ЯП буду использовать C# на .NET фреймворке.
Как вариант, но я бы выбрал Rust + сетку токио
Думаю ИИ это по силам
Это бы закрыло минусы С++ и сразу бы принесло нормальную сетку
Фреймворки не нужны для ММО игр, так как тут много логики своей и они будет только мешать и накладывать свой стиль
 
На самом деле язык программирования меня не столь сильно волнует, просто я C# разработчик, меня волнует сама серверная архитектура и подходы, которые позволят избежать кучи ифов, багов, дюпов, двойных сессий и прочего. Самое главное кмк это придумать такую устойчивую архитектуру. И вот тиковые подходы на самом деле это не так плохо, и я попробую это доказать.
 
На самом деле язык программирования меня не столь сильно волнует, просто я C# разработчик, меня волнует сама серверная архитектура и подходы, которые позволят избежать кучи ифов, багов, дюпов, двойных сессий и прочего. Самое главное кмк это придумать такую устойчивую архитектуру. И вот тиковые подходы на самом деле это не так плохо, и я попробую это доказать.
Ну не суть
Я о том что тут на форуме вас ждет 2 варианта
1. если что то выложите толковое на шару - возможно скажут спасибо
2. по остальному никакой помощи не будет, не надо романтизировать форум ))
Так что лучше брать ОФФ сервер и ИИ "задрачивать" вопросами, потому что иначе... ну думаю со временем разберетесь на счет
и этот форум как источник
:Kukukuh:
 
На самом деле язык программирования меня не столь сильно волнует
А должно волновать. Как минимум нельзя использовать язык программирования оригинала. Как ты думаешь почему все это время используют JAVA и только для эмуляции оригинала? Это же не просто так.
 
Ну не суть
Я о том что тут на форуме вас ждет 2 варианта
1. если что то выложите толковое на шару - возможно скажут спасибо
2. по остальному никакой помощи не будет, не надо романтизировать форум ))
Так что лучше брать ОФФ сервер и ИИ "задрачивать" вопросами, потому что иначе... ну думаю со временем разберетесь на счет

:Kukukuh:
В таком случае буду просто вести здесь свой дневник, может кому-то будет интересно как это все работает и проектируется изнутри.
Первая цель, которую я себе ставлю - поднять тестовый сервер на своей сборке и дать сюда способ на него зайти и побегать вместе со мной. По шагам буду держать в курсе.
На данный момент я отправил агентов на:
1) Анализ открытых баз данных по механикам PTS интерлюда.
2) Анализ этого форума
3) Анализ aCis Mobius и слитых исходников Salvation для создания сравнительной характеристики по каждой формуле, механике, скиллу и т.п.
4) Анализ потенциальных проблем в текущих слитых сборках на предмет дедлоков, дюпов, багов и т.п. Экстракция конфликтных решений в механиках игры.

Сам в это время веду диалог с клодом по поводу нефункциональных требований к архитектуре ядра и разрабатываю решения по архитектуре.

По поводу вопроса о выборе языка программирования? Java, насколько мне известно, выбрали, потому что L2j был первым крупным самописным сервером, и все сборки - это его форки по сути. Я вообще не вижу никакой проблемы выбрать любой язык программирования, что от этого меняется? Если соблюсти все контракты взаимодействия клиента и сервера, то какая разница?
 
поднять тестовый сервер на своей сборке и дать сюда способ на него зайти и побегать вместе со мной.
Я думаю это будет ваше первое разочарование )))
бегать скорее всего вы будите на нем сами
:Twinkle:
Сообщение объединено:
Java, насколько мне известно, выбрали, потом
Потому что это это было 20+ лет назад
И тогда выбор был или с++ или ява, или C# который в то время (опять же 20 лет назад) был не более чем продвинутым Visual Basic
 
По поводу вопроса о выборе языка программирования? Java, насколько мне известно, выбрали, потому что L2j был первым крупным самописным сервером, и все сборки - это его форки по сути. Я вообще не вижу никакой проблемы выбрать любой язык программирования, что от этого меняется? Если соблюсти все контракты взаимодействия клиента и сервера, то какая разница?
L2jServer был самым крупным самописным сервером потому что в правовом поле до него не могли докопаться юристы. Я как то у канадца играл в далекие времена, он за основу ПТС взял, 2 месяца продержался а потом пришли юристы от NCSoft и приземлили его на 25 000 канадцких баксов и условный срок. Сервер закрыли. Да можно сослаться что ты в РФ и тебе фиолетово только вот в РФ тоже есть правообладатели и при этом они не хило так всем солят. Угнова была, сейчас не знаю кто, вроде перекупили их.
 
В помощь себе беру Claude c подпиской за 200 баксов
ты так и пиши, код будет писать ИИ, а фидбек и баги промтом будешь скидывать ИИ. а то я разработчик, я программист
 
ты так и пиши, код будет писать ИИ, а фидбек и баги промтом будешь скидывать ИИ. а то я разработчик, я программист
Одно другому не мешает, можно быть разработчиком и писать с помощью ИИ. Зачем мне руки марать на пет проекте. Одна из целей проекта посмотреть как ИИ с этим справится. Но ты не думай, что я просто написал ему: "Сделай мне л2 сервер шобы был быстрый, не допускай ошибок". Я работаю исключительно через спецификацию. А спецификацию ИИ не напишет самостоятельно.
 
PowerPuffLove, так причем то, что ты типо программист со стажем и такой крутой, если изначально собираешься промтами ИИ закидать? Зачем такие пафосы. В начале темы одно, под конец вышел сок. Тут таких много на форуме, пака подписка не кончается или фри период.
 
Назад
Сверху Снизу