Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Патчи > Принятые патчи

Важная информация

Принятые патчи Иногда выкладывают патчи, которые потом в итоге все-таки принимают в ядро.

Повод для гордости.

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.12.2010, 14:32   #1
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию [10924][patch] Timer system improved

Всем трямс

Данный пост - это дублирование оригинальной темы Timer system improved на getmangos.com.

Вкратце о патче: попытка реализовать отправку диффов времени между актуальными апдейтами объектов включая правку недостатков патчей [10677] "Send to creature/etc Update call real diff from last update and use it." и [10688] "New version of patch for send real diff from last update.". Как и что тестировать вы, я уверен, уже в курсе

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

Мимо не проходим, тема актуальная и важная. Постить отзывы также не стесняемся.

Репозиторий патча: https://github.com/Ambal/mangos
ветка: master
Ambal вне форума  
4 пользователя(ей) сказали cпасибо:
Den (28.12.2010), Konctantin (24.12.2010), SilverIce (27.12.2010), sven (24.12.2010)
Старый 22.12.2010, 15:26   #2
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Не заметил уж слишком принципиальных различий с тем что Владимир пробовал заимплементить. Как я ему писал в форке, по-хорошему нужна отдельная нить с центром точного времени и общение с ней, чего здесь нет. Владимир предпочел атомизацию времени, но с ней возникли принципиальные грабли, которые его не устроили (мне так показалось что это несущественно). У вас ни то ни се, работать наверное будет но неожиданных граблей не избежать...
rsa вне форума  
Старый 22.12.2010, 15:31   #3
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Если вы не заметили, в этом патче мы имеем центр точного времени. Обратите внимание на код классов WorldTimer и как время системы используется в WorldObject::UpdateHelper для вычисления дифа между апдейтами объекта. Мы устанавливаем точное время в момент очередного "тика" основного цикла, потом этот момент времени является отправной точкой для прочих вычислений дифов.

Описание логики работы патча можете почитать на офф форуме, а также о его принципиальных отличиях в реализации "ни то, ни се".

Последний раз редактировалось Ambal; 22.12.2010 в 15:33.
Ambal вне форума  
Старый 22.12.2010, 15:40   #4
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Это не центр точного времени а атомизация. См. выше. При наличии центра точного времени передача абсолютного значения тика по цепочке вызовов бессмысленна в принципе.
Логику работы я вполне достаточно изучил в процессе борьбы с 10688 и дальнейшего переругивания с Владимиром
rsa вне форума  
Старый 22.12.2010, 15:45   #5
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Пусть будет "атомизация времени", мне принципиально все равно. Также вам придется вспомнить логику работы в [10677] и найти принципиальное отличие с предложенный подходом.

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

