Показать сообщение отдельно
Старый 15.10.2010, 02:09   #211
vasistep

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: G4 ArcaniA: Технические вопросы

Исследование параметров ProcessManager.xml в Arcania.exe

Cпойлер(щелкните, чтобы прочесть):
Если обратили внимание, у каждго процесса движка игры есть секция с описанием параметров:
<CreateProcess instance-name="имя_процесса" [параметры]>
  <ConstraintInterval interval-length="значение" />
  <Message type="название" />
</CreateProcess>
Например:
<CreateProcess instance-name="main" memory-size="80000000" type="Gothic4Process"  thread-pool-bit="2" memory-synchronized="false" memory-logged="false" stall-time="1" >
  <ConstraintInterval interval-length="1" />
  <Message type="Gothic4InitMessage" /></CreateProcess>
<CreateProcess instance-name="renderer" memory-size="140000000" type="SBRendererProcess" memory-synchronized="true" memory-logged="false" thread-pool-bit="1" stall-time="1" >
  <ConstraintInterval interval-length="1" />
  <Message type="SBRendererInitMessage" /></CreateProcess>

Есть секция создания группы:
<CreateGroup name="main_group" ><ProcessInstance name="main" /></CreateGroup>
<CreateGroup name="renderer" ><ProcessInstance name="renderer" /></CreateGroup>

Есть параметр: thread-pool-bit="значение", который задает индекс бита (1..8 или 0..7 ?) который отвечает за идентификацию вычислительной "нити" thread из набора привязанных к ядру в разделе <Thread hardware-mask="значение" thread-pool-mask="значение" />

Я привел соответствующий блок параметров в Arcania.exe к такому виду. Данная правка работает.

<ThreadConfig platform="PC" cores="4" >
<Thread hardware-mask="ffffffff" thread-pool-mask="00000001" />
<Thread hardware-mask="ffffffff" thread-pool-mask="00000002" />
<Thread hardware-mask="ffffffff" thread-pool-mask="00000004" />
<Thread hardware-mask="ffffffff" thread-pool-mask="00000008" />
</ThreadConfig>

Я представляю себе так:
1. "Нить" с маской "00000001" привязывается к "ffffffff" (любому?) ядру процессора. Параметр thread-pool-bit="1" для процесса "render" назначает "нить" с идентификатором по первому биту  thread-pool-mask="00000001".
2. "Нить" с маской "00000002" привязывается к "ffffffff" (любому?) ядру процессора. Параметр thread-pool-bit="2" для процесса "main" назначает "нить" с идентификатором по второму биту  thread-pool-mask="00000002".

Таким образом, для процессов "main" и "render" назначены отдельные "нити". И если подобные назначения "нитей" присвоить всем процессам по отдельности, задав параметр  thread-pool-bit в соответствующей секции описания процесса - мы сможем разделить выполнение процессов по конкретным ядрам.

Жаль, что без возможности считывать данные из ProcessManager.xml нельзя проверить на практике мои предположения.
Ответить с цитированием