[ТЧ,ЧН,ЗП] Многоядерность, Используем два и более ядер |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
[ТЧ,ЧН,ЗП] Многоядерность, Используем два и более ядер |
24.08.2015, 22:08
Сообщение
#41
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Tron,
не совсем так однако, Основной поток плодит работы, да. Во время рендеринга эти работы обрабатываются вторым потоком. Но из-за хитро*, есть вероятность, что эти работы будут просчитаны в том же потоке. |
 
|
|
|
|
24.08.2015, 22:30
Сообщение
#42
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
-StalkMen-, я вот не понимаю последние две строчки
Код // now we give control to device - signals that we are ended our work Device.mt_csEnter.Leave (); // waits for device signal to continue - to start again Device.mt_csLeave.Enter (); // returns sync signal to device Device.mt_csLeave.Leave (); Это что-то типа маленькой синхронизации выступает? |
 
|
|
24.08.2015, 22:40
Сообщение
#43
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Tron,
Да я тоже себе мозг этим сломал. Код // Release start point - allow thread to run mt_csLeave.Enter (); mt_csEnter.Leave (); Даём шанс 2 потоку стартовать. Код // Release end point - allow thread to wait for startup point mt_csEnter.Enter (); mt_csLeave.Leave (); Лочим. (Если 2 поток робит, то ждём его. Либо Не даём ему стартовать). Код // Ensure, that second thread gets chance to execute anyway if (dwFrame!=mt_Thread_marker) { for (u32 pit=0; pit<Device.seqParallel.size(); pit++) Device.seqParallel[pit] (); Device.seqParallel.clear_not_free (); seqFrameMT.Process (rp_Frame); } Самый Если 2 поток не успел, то делаем его работу сами. Вроде так. Сообщение отредактировал -StalkMen- - 24.08.2015, 22:40 |
 
|
|
24.08.2015, 22:54
Сообщение
#44
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
А все понял, картина маслом.
Да походу ты прав |
 
|
|
24.08.2015, 23:07
Сообщение
#45
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Вообще-то все немного не так или совсем не так
Система простая: основной поток рендерит текущий кадр, во втором обсчитываются данные для следующего. Второй поток не может не успеть - там же критические секции поставлены. Это значит, что он вообще не работал в этот раз. Без этой проверки будут тупо пропуски обсчета. Сообщение отредактировал abramcumner - 24.08.2015, 23:19 |
 
|
|
24.08.2015, 23:21
Сообщение
#46
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
-StalkMen-, заинтересовал, стяну завтра исходники посмотреть. Но вообще по фрагментам, которые ты привёл - там классическая задача поставщик- потребитель, а ты усложняешь )
Это ЗП? Сообщение отредактировал Neo][ - 24.08.2015, 23:29 -------------------- |
 
|
|
24.08.2015, 23:31
Сообщение
#47
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Neo][,
Я что, я ничего Да, ЗП. |
 
|
|
25.08.2015, 02:26
Сообщение
#48
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
|
 
|
|
25.08.2015, 12:07
Сообщение
#49
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
-------------------- |
 
|
|
25.08.2015, 16:55
Сообщение
#50
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Neo][,
Хорошая картинка. Профилировщик? Но а это -> Код if (dwFrame!=mt_Thread_marker) |
 
|
|
25.08.2015, 20:58
Сообщение
#51
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Второй поток не может не успеть - там же критические секции поставлены. некруто же, платформозависимая хрень (на поверку спинлок, если склероз не изменяет) в эпоху 11-го стандарта! эй, кто там делал сборку под х64, пришло время заюзать православные примитивы синхронизации! Профилировщик? профилировщик может в картинки? -------------------- nop
|
 
|
|
25.08.2015, 21:21
Сообщение
#52
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
эй, кто там делал сборку под х64, пришло время заюзать православные примитивы синхронизации! Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде. Если и буду заниматься МТ, то скорее всего только с фиберами А то, да ты прав, Ну,а это еще сильный WIP: Скрин с использванием в моем движке: |
 
|
|
25.08.2015, 21:23
Сообщение
#53
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде может стоит тогда начать с отвязывания рендерера от винды? -------------------- nop
|
 
|
|
25.08.2015, 21:25
Сообщение
#54
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Если конечно у меня еще правильно работает... я сам еще не разобрался... библиотека без документации и примеров Не вижу смысла тратиться на это, ибо все равно рендер намертво привязан к винде может стоит тогда начать с отвязывания рендерера от винды? Ты готов написать новый рендер с 0? - Я, нет. Я уже со своим затрахался вдовль. Другое дело, заменить его на какую - нибудь либу |
 
|
|
25.08.2015, 21:39
Сообщение
#55
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
-------------------- nop
|
 
|
|
25.08.2015, 21:47
Сообщение
#56
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Но автор GL4 версию не развивает активно(в данный момент) Сообщение отредактировал Tron - 25.08.2015, 21:47 |
 
|
|
25.08.2015, 22:16
Сообщение
#57
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Tron,
нууу, на мое скромное имхо это не совсем альтернатива промышленной разработке, а точнее совсем не альтернатива. вот если бы нечто похожее было запилено с сопоставимым качеством картинки, с юнит тестами, обширным коммьюнити и подтверждено многими реально выпущенными проектами, использующими эту технологию, что-то на что можно было бы ориентироваться как на стандарт де-факто, вот тогда другое дело -------------------- nop
|
 
|
|
26.08.2015, 12:47
Сообщение
#58
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Neo][, Хорошая картинка. Профилировщик? -StalkMen-, word ) профилировщик может в картинки? refuse, профилировщик профилировщику рознь Но а это -> Код if (dwFrame!=mt_Thread_marker) Скорее всего workaround для некого побочного эффекта, на вскидку я не смог проследить возможности нарушения условия. -------------------- |
 
|
|
26.08.2015, 22:39
Сообщение
#59
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Neo][,
Профилировщик Второй скрин - откуда инфа о длительности? Скорее всего workaround для некого побочного эффекта, на вскидку я не смог проследить возможности нарушения условия. Если 2 поток не успел, то делаем его работу сами. (На мп серваке очень часто юзается) |
 
|
|
27.08.2015, 10:25
Сообщение
#60
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Второй скрин - откуда инфа о длительности? -StalkMen-, это сделано специально для наглядности, чтобы исключить вопросы на подобии: Если 2 поток не успел, то делаем его работу сами. 2-й поток не может не успеть, первый поток будет ждать на mt_csEnter Цитата Statistic->RenderTOTAL_Real.FrameEnd (); Statistic->RenderTOTAL.accum = Statistic->RenderTOTAL_Real.accum; #endif // #ifndef DEDICATED_SERVER // *** Suspend threads // Capture startup point // Release end point - allow thread to wait for startup point mt_csEnter.Enter (); mt_csLeave.Leave (); // Ensure, that second thread gets chance to execute anyway if (dwFrame!=mt_Thread_marker) { for (u32 pit=0; pit<Device.seqParallel.size(); pit++) Device.seqParallel[pit] (); Device.seqParallel.clear_not_free (); seqFrameMT.Process (rp_Frame); } пока второй не выполнит работу и не освободит эту секцию: Цитата Device.seqFrameMT.Process (rp_Frame);
// now we give control to device - signals that we are ended our work Device.mt_csEnter.Leave (); Сообщение отредактировал Neo][ - 27.08.2015, 10:27 -------------------- |
 
|
|
Текстовая версия | Сейчас: 10.05.2024, 02:06 |