Последний раз редактировалось Ambal; 22.12.2010 в 15:47.
Ambal вне форума  
Старый 22.12.2010, 16:00   #6
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Подобную картину вместе с решениями я рисовал в процессе борьбы. И с моей точки зрения, пока мы не начнем хранить время последнего обновления в свойствах объекта и не будем использовать настоящий центр точного времени, от вероятности появления огромных диффов мы не избавимся. Она и сейчас ненулевая хотя и очень низкая.
rsa вне форума  
Старый 22.12.2010, 16:05   #7
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
пока мы не начнем хранить время последнего обновления в свойствах объекта
Разве не это я делаю в предложенном патче? А точное время нас интересует исключительно с точки зрения "в какой момент времени у нас началось текущее обновление мира" - эти данные фиксированы на текущий тик, и если вы взглянете на код мангоса, то в Update(uint32 diff) ЛЮБЫМ объектам мы передаем ОДНО И ТОЖЕ значение diff независимо от того, в какой момент времени они были созданы. Собственно говоря, подобный подход реализован и в предложенном патче - ничего принципиально удивительного и невероятного.
Ambal вне форума  
Старый 22.12.2010, 16:14   #8
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Вот именно в том что вами сейчас описано и имеет место основная проблема. Без ее решения установка дополнительных подпорок возможна, но непринципиальна.
1. время крайнего обновления должно храниться в объекте.
2. дифф должен не передаваться в ворлдтике а вычисляться в обновляемом объекте в момент обновления.
3. для реализации использования 1 и 2 нужна реалтаймнить с часами и механизм быстрого запроса времени, естественно блокируемый.
это конечно мое HO и наверняка приведет к куче других граблей. но уже _других_.
rsa вне форума  
Старый 22.12.2010, 16:24   #9
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
2. дифф должен не передаваться в ворлдтике а вычисляться в обновляемом объекте в момент обновления.
А он и вычисляется для каждого объекта в рантайме. С принципиальной разницей: если два объекта были созданы в один world_tick, то на второй тик они получат абсолютно одинаковые update_diff. Не думаю, что если один моб получит дифф в 200, а соседний в 199 мсек, то это привнесет в игру что-то принципиально новое в плане геймплея. Текущая схема с передачей в Update(uint32 diff) фиксированного world_diff почему-то никого не напрягает.
Ambal вне форума  
Старый 22.12.2010, 16:38   #10
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Говорим о разных вещах... ACE_OS::gettimeofday(); получает время текущей нити. А оно квантованое. От 2 до 100мс в зависимости от ОС и ее загрузки. И полагаться на него вовсе не стоит - атомизация и то лучше. К тому же в других нитях может быть сдвиг на +-квант. И время его передачи внутри класса тоже гуляет. И еще загрузка влияет на все это... А текущая ситуация - "работает, не трожь".
rsa вне форума  
Старый 22.12.2010, 16:43   #11
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
К тому же в других нитях может быть сдвиг на +-квант. И время его передачи внутри класса тоже гуляет. И еще загрузка влияет на все это... А текущая ситуация - "работает, не трожь".
Так чем это усложняет нам работу если мы сохраняем время ворлд тика в момент очередного World::Update() ? А когда мы сохраняем timestamp времени последнего обновления объекта или для расчетов диффа, мы используем время текущего ворлд тика, а не данные, полученные через ACE_OS::gettimeofday().
Ambal вне форума  
Старый 22.12.2010, 16:46   #12
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Это не усложняет нам работу. Это просто не имеет особых преимуществ по сравнению с текущей ситуацией - многопоточная обработка будет по прежнему рассинхронизирована. Даже при прямом использовании ACE_OS::gettimeofday() в объекте - см. замечание про квантование. А если не двигаться в сторону многопоточности - на кой вообще заводиться? "Работает - не трожь".
rsa вне форума  
Старый 22.12.2010, 16:50   #13
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
Это не усложняет нам работу. Это просто не имеет особых преимуществ по сравнению с текущей ситуацией.
Я согласен, какое же это преимущество иметь рабочий вариант решения проблемы с расчетом дифов между апдейтами объектов, который не страдает болезнями предыдущих решений... Пыль

P.S. ИМХО, я не собираюсь решать проблемы, связанные с расчетом времени, когда точность +/- 3 км, ради того чтобы дифы апдейтов отличались незначительно. Либо вам придется привести серьезный пример мегабонуса с точным расчетом времени дифов для каждого объекта.

Последний раз редактировалось Ambal; 22.12.2010 в 16:54.
Ambal вне форума  
Старый 22.12.2010, 16:58   #14
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Зря иронизируете. Задача нужная, но особых выигрышей от нее не видно. А проблемы - вполне возможны, что уже было показано. Чтобы решение было востребовано, потенциальные плюсы должны как минимум перевешивать потенциальные минусы, а тут этого нет.
rsa вне форума  
Старый 22.12.2010, 17:00   #15
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
потенциальные плюсы должны как минимум перевешивать потенциальные минусы, а тут этого нет.
Теперь вы потрудитесь объяснить, какие потенциальные минусы перевешивают потенциальные плюсы. С конкретными примерами.

