Back
Official Unreal Engine (UE,UE4) User Group
13 Jan at 8:42 pmVladimir Khanin

GetAllActorsOfClass как работает?

Кратко: Мы не обрабатываем всех актеров со сцены, мы получаем только список необходимых актеров по классу из кэша данных, потому если в мире 3 актера мы их и получим.

Чуть ниже была тема и спор о GetAllActorsOfClass и что это плохо потому что идет перебор по всем актерам, а не по конкретному классу. Слегка развенчаю миф, это вовсе не значит что нужно 100% кода делать так, но в ситуациях похожих на ту что внизу, допустимо. Итак:

1) При вызове GetAllActorOfClass

2) в коде вызывается перебор по всем актерам класса for(TActorIterator<AActor> It(World, ActorClass); It; ++It), И вот казалось бы, вот корень зла идем по всем актерам выкидываем, но нет идем дальше

3) GetObjectsOfClass(InClass, ObjectArray, true, ExcludeFlags, EInternalObjectFlags::PendingKill); и вновь все классы, но все еще мимо

4) в UObjectHash классе, вызывается функция: ForEachObjectOfClass(ClassToLookFor, [&Results](UObject* Object)

{ Results.Add(Object); } , bIncludeDerivedClasses, ExclusionFlags, ExclusionInternalFlags), которая собирает наш конечный список, как можно заметить, постоянно идет список наших актеров.

Проваливаемся еще чуть дальше, видим 3 строки:

// Most classes searched for have around 10 subclasses, some have hundreds

TArray<const UClass*, TInlineAllocator<16>> ClassesToSearch;

ClassesToSearch.Add(ClassToLookFor);

Вот список классов которые нам необходимо собрать.
5) Вызывается функция ForEachObjectOfClasses_Implementation(ThreadHash, ClassesToSearch, Operation, ExclusionFlags, ExclusionInternalFlags); вот она:

GetAllActorsOfClass как работает?, image #1

В которой мы уже окончательно будем собирать наш список
6) Прекрасная хеш мапа: ClassToObjectListMap, в которой хранится все объекты которые есть на сцене, у меня в проекте их около 5000, вот примерное представление и там же класс который я собственно и искал

GetAllActorsOfClass как работает?, image #2

7) Тем самым, мы получаем не глупый перебор всех возможных актеров со сцены, а только список необходимых нам, с кэша.

P.S. Да, возможно при первом вызове произойдет попадание в кэш вашего списка актеров, но при дальнейшей обработке, вы будете получать лишь за кэшированный список.

265 views