[ТЧ,ЧН,ЗП] Многоядерность, Используем два и более ядер |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
[ТЧ,ЧН,ЗП] Многоядерность, Используем два и более ядер |
14.08.2015, 15:40
Сообщение
#21
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Мне вообще кажется, что надо boost вырезать из luabind'а. А вместо него использовать плюшки C++0x.
Что-то вроде такого Было Код // new(1) template <class T, class P1> IC T* xr_new (const P1& p1) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1); } // new(2) template <class T, class P1, class P2> IC T* xr_new (const P1& p1, const P2& p2) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2); } // new(3) template <class T, class P1, class P2, class P3> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3); } Стало Код // new() template <class T, class ... Args> IC T* xr_new(const Args& ... args) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr)T(args...); } |
 
|
|
|
|
14.08.2015, 16:16
Сообщение
#22
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
|
 
|
|
14.08.2015, 16:59
Сообщение
#23
|
|
Опытный Геймер Репутация: 17 Группа: Участник Сообщений: 161 Награды: 3 Регистрация: 08.03.2015 |
// new(1) template <class T, class P1> IC T* xr_new (const P1& p1) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1); } // new(2) template <class T, class P1, class P2> IC T* xr_new (const P1& p1, const P2& p2) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2); } // new(3) template <class T, class P1, class P2, class P3> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3); } А ты разве свой проект в debug режиме слаживаешь? Первая строка DEBUG_MEMORY_NAME Клац #ifdef DEBUG_MEMORY_NAME // new(0) template <class T> IC T* xr_new () { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(); } // new(1) template <class T, class P1> IC T* xr_new (const P1& p1) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1); } // new(2) template <class T, class P1, class P2> IC T* xr_new (const P1& p1, const P2& p2) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2); } // new(3) template <class T, class P1, class P2, class P3> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3); } // new(4) template <class T, class P1, class P2, class P3, class P4> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3,p4); } // new(5) template <class T, class P1, class P2, class P3, class P4, class P5> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3,p4,p5); } // new(6) template <class T, class P1, class P2, class P3, class P4, class P5, class P6> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3,p4,p5,p6); } // new(7) template <class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3,p4,p5,p6,p7); } // new(8) template <class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3,p4,p5,p6,p7,p8); } // new(9) template <class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P8& p9) { T* ptr = (T*)Memory.mem_alloc(sizeof(T), typeid(T).name()); return new (ptr) T(p1,p2,p3,p4,p5,p6,p7,p8,p9); } #else // DEBUG_MEMORY_NAME // new(0) template <class T> IC T* xr_new () { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(); } // new(1) template <class T, class P1> IC T* xr_new (const P1& p1) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1); } // new(2) template <class T, class P1, class P2> IC T* xr_new (const P1& p1, const P2& p2) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2); } // new(3) template <class T, class P1, class P2, class P3> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3); } // new(4) template <class T, class P1, class P2, class P3, class P4> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3,p4); } // new(5) template <class T, class P1, class P2, class P3, class P4, class P5> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3,p4,p5); } // new(6) template <class T, class P1, class P2, class P3, class P4, class P5, class P6> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3,p4,p5,p6); } // new(7) template <class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3,p4,p5,p6,p7); } // new(8) template <class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3,p4,p5,p6,p7,p8); } // new(9) template <class T, class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> IC T* xr_new (const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P8& p9) { T* ptr = (T*)Memory.mem_alloc(sizeof(T)); return new (ptr) T(p1,p2,p3,p4,p5,p6,p7,p8,p9); } #endif // DEBUG_MEMORY_NAME -------------------- |
 
|
|
14.08.2015, 17:21
Сообщение
#24
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Stalker_Monolit,
Обычно нет, мой ДеБуг, это Mixed (Копия Release без оптимизации) Клац |
 