P.S. Какие потенциальные минусы могут перевестить плюшки в виде респавнящихся на неактивных гридах мобов и подобных вещей?

Последний раз редактировалось Ambal; 22.12.2010 в 23:49.
Ambal вне форума  
Старый 23.12.2010, 11:45   #16
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Ambal Посмотреть сообщение
P.S. ИМХО, я не собираюсь решать проблемы, связанные с расчетом времени, когда точность +/- 3 км, ради того чтобы дифы апдейтов отличались незначительно. Либо вам придется привести серьезный пример мегабонуса с точным расчетом времени дифов для каждого объекта.
в третий раз повторяю что мы начали беседовать каждый о своем. вы - о точности подсчета диффов, а я - о их синхронизации. представьте себе 2 объекта, находящихся рядом но обрабатываемых в разных нитях. время в которых может иметь случайный сдвиг в любую сторону. при нынешней ситуации это почти неважно - загрубленные диффы снимают проблему. при точном подсчете событие объекту от другого объекта запросто придет с будущим временем -> получим старую картину с огромными диффами.
rsa вне форума  
Старый 23.12.2010, 11:52   #17
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
представьте себе 2 объекта, находящихся рядом но обрабатываемых в разных нитях.
Во-первых, я как-то слабо себе представляю обработку двух объектов на одной карте разными потоками - это явно к мангосу отношения не имеет. Во-вторых, поинтересуйтесь изменениями в коде WorldTimer::getMSTimeDiff() - эта функция теперь не допустит огромных дифов если вы получили сдвиг времени назад, она просто вычислит наименьший дифф времени и выдаст его как результат.
Ambal вне форума  
Старый 23.12.2010, 13:14   #18
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Ambal Посмотреть сообщение
Во-первых, я как-то слабо себе представляю обработку двух объектов на одной карте разными потоками - это явно к мангосу отношения не имеет. Во-вторых, поинтересуйтесь изменениями в коде WorldTimer::getMSTimeDiff() - эта функция теперь не допустит огромных дифов если вы получили сдвиг времени назад, она просто вычислит наименьший дифф времени и выдаст его как результат.
1. то что этого нет сейчас не значит что к этому не надо стремиться. тем более что у меня оно уже работало. кроме того некоторые компиляторы давно умеют безо всякого спроса распараллеливать процессы.
2. посмотрел уже. да, может спасти в данном случае. но это всего лишь затычка а не решение проблемы. а для решения нужна нить с точным временем. _одна_ нить. см. первые сообщения...
rsa вне форума  
Старый 23.12.2010, 13:30   #19
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
1. некоторые компиляторы давно умеют безо всякого спроса распараллеливать процессы.
2. а для решения нужна нить с точным временем.
1) Если вы собираетесь доверить распараллеливание ядра компилятору... то как говорил один всем известный персонаж "толи... на этом мысли останавливаются". Мангос в дальнейшем будет использовать схему распараллеливания ядра, предложенную в патче mtmaps, как самую надежную и не требующую чрезмерных затрат на реализацию и синхронизацию.

2) По поводу отдельного потока, считающего время: вам в любом случае придется решать проблемы с квантованием времени, ставить подпорки на защиту от перевода системного таймера и прочие радости метрологии. Частично эти проблемы уже решены в данном патче. Хотите дальнейших улучшений? Предлагайте код, а не очередные претензии.

Последний раз редактировалось Ambal; 23.12.2010 в 13:33.
Ambal вне форума  
Старый 23.12.2010, 13:58   #20
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

