|
|
|
RunUO как база для сервера ММО? |
|
|
Juzzver |
30.8.2016, 14:42
|
Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008 Группа: Супермодераторы Наличность: 22566 Из: Северная Корея
Пользователь №: 11.273
|
Есть наработки по клиентам с открытым исходным кодом на том же C#, можно брать и прорабатывать, совершенствовать на свой лад.
Максимальный онлайн скорее будет упираться в системные ресурсы, т.к. на сервере все выполняется в одном потоке. Оптимизации конечно помогут еще что-то выиграть, но это дело затратное.
Естественно работает сборщик мусора, но его работа будет зависеть напрямую от качества кода.
Исходники, лично по моему мнению, находятся вполне в хорошем состоянии, легко читаются, легко модифицируются. Любую задачу можно решить множеством способов, чем мне и нравится ранка.
Конечно если говорить о полной расширяемости и серьезных изменениях - в этом плане почти любой продукт будет ограничен. Я видел переписанные сборки ранки по принципам проектирования SOLID, они сложнее в понимании, но зато легко расширяемые, и такой код можно кусками вырывать, вставляя куда либо еще(если конечно в другом месте так же всё ровно реализовано). Но конечно и там еще есть что дорабатывать.
Я бы лучше всё таки смотрели в сторону Unity, можно взять готовый шаблон и дорабатывать его уже по своему усмотрению, зато на выходе получить свой, кросс-платформенный ,ни в чем неограниченный продукт.
--------------------
|
|
|
|
EL-GReeN |
30.8.2016, 16:15
|
Journeyman
Сообщений: 474
Регистрация: 18.7.2011 Группа: Пользователи Наличность: 0 Из: Россия
Пользователь №: 13.815
Возраст: 32
|
Цитата Есть наработки по клиентам с открытым исходным кодом на том же C#, можно брать и прорабатывать, совершенствовать на свой лад. Где посмотреть? И вопрос скорее именно про сервер а не про клиент, юнити для клиента может и зайдет но не когда это просто хобби с одним кодером, слишком много времени сожрет, в том числе и с графонием там сложнее(учись сам моделить или покупай). Цитата Максимальный онлайн скорее будет упираться в системные ресурсы, т.к. на сервере все выполняется в одном потоке. Оптимизации конечно помогут еще что-то выиграть, но это дело затратное. Вот чего в исходнике есть: Код if( m_MultiProcessor || Is64Bit ) Console.WriteLine( "Core: Optimizing for {0} {2}processor{1}", m_ProcessorCount, m_ProcessorCount == 1 ? "" : "s", Is64Bit ? "64-bit " : "" );
--------------------
|
|
|
|
Juzzver |
30.8.2016, 21:03
|
Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008 Группа: Супермодераторы Наличность: 22566 Из: Северная Корея
Пользователь №: 11.273
|
Цитата Где посмотреть? https://github.com/ZaneDubya/UltimaXNAЦитата И вопрос скорее именно про сервер а не про клиент, юнити для клиента может и зайдет но не когда это просто хобби с одним кодером, слишком много времени сожрет, в том числе и с графонием там сложнее(учись сам моделить или покупай). Что бы ты не начал рыть в этом направлении, всё равно сожрет много времени. Много готовых уникальных моделей, включая крутые карты можно купить, это будет проще, чем самому возиться, где еще сомнительный результат качества выйдет)). В любом случае, ранка хороший пример, если смотреть на какие то реализации. К примеру тот же поиск пути, обход преград и т.п. фишки - с нуля писать достаточно сложно, всякие волновые алгоритмы придется использовать, учитывать тематические нюансы и т.д. А так глянул в ранку, уже понял что к чему (IMG: style_emoticons/default/smile.gif) Если под ранкой перевести уо на браузер - это будет бомба, но дело опять же крайне затратное). Цитата Вот чего в исходнике есть: Ранка умеет работать с многопроцессорной архитектурой.
--------------------
|
|
|
|
EL-GReeN |
14.9.2016, 20:07
|
Journeyman
Сообщений: 474
Регистрация: 18.7.2011 Группа: Пользователи Наличность: 0 Из: Россия
Пользователь №: 13.815
Возраст: 32
|
Даже не знаю где спросить, на сишарповых форумах не обитаю, попробую тут: Делал один буржуй шаблон сервера на C# для одного движка, и все там было хорошо пока не стали тестить, проблема там вроде заключалась в том что он не смог нормально переводить нити в режим ожидания для уменьшения нагрузки на ЦП, на каждую нить сажался сокет(клиент). Цитата I've noticed that the server has some glaring CPU optimization issues (Server sits idle with just a TcpServerHandler running at 20% CPU, then +20% for every active TcpClientHandler, and +20% for any other active TcpServerHandler/UdpServerHandler objects) Цитата The current problem with this is that the threads are running constantly and using up CPU cycles regardless of whether they're doing any real work. In C++ this is fixed via conditional variables which basically says "Keep the thread alseep until this condition is met." Похоже на то что он криво сделал, или это такая особенность сишарпа, и он плохо подходит под сервер?
--------------------
|
|
|
|
StaticZ |
15.9.2016, 12:04
|
Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009 Группа: Пользователи Наличность: 0 Из: РФ, Москва
Пользователь №: 11.948
|
Цитата(EL-GReeN @ 14.9.2016, 20:07) Даже не знаю где спросить, на сишарповых форумах не обитаю, попробую тут: Делал один буржуй шаблон сервера на C# для одного движка, и все там было хорошо пока не стали тестить, проблема там вроде заключалась в том что он не смог нормально переводить нити в режим ожидания для уменьшения нагрузки на ЦП, на каждую нить сажался сокет(клиент).
O_o Я что-то проспал наверное, а в .NET уже появился какой-то API по работе с нитями?
--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.Game isn't a dream, it is the reality, reality which is coming while we dream...
|
|
|
|
Aimed |
15.9.2016, 17:20
|
Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012 Группа: Пользователи Наличность: 8675
Пользователь №: 15.607
|
Цитата(EL-GReeN @ 15.9.2016, 15:53) Да... как я и говорил, нюбская ошибка с while(true). Там у него слип на 1 мс, а потом проверка на TcpListener.Pending() и это жрет его ЦПУ. Вот метод с этой ошибкой(начиная со строки 83):Код public async void TcpAccept() { // While the server is online accept incoming client connections. while( Status == true ) { // Attempt to process the code, if not successful, throw an exception and close the server. Thread.Sleep( 1 );
try { // If a pending client connection is found, accept the client connection. if ( ServerHandle.Pending() == true ) { // If the client connection is accepted, setup the new clent. TcpClientSocket NewClient = new TcpClientSocket( BufferReadSize , BufferWriteSize , BufferAlignment , PacketHeader ); NewClient.ClientHandle = await ServerHandle.AcceptTcpClientAsync(); NewClient.ClientHandle.LingerState = new LingerOption( true , 0 ); NewClient.ClientHandle.NoDelay = true; NewClient.DataStream = NewClient.ClientHandle.GetStream();
// Add the client to the server's client socket list. ClientList.Add( NewClient.SocketId , NewClient );
// Start running the client and processing data for it, be it sending or receiving data. ThreadPool.QueueUserWorkItem( myThread => ClientHandle( NewClient ) ); } } catch( Exception ) { Status = false; } }
TcpListenerClose(); }
Вот на SO аналогичная проблема и вопрос и там-же есть обьяснение. http://stackoverflow.com/questions/2235565...ding-connectionПросто нужно тред блочить, а не чекать каждую 1 мс и все. у Майкрософта есть получше кусок кода для этого, через ManualResetEvent сделали. https://msdn.microsoft.com/en-us/library/fx...(v=vs.110).aspxМейн тред полностью заблочен пока Socket.BeginAccept() не начался.
|
|
|
|
StaticZ |
15.9.2016, 18:32
|
Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009 Группа: Пользователи Наличность: 0 Из: РФ, Москва
Пользователь №: 11.948
|
ЗЫ на будущее общепринятый перевод "Thread" это "поток", которые в общем случае состоят из "Fibers", что согласно общепринятому переводу, переводятся как раз как "нити". Конечно на путаницу перевода многие плются, т.к. в добавок к этому "Stream" тоже переводят как "поток", но так уж сложилось исторически и такой чудной перевод стал общепринятым...
--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.Game isn't a dream, it is the reality, reality which is coming while we dream...
|
|
|
|
StaticZ |
15.9.2016, 18:43
|
Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009 Группа: Пользователи Наличность: 0 Из: РФ, Москва
Пользователь №: 11.948
|
Цитата(Aimed @ 15.9.2016, 18:38) Кто-нибудь ними вобще пользуется? (Fibers)
Бывает, на самом деле штука хорошая в плане оптимизации т.к. не требует времени на переключение в отличии от потоков. Другое дело что с ними возни куда больше, т.к. если за переключение потоков отвечает ОС то за нити сам программист....
--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.Game isn't a dream, it is the reality, reality which is coming while we dream...
|
|
|
|
StaticZ |
15.9.2016, 20:57
|
Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009 Группа: Пользователи Наличность: 0 Из: РФ, Москва
Пользователь №: 11.948
|
Цитата(Aimed @ 15.9.2016, 18:49) Багочувствительная чтука вобщем. А ты их сам хоть раз использовал по делу( тоесть не в учебных/ознакомительных целях) ?
не было потребности, это скорее к случаям когда нужна запределеьная производительность или в случае когда 100500 тредов, что в принципе актуально наверное лишь для серьезного сервера (при условии конечно что кластеризация не по карману). Хотя на самом деле не так уж там все и страшно и сложно, чутка побольше кода, а так оно все часть того же WinAPI, так что тут скорее причина просто в лени )
--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.Game isn't a dream, it is the reality, reality which is coming while we dream...
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|