|
|
14.08.2015, 17:27
Сообщение
#25
|
|
Опытный Геймер Репутация: 17 Группа: Участник Сообщений: 161 Награды: 3 Регистрация: 08.03.2015 |
Stalker_Monolit, Обычно нет, мой ДеБуг, это Mixed (Копия Release без оптимизации) Клац Понятно ты не знаешь что за приоритеты выставлены почти каждому проекту? R1 Код Device.seqFrame.Add (this,REG_PRIORITY_HIGH+0x12345678); R2 Код Device.seqFrame.Add (this,REG_PRIORITY_HIGH+0x12345678); R3 Код Device.seqFrame.Add (this,REG_PRIORITY_HIGH+0x12345678); И мне кажется есть связь с pure.h в котором вот это: Клац #ifndef _PURE_H_AAA_ #define _PURE_H_AAA_ // messages #define REG_PRIORITY_LOW 0x11111111ul #define REG_PRIORITY_NORMAL 0x22222222ul #define REG_PRIORITY_HIGH 0x33333333ul #define REG_PRIORITY_CAPTURE 0x7ffffffful #define REG_PRIORITY_INVALID 0xfffffffful typedef void __fastcall RP_FUNC (void *obj); #define DECLARE_MESSAGE(name) extern ENGINE_API RP_FUNC rp_##name; class ENGINE_API pure##name { public: virtual void On##name(void)=0; } #define DECLARE_RP(name) void __fastcall rp_##name(void *p) { ((pure##name *)p)->On##name(); } DECLARE_MESSAGE(Frame); DECLARE_MESSAGE(Render); DECLARE_MESSAGE(AppActivate); DECLARE_MESSAGE(AppDeactivate); DECLARE_MESSAGE(AppStart); DECLARE_MESSAGE(AppEnd); DECLARE_MESSAGE(DeviceReset); //----------------------------------------------------------------------------- struct _REG_INFO { void* Object; int Prio; u32 Flags; }; ENGINE_API extern int __cdecl _REG_Compare(const void *, const void *); template <class T> class CRegistrator // the registrator itself { friend ENGINE_API int __cdecl _REG_Compare(const void *, const void *); public: xr_vector<_REG_INFO> R; // constructor struct { u32 in_process :1; u32 changed :1; }; CRegistrator() { in_process=false; changed=false;} // void Add (T *obj, int priority=REG_PRIORITY_NORMAL, u32 flags=0) { #ifdef DEBUG VERIFY (priority!=REG_PRIORITY_INVALID); VERIFY (obj); for (u32 i=0; i<R.size(); i++) VERIFY( !((R[i].Prio!=REG_PRIORITY_INVALID)&&(R[i].Object==(void*)obj)) ); #endif _REG_INFO I; I.Object =obj; I.Prio =priority; I.Flags =flags; R.push_back (I); if(in_process) changed=true; else Resort ( ); }; void Remove (T *obj) { for (u32 i=0; i<R.size(); i++) { if (R[i].Object==obj) R[i].Prio = REG_PRIORITY_INVALID; } if(in_process) changed=true; else Resort ( ); }; void Process(RP_FUNC *f) { in_process = true; if (R.empty()) return; if (R[0].Prio==REG_PRIORITY_CAPTURE) f(R[0].Object); else { for (u32 i=0; i<R.size(); i++) if(R[i].Prio!=REG_PRIORITY_INVALID) f(R[i].Object); } if(changed) Resort(); in_process = false; }; void Resort (void) { qsort (&*R.begin(),R.size(),sizeof(_REG_INFO),_REG_Compare); while ((R.size()) && (R[R.size()-1].Prio==REG_PRIORITY_INVALID)) R.pop_back(); if (R.empty()) R.clear (); changed = false; }; }; #endif Сообщение отредактировал Stalker_Monolit - 14.08.2015, 17:28 -------------------- |
 
|
|
14.08.2015, 17:35
Сообщение
#26
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
Stalker_Monolit,
Приоритет - выше высокого. |
 
|
|
14.08.2015, 18:30
Сообщение
#27
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Мне вообще кажется, что надо boost вырезать из luabind'а. А вместо него использовать плюшки C++0x. Кто-то уже вырезал. Может Tron? Не, я этим не занимался. Хотел, но не сделал. То,что по ссылке выше там же вариадик темплейты, их поддержка только в 13ой студии появилась. Есть форк луабинда, там С++11 плюшки есть, но собирается и с более ранней студией(с 12 точно) Added: Версию с новым луабиндом делал codepoet, но у него что-то там не срослось,ибо он не довел ее Сообщение отредактировал Tron - 14.08.2015, 18:31 |
 
|
|
23.08.2015, 09:42
Сообщение
#28
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Сегодня курил код, нашел механизм работы с потоками. Точнее, я его и до этого видел, но сегодня я прям отладчиком на него попал
Многопоточный рендер там точно есть(ему выделен 1 дополнительный поток, помимо основного). Даже есть команда для мнгп. окклуюжена Сообщение отредактировал Tron - 23.08.2015, 09:46 |
 
|
|
23.08.2015, 15:41
Сообщение
#29
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
|
 
|
|
23.08.2015, 16:27
Сообщение
#30
|
|
Продвинутый геймер Репутация: 15 Группа: Участник Сообщений: 322 Награды: 3 Регистрация: 01.05.2014 |
|
 
