рдХрдпрд╛рдордд 3 рдмреАрдПрдлрдЬреА рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ (4 рдХреЗ рднрд╛рдЧ 2)

рднрд╛рдЧ 1: рдкрд░рд┐рдЪрдп
рднрд╛рдЧ 2: рдЧреБрдгрд╛ рдХрд░рдирд╛
рднрд╛рдЧ 3: рдкреНрд░рддрд┐рдкрд╛рджрди (рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреМрд░рд╛рди рдиреЛрдЯ - рдкреНрд░рддрд┐)
рднрд╛рдЧ 4: рдХрдпрд╛рдордд рдХреНрд▓рд╛рд╕рд┐рдХ - рдПрдХреАрдХрд░рдг (рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддрд┐ - рдиреЛрдЯ)

Doom III рдХреЗ рд▓рд┐рдП рдЗрдВрдЬрди 2000 рдФрд░ 2004 рдХреЗ рдмреАрдЪ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЙрд╕ рд╕рдордп рдЬрдм рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреАрд╕реА рдПрдХрд▓-рдкреНрд░реЛрд╕реЗрд╕рд░ рдереЗред рд╣рд╛рд▓рд╛рдВрдХрд┐ idTech4 рдЗрдВрдЬрди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ SMP рдХреЗ рд╕рдорд░реНрдерди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд╕рдордп рдкрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕рдкреЛрд░реНрдЯ ( рдЬреЙрди рдХрд╛рд░реНрдореИрдХ рдХреЗ рд╕рд╛рде рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рджреЗрдЦреЗрдВ ) рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред

рддрдм рд╕реЗ, рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ " рдорд▓реНрдЯреА-рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ ":

рд╡рд░реНрд╖реЛрдВ рд╕реЗ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЦреЗрд▓ рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рддреНрддрд╛ рдореЗрдВ рдЗрд╕ рд╡реГрджреНрдзрд┐ рд╕реЗ рд▓рд╛рдн рд╣реБрдЖ рд╣реИред
рдирд┐рдпрдо рдмрджрд▓ рдЧрдП рд╣реИрдВред рд╕рд┐рдВрдЧрд▓-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ, рдЕрдЧрд░ рдмрд┐рд▓реНрдХреБрд▓ рднреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрдВрдкреНрдпреВрдЯрд░ рдФрд░ рдХрдВрд╕реЛрд▓ рдХреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдмрдврд╝рддреА рд░рд╣рддреА рд╣реИред рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреА рд╡реГрджреНрдзрд┐ рдЕрдм рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рд╛рдкреНрдд рд╣реБрдИ рд╣реИред
рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд╛рд╡рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрд╕ рдкрд╛рд╡рд░ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдФрд░ рдбреВрдо III рдмреАрдПрдлрдЬреА рдорд▓реНрдЯреА-рдХреЛрд░ рд╣реИрдВ:

рдирддреАрдЬрддрди, idTech4 рдХреЛ рди рдХреЗрд╡рд▓ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде, рдмрд▓реНрдХрд┐ idTech5 рдХреЗ рдЬреЙрдм рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рднреА рдкреНрд░рдмрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬреЛ рдорд▓реНрдЯреА-рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рдиреЛрдЯ: рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, Xbox One рдФрд░ PS4 рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рдереА: рджреЛрдиреЛрдВ рдореЗрдВ рдЖрда рдХреЛрд░ рд╣реЛрдВрдЧреЗред рдХрд┐рд╕реА рднреА рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг рд╣реИред

рдХрдпрд╛рдордд 3 BFG рдереНрд░реЗрдб рдореЙрдбрд▓


рдПрдХ рдкреАрд╕реА рдкрд░, рдЦреЗрд▓ рддреАрди рдзрд╛рдЧреЛрдВ рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ:
  1. рдмреИрдХрдПрдВрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо (GPU рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛)
  2. рдЧреЗрдо рд▓реЙрдЬрд┐рдХ рдФрд░ рдлреНрд░рдВрдЯрдПрдВрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рд╡рд╛рд╣
  3. рдЙрдЪреНрдЪ рдЖрд╡реГрддреНрддрд┐ рдЬреЙрдпрд╕реНрдЯрд┐рдХ (250 рд╣рд░реНрдЯреНрдЬ) рд╕реЗ рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рд╕реНрдЯреНрд░реАрдо

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, idTech4 рджреЛ рдФрд░ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдмрдирд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рддреАрди рдореБрдЦреНрдп рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рд╡реЗ рдЕрдиреБрд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░


Id Software рдиреЗ Beyond Programming Shaders рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ 2009 рдХреЗ рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЕрдирд╛рд╡рд░рдг рдХрд┐рдпрд╛ред рджреЛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣рд╛рдБ:


рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдШрдЯрдХ


рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ 3 рдШрдЯрдХ рд╣реЛрддреЗ рд╣реИрдВ:


рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ:

struct job_t { void (* function )(void *); // Job instructions void * data; // Job parameters int executed; // Job end marker...Not used. }; 


рдиреЛрдЯ: рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, "рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХреЛ рдХрдо рд╕реЗ рдХрдо 1000 рдЪрдХреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реА рдУрд░, рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЛрдб рд╕рдВрддреБрд▓рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХреЛ рдХреБрдЫ 100,000 рдЪрдХреНрд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рд╣реИрдВрдбрд▓рд░ рдПрдХ рдзрд╛рдЧрд╛ рд╣реИ рдЬреЛ рд╕рд┐рдЧреНрдирд▓ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдирд┐рд╖реНрдХреНрд░рд┐рдп рд░рд╣реЗрдЧрд╛ред рдЬрдм рдпрд╣ рд╕рдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдХрд╛рд░реНрдп рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рд╕реЗ рдиреМрдХрд░реА рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рддреАрди рдкреНрд░рд╛рдЗрдорд┐рдЯрд┐рд╡реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╕рд┐рдЧреНрдирд▓, рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рдиред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдЬрди рдХреЛ рд╕реАрдкреАрдпреВ рдХрд╛ рдзреНрдпрд╛рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдиреАрдЪреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░


рдЙрдкрддрдВрддреНрд░ рдХрд╛ рдорд╕реНрддрд┐рд╖реНрдХ ParalleleJobManager рд╣реИред рд╡рд╣ рдереНрд░реЗрдб рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬрдЧрд╛рдиреЗ рдФрд░ рдЙрди рдХрддрд╛рд░реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдЬрд┐рдирдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░: рдиреМрдХрд░реА рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдХрдИ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрдВрдЬрди рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рдХрддрд╛рд░реЛрдВ рдХреЛ idParallelJobList рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

Doom III BFG рдореЗрдВ рдХреЗрд╡рд▓ рддреАрди рдЦрдВрдб рд╣реИрдВ:

рдПрдХ рдкреАрд╕реА рдкрд░, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рджреЛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж XBox360 рдФрд░ PS3 рдкрд░ рдЕрдзрд┐рдХ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред

2009 рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░, idTech5 рдореЗрдВ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ:


рдиреЛрдЯ: рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рдПрдХ-рдлреНрд░реЗрдо рджреЗрд░реА рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдбреВрдо III рдмреАрдПрдлрдЬреА рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХрд╛рд░реНрдп рдХрд╛ рд╡рд┐рддрд░рдг

рд░рдирд┐рдВрдЧ рд╣реИрдВрдбрд▓рд░ рд▓рдЧрд╛рддрд╛рд░ рдиреМрдХрд░реА рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдпрд╛ рдореЙрдирд┐рдЯрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреА рд╣реИред

рдХреЗ рдЙрдкрдпреЛрдЧ


рдЪреВрдВрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧреЗ рддрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд░рддрд╛ рд╣реИ:

  //tr.frontEndJobList is a idParallelJobList object. for ( viewLight_t * vLight = tr.viewDef->viewLights; vLight != NULL; vLight = vLight->next ) { tr.frontEndJobList->AddJob( (jobRun_t)R_AddSingleLight, vLight ); } tr.frontEndJobList->Submit(); tr.frontEndJobList->Wait(); 


рд╡рд┐рдзрд┐:





рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


рд╣реИрдВрдбрд▓рд░ рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ, рдПрдХ рд░рд┐рдВрдЧ рдмрдлрд░ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдХрд╛рд░реНрдп рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╕реНрдЯреИрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрдерд╛рдиреАрдп рдвреЗрд░: рддрдВрддреНрд░ рдХреЛ рд░реЛрдХрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЙрдмрд▓рд┐рд╕реНрдЯ рдХреЗ рдкрддреЗ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдереНрд░реЗрдб рд╕реНрдЯреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдереНрд░реЗрдб рдЬреЙрдмрд▓рд┐рд╕реНрдЯ рдХреЛ "рдмреНрд▓реЙрдХ" рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ RUN_STALLED рдореЛрдб рдореЗрдВ рдЖрддрд╛ рд╣реИред рд╕реНрдерд╛рдиреАрдп рдЬреЙрдмрд▓рд┐рд╕реНрдЯ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рдЗрд╕ рд░реЛрдХ рдХреЛ рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд┐рд╕реА рднреА рдЖрдкрд╕реА рддрдВрддреНрд░ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: рдХреЗрд╡рд▓ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рдиред

рдЕрдВрддрд╣реАрди рдкрд╛рд╢
 int idJobThread::Run() { threadJobListState_t threadJobListState[MAX_JOBLISTS]; while ( !IsTerminating() ) { int currentJobList = 0; // fetch any new job lists and add them to the local list in threadJobListState {} if ( lastStalledJobList < 0 ) // find the job list with the highest priority else // try to hide the stall with a job from a list that has equal or higher priority currentJobList = X; // try running one or more jobs from the current job list int result = threadJobListState[currentJobList].jobList->RunJobs( threadNum, threadJobListState[currentJobList], singleJob ); // Analyze how job running went if ( ( result & idParallelJobList_Threads::RUN_DONE ) != 0 ) { // done with this job list so remove it from the local list (threadJobListState[currentJobList]) } else if ( ( result & idParallelJobList_Threads::RUN_STALLED ) != 0 ) { lastStalledJobList = currentJobList; } else { lastStalledJobList = -1; } } } 


рдиреМрдХрд░реА рдХрд╛ рд╢реБрднрд╛рд░рдВрдн
 int idParallelJobList::RunJobs( unsigned int threadNum, threadJobListState_t & state, bool singleJob ) { // try to lock to fetch a new job if ( fetchLock.Increment() == 1 ) { // grab a new job state.nextJobIndex = currentJob.Increment() - 1; // release the fetch lock fetchLock.Decrement(); } else { // release the fetch lock fetchLock.Decrement(); // another thread is fetching right now so consider stalled return ( result | RUN_STALLED ); } // Run job jobList[state.nextJobIndex].function( jobList[state.nextJobIndex].data ); // if at the end of the job list we're done if ( state.nextJobIndex >= jobList.Num() ) { return ( result | RUN_DONE ); } return ( result | RUN_PROGRESS ); } 




рдЖрдИрдбреА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рд┐рдВрдХ рдЙрдкрдХрд░рдг


Id рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:
1. рдореЙрдирд┐рдЯрд░реНрд╕ (idSysSignal):
рдорддрд┐рд╣реАрдирддрд╛
рдЖрдкрд░реЗрд╢рди
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЯрд┐рдкреНрдкрдгреА
idSysSignal

рдЗрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ


рдмрдврд╝рд╛рдПрдВ
SetEvent
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯ
ResetEvent
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рдЧреИрд░-рд╕рд┐рдЧреНрдирд▓ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рддреАрдХреНрд╖рд╛
WaitForSingleObject
рдкреНрд░рддреАрдХреНрд╖рд╛ рддрдм рддрдХ рд╣реЛрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рдЧреНрдирд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рди рд╣реЛ рдпрд╛ рдЬрдм рддрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПред
рд╕рд┐рдЧреНрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрдВрдбрд▓рд░ idSysSignal.Wait () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╢реЗрдбреНрдпреВрд▓рд░ рд╕реЗ рдЦреБрдж рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрджрд┐ рдиреМрдХрд░рд┐рдпрд╛рдВ рдЧрд╛рдпрдм рд╣реИрдВ

2. рдореНрдпреВрдЯреЗрдХреНрд╕ (idSysMutex):
рдорддрд┐рд╣реАрдирддрд╛
рдЖрдкрд░реЗрд╢рди
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЯрд┐рдкреНрдкрдгреА
idSysMutex

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╡рд╕реНрддреБрдУрдВ


рддрд╛рд▓рд╛
EnterCriticalSection
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рддрдм рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ рдЬрдм рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдЧреБрдг рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред


рдЕрдирд▓реЙрдХ
LeaveCriticalSection
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред





3. рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди (idSysInterlockedInteger):
рдорддрд┐рд╣реАрдирддрд╛
рдЖрдкрд░реЗрд╢рди
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЯрд┐рдкреНрдкрдгреА
idSysInterlockedInteger

рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдП рдЧрдП рдЪрд░


рд╡реЗрддрди рд╡реГрджреНрдзрд┐
InterlockedIncrementAcquire
рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП 32-рдмрд┐рдЯ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ред рдСрдкрд░реЗрд╢рди рдореЗрдВ "рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд" рд╢рдмреНрджрд╛рд░реНрде рд╣реИред

рдШрдЯрддреА
InterlockedDecrementRelease
рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдП рдЧрдП 32-рдмрд┐рдЯ рдЪрд░ рдХрд╛ рдорд╛рди рдШрдЯрд╛рдПрдБред рдСрдкрд░реЗрд╢рди рдореЗрдВ "рд░рд┐рд▓реАрдЬрд╝" рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рд╣реИред

Source: https://habr.com/ru/post/In181081/


All Articles