И даже при использовании mtmaps (достаточно простом варианте многопоточности) можно пострадать при разном времени в разных нитях. Потому что без синхронизации не обойтись.
Никаких претензий я не предъявлял, уже было написано что работа нужная, но уж делать - так делать в комплексе. Предлагать код - бессмысленно, вы в этой теме понимаете гораздо больше меня. Направление для улучшения - я предложил. Надо расписать блоксхему?
При наличии отдельного потока для времени решать проблемы с квантованием более не придется - для этого оно и предназначено. Квант везде будет одинаков.
rsa вне форума  
Старый 23.12.2010, 14:12   #21
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
При наличии отдельного потока для времени решать проблемы с квантованием более не придется - для этого оно и предназначено.
Проблема с отдельным потоком в том, что классическая схема

Код:
while(_running)
{
time_t tmStart = getMSTime();
Sleep(1);
uint32 tick = getMSTime() - tmStart;
}
в любом случае предполагает что квант времени будет равен значению системного таймера, который "пляшет" на разных ОСях в самых разных диапазонах. Для примера, ОС Windows имеет стандартный таймер на 15 мсек (т.е. Sleep(1) на самом деле является Sleep(15)). Даже если мы будет использовать мьютексы аля WaitForSingleObject(handle, 1), поток все равно "проспит" количество времени равное разрешению системного таймера. Таким образом ТОЧНОЕ время вы все равно не получите, а будете ограничены алгоритмом работы потока-счетчика и результатом, который он успел насчитать во время последней активности.

Возникает логичный вопрос: если мы в любом случае будем иметь фиксированное значение системного времени в интервале неактивности потока таймера, то как будет клиент реагировать на такие timestamps? Если клиент преспокойно проживет получая одно и тоже время в пределах одного тика, то имеет прямой смысл (на первых порах) "точный таймер" реализовать в контексте основного потока - изменять его значение перед каждым вызовом World::Update().

Последний раз редактировалось Ambal; 23.12.2010 в 14:17.
Ambal вне форума  
Старый 23.12.2010, 15:00   #22
Vladimir
MaNGOS Dev
 
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
Vladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небесVladimir Как свет с небес
По умолчанию

rsa, при текущей выбранной схеме как цели с тиком в одном потоке и только отработкой тика в Update в разных потоках разные значения таймера сохранненого пeред паралельной частью быть не может. А другие схемы мы поддержитвать вроде не собираемся. Всякие локальные распаралеливания на это не влияют до тех пор пока значени сохранненого времени только читается и все потоки гарантированно замерзают до следующего общего тика.
__________________
Так как устал объяснять знайте ICQ не пользуюсь
Vladimir вне форума  
Старый 23.12.2010, 15:38   #23
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Пока мы тратили 2 дня на словесную перепалку на форуме, в голову закралась мысля использовать функцию clock_t clock(void); которая возвращает количество тиков системного таймера с момента запуска процесса.

CPU and Process times
clock function

Последний раз редактировалось Ambal; 23.12.2010 в 15:48.
Ambal вне форума  
Старый 23.12.2010, 15:45   #24
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Ambal Посмотреть сообщение
в любом случае предполагает что квант времени будет равен значению системного таймера, который "пляшет" на разных ОСях в самых разных диапазонах. Для примера, ОС Windows имеет стандартный таймер на 15 мсек (т.е. Sleep(1) на самом деле является Sleep(15)). Даже если мы будет использовать мьютексы аля WaitForSingleObject(handle, 1), поток все равно "проспит" количество времени равное разрешению системного таймера. Таким образом ТОЧНОЕ время вы все равно не получите, а будете ограничены алгоритмом работы потока-счетчика и результатом, который он успел насчитать во время последней активности.
классическая схема потока точного времени этого не предполагает. конечно, если использовать sleep() любого сорта для определения длительности тика то мы будем иметь описанное. вот только именно классическая схема предполагает
Код:
--- timeThread
While(true)
{
WhiteForMutex1()
GetSystemTime()
SendTimeOverQueueOrPipe();
DropMutex1();
SendMutex2();
}
-- ClientThreads
getTime
{
SendMutex1()
WhiteForMutex2();
GetTimeFromQueueOrPipe();
DropMutex2();
}
(грубо и по памяти но понятно надеюсь)
эта схема предполагает гарантированную синхронизацию всех клиентских нитей. то что поток - эталон не будет давать абсолютно точного времени роли не играет - он будет давать одинаковую ошибку всем клиентам. и даст возможность засинхронизировать потоки не только в windows, где тики фиксированные, а и в других ОС, где они имеют переменный, причем динамически переменный размер.

