ru:toolworks:docs:apparatus:iterating

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
ru:toolworks:docs:apparatus:iterating [2022/01/05 15:46] – Немного поправил jisparru:toolworks:docs:apparatus:iterating [2022/06/05 15:31] (текущий) – обновил в соответствии с англоязычной версией jispar
Строка 1: Строка 1:
 ====== Итерирование ====== ====== Итерирование ======
  
-Чтобы реализовать вашу реальную логику Механики, вам потребуется обработать все Сущности, удовлетворяющие [[ru:toolworks:docs:apparatus:filter|Фильтру]]. В целях эффективности и последовательностиэто делается не напрямую, а через [[ru:toolworks:docs:apparatus:enchaining|Цепи]]. Итерируясь по цепям, вы итерируетесь по всем Сущностям и Сущностным объектам внутри конкретной цепи.+Чтобы реализовать вашу реальную логику Механики, вам потребуется обработать все Сущности, удовлетворяющие [[ru:toolworks:docs:apparatus:filter|Фильтру]]. В целях эффективности и последовательности это делается вручную через [[ru:toolworks:docs:apparatus:enchaining|Цепи]]. Итерируясь по цепям, вы итерируетесь по всем Сущностям и Сущностным объектам внутри конкретной цепи.
  
 В итерации по цепям помогают Курсоры. Их семантика напоминает итераторы в стандартных контейнерах. В итерации по цепям помогают Курсоры. Их семантика напоминает итераторы в стандартных контейнерах.
Строка 88: Строка 88:
  
 Когда указатель-Курсор Цепи пройдёт последнюю доступную Сущность (или Сущностный объект), Цепь будет уничтожена и ранее заблокированные чанки и ремни вновь разблокируются, все ожидаемые структурные изменения будут незамедлительно выполнены (если они вообще были). Когда указатель-Курсор Цепи пройдёт последнюю доступную Сущность (или Сущностный объект), Цепь будет уничтожена и ранее заблокированные чанки и ремни вновь разблокируются, все ожидаемые структурные изменения будут незамедлительно выполнены (если они вообще были).
 +
 +==== Прямое итерирование ====
 +
 +Если вам необходимо итерироваться по чанкам напрямик, вы можете инициализировать Чанк-Прокси.
 +Обычно, вам потребуется проитерироваться по всем собранным Прокси через соответсвующий [[appi>class_a_mechanism.html#ae72188d973bed3d8484dc5ab87e5e1e1|Enchain]] метод и 
 +в каждом чанке итерироваться по его Сущностям-слотам.
 +
 +Пример будет таким:<code cpp>
 +TArray<TChunkProxy<FSolidSubjectHandle, FJumpingTrait>> ChunkProxies;
 +Mechanism->Enchain(TFilter<FJumpingTrait>(), ChunkProxies);
 +for (int32 i = 0; i < ChunkProxies.Num(); ++i) // Итерируемся по всем подходящим чанкам...
 +{
 + auto& ChunkProxy = ChunkProxies[i];
 + for (int32 j = 0; j < ChunkProxy.Num(); ++j) // Итерируемся по слотам...
 + {
 + // Perform the necessary logic...
 + ChunkProxy.TraitRefAt<FJumpingTrait>(j).Position += FVector::UpVector * DeltaTime;
 + }
 +}
 +</code>
 +
 +Заметьте, однако, что этот подход абсолютно ручной, и не выполняет какие-либо логические проверки во время итерирования, например, [[ru:toolworks:docs:apparatus:flagmark|совпадение флагов]].
 +
 +Если вы также выполняете изменение топологии внутри ваших циклов, то ваши сущности могут произвольно изменить свои чанки или слоты, поэтому вам скорее всего потребуется проверять слоты на (не-)свежесть.
 +
 +Сделать это можно так:<code cpp>
 +for (int32 j = 0; j < ChunkProxy.Num(); ++j) // Итерируемся по всем слотам чанка...
 +{
 + if (ChunkProxy.IsStaleAt(j)) continue; // Пропустить сущность, если она была перемещена или удалена...
 +
 + ChunkProxy.SubjectAt(j).SetTrait(FSpeedBoostTrait{10.0f});
 +}
 +</code>
 +
 +
 +Итерация чанков напрямую (через прокси) может дать определенный прирост производительности по сравнению с обычной итерацией и [[ru:toolworks:docs:apparatus:operating|оперированием]]. В основном это связано с возможностью контролировать каждый аспект итерации вручную и исключать все лишние проверки. Вам просто нужно точно знать, что вы делаете и чего пытаетесь достичь, так как этот способ менее безопасен.
 +
  • ru/toolworks/docs/apparatus/iterating.1641386769.txt.gz
  • Последнее изменение: 2022/01/05 15:46
  • jispar