|
|
24.08.2015, 05:48
Сообщение
#31
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Tron, 1 дополнительный поток "X-RAY Secondary thread" Этот? На сколько я знаю, оба потока работают последовательно Тогда где же тут Многопоточный рендер ??? в консольных командах есть r2_mt Но вообще я возможно ошибся В xrNetServer для расчёта CRC? можно легко заменить на вариант из zlib |
 
|
|
24.08.2015, 14:42
Сообщение
#32
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
r2_mt Код void CRender::OnFrame() { Models->DeleteQueue (); if (ps_r2_ls_flags.test(R2FLAG_EXP_MT_CALC)) { // MT-details (@front) Device.seqParallel.insert (Device.seqParallel.begin(), fastdelegate::FastDelegate0<>(Details,&CDetailManager::MT_CALC)); // MT-HOM (@front) Device.seqParallel.insert (Device.seqParallel.begin(), fastdelegate::FastDelegate0<>(&HOM,&CHOM::MT_RENDER)); } } Что-то есть, но Много Поточности нема |
 
|
|
24.08.2015, 16:03
Сообщение
#33
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Что-то есть, но Много Поточности нема -StalkMen-, почему такой вывод? -------------------- |
 
|
|
24.08.2015, 16:31
Сообщение
#34
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Три(основной+MT-details+MT-HOM) это разве много?
Сообщение отредактировал abramcumner - 24.08.2015, 16:31 |
 
|
|
24.08.2015, 16:40
Сообщение
#35
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Три(основной+MT-details+MT-HOM) это разве много? Ну, только если так смотреть, тогда действительно нема )) Сообщение отредактировал Neo][ - 24.08.2015, 16:41 -------------------- |
 
|
|
24.08.2015, 17:20
Сообщение
#36
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Три(основной+MT-details+MT-HOM) это разве много? Три(основной+MT-details+MT-HOM) это разве много? Ну, только если так смотреть, тогда действительно нема )) Если так рассуждать, то у меня для вас очень плохие новости.. Во первых Occlusion Query очень дорогая операция, и ее результат будет доступен только через 1-5 кадров, после вызова. - я лично с этим столкнулся. Да, долго не верил, т.к на моей машине это было незаметно, но запустив на старой машине, я получил прирост почти в 2 раза. А все из-за чего? - ждем ответа от CPU. Т.Е в теории это должно повысить производительность Во вторых, сама операция создания треда, очень дорогая, и ее должно быть как можно меньше. Поэтому и используется Task-Based подход Сообщение отредактировал Tron - 24.08.2015, 17:21 |
 
|
|
24.08.2015, 17:27
Сообщение
#37
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
Tron,
-------------------- |
 
|
|
24.08.2015, 20:09
Сообщение
#38
|
|
Продвинутый геймер Репутация: 22 Группа: Участник Сообщений: 234 Награды: 3 Регистрация: 27.10.2010 |
почему такой вывод? Код void mt_Thread (void *ptr) { while (true) { // waiting for Device permission to execute Device.mt_csEnter.Enter (); if (Device.mt_bMustExit) { Device.mt_bMustExit = FALSE; // Important!!! Device.mt_csEnter.Leave(); // Important!!! return; } // we has granted permission to execute mt_Thread_marker = Device.dwFrame; for (u32 pit=0; pit<Device.seqParallel.size(); pit++) Device.seqParallel[pit] (); Device.seqParallel.clear_not_free (); Device.seqFrameMT.Process (rp_Frame); // 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 (); } } Один поток плодит работЫ, засыпает, другой их делает и засыпает о_О. И так по кругу. (Хоть основных потоков 2, но они работают, как один - последовательно) |
 
|
|
24.08.2015, 20:12
Сообщение
#39
|
|
Опытный Геймер Репутация: 17 Группа: Участник Сообщений: 161 Награды: 3 Регистрация: 08.03.2015 |
Хоть основных потоков 2, но они работают, как один - последовательно Интересно если их сделать параллельно что то изменится? -------------------- |
 
|
|
24.08.2015, 21:40
Сообщение
#40
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Один поток плодит работЫ, засыпает, другой их делает и засыпает о_О. И так по кругу. (Хоть основных потоков 2, но они работают, как один - последовательно) Пояснить логику можешь? Я вот смотрю и вижу другую логику работы, согласно И да, поток не засыпает, т.к нету вызова |
 
|
|
Текстовая версия | Сейчас: 04.05.2024, 19:16 |