Добавлено через 4 минуты
Цитата:
Сообщение от Vladimir Посмотреть сообщение
rsa, при текущей выбранной схеме как цели с тиком в одном потоке и только отработкой тика в Update в разных потоках разные значения таймера сохранненого пeред паралельной частью быть не может. А другие схемы мы поддержитвать вроде не собираемся. Всякие локальные распаралеливания на это не влияют до тех пор пока значени сохранненого времени только читается и все потоки гарантированно замерзают до следующего общего тика.
ну во первых может (я пытался завести распараллеливание не map-based а grid-based. вышло хреново. но возможно и при map-based, объекты-то иногда перемещаются...). а во вторых - надо стремиться к максимальному thread-safe. причем желательно на стадии проектирования.

Последний раз редактировалось evilstar; 27.12.2010 в 13:59.
rsa вне форума  
Старый 24.12.2010, 11:39   #25
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

В мангосе вычисление разницы между временными точками применяется слишком редко чтобы заморачиваться с отдельным потоком, считающим "точное время" с определенной погрешностью.
В рамках предложенного в патче подхода к вычислению диффа между апдейтами объектов мы не нуждаемся в "точном времени" - с нас достаточно хранить и использовать время начала очередного world_tick, которое будет вычисляться и дальше в одном (главном) потоке.
Все прочие схемы, ИМХО, как работы потоков так и алгоритмов расчета диффов объектов, не имеют особой практической ценности. Поэтому, также ИМХО, не вижу смысла заморачиваться с их реализацией.

Последний раз редактировалось Ambal; 24.12.2010 в 12:10.
Ambal вне форума  
Старый 25.12.2010, 07:25   #26
zhenya
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 85
Сказал(а) спасибо: 5
Поблагодарили 42 раз(а) в 17 сообщениях
zhenya Скоро придёт к известности
По умолчанию

Оффтоп. а почему не openmp? :-) вроде тоже неплохое решение.
zhenya вне форума  
Старый 27.12.2010, 11:27   #27
Ambal
MaNGOS Dev
 
Аватар для Ambal
 
Регистрация: 22.06.2010
Сообщений: 78
Сказал(а) спасибо: 24
Поблагодарили 71 раз(а) в 25 сообщениях
Ambal Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от zhenya Посмотреть сообщение
а почему не openmp?
А смысл? OpenMP имеет лишь одно преимущество - это сокрытие под всяческими прагмами нюансов реализации тех или иных объектов синхронизации и параллельных алгоритмов. У нас все это есть в ТВВ и АСЕ. ИМХО, зачем тянуть еще один рантайм непонятно...

Оффтоп: патч хоть кто-то смог потестировать? Или его надо в основную ветку закоммитить дабы получить по нему отзывы?

Последний раз редактировалось Ambal; 27.12.2010 в 12:11.
Ambal вне форума  
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[patch/dev] Pet stat scaling system rsa Патчи 9 22.01.2015 12:13
[SQL patch] Improved Stormstrike (Сокрушительный удар бури) Insider42 Патчи на рассмотрении 1 26.08.2011 20:10
[patch] Improved Icy Touch Insider42 Патчи на рассмотрении 5 25.10.2010 13:22
[9977][patch] Improved Water Shield (Улучшенный водный щит) Insider42 Принятые патчи 3 26.05.2010 21:15
[patch] Camera system SilverIce Принятые патчи 7 07.04.2010 11:23


Текущее время: 06:33. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot