Вы находитесь на странице: 1из 10

Основы архитектуры движка

https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/ProgrammingWithCPP/
 Какие отличия между классами UObject и AActor? В чём принципиальное
отличие? Можно ли заставить UObject выполнять те же самые функции? Почему
AGameState и APlayerState являются экторами? Аналогичный вопрос про
AGameMode и AHUD.

1,2) UObject — базовый класс почти для всего, что есть в Unreal Engine 4. От него
наследуется подавляющее большинство объектов, которые создаются у вас в мире или
просто в памяти: объекты на сцене (AActor), компоненты (UActorComponent), разные
типы для работы с данными и прочие.
Сам класс хоть и легче производных, но при этом достаточно функционален.
Например, он содержит многие полезные события, такие как изменение значений
переменных в редакторе и базовые функции для сети, которые не активны по
умолчанию.
Объекты, созданные этим классом, не могут находиться на сцене и существуют
исключительно в памяти. Их нельзя добавить как компоненты к Actor’ам, хотя он
может являться своего рода компонентом, если самому реализовать необходимый
функционал. Для чего мне UObject, если AActor уже поддерживает все, что нужно? В
общем-то, примеров использования масса. Самый простой — предметы для
инвентаря. На сцене, где-то в небе, хранить их нецелесообразно, поэтому можно
хранить в памяти, не нагружая рендер и не создавая лишних свойств. Для тех, кто
любит технические сравнения, то AActor занимает килобайт (1016 байт), а пустой
UObject всего 56 байт.
-UObject’ы не реплицируются по сети;
• из-за первого пункта мы не можем вызывать RPC события;
• нельзя использовать обширный набор функций, требующих ссылку на мир в
Блупринтах;
• в них нет стандартных событий вроде BeginPlay и Tick;
• нельзя добавлять компоненты из UObject’ов в AActor в Блупринтах.
3) https://habr.com/en/company/pixonic/blog/475622/
 Чем AGameMode отличается от UGameInstance? Для чего они оба используются?
Зачем нужен APlayerController, и почему он является эктором?
1) GameInstance: high-level manager object for an instance of the running game. Spawned
at game creation and not destroyed until game instance is shut down. Running as a
standalone game, there will be one of these. Running in PIE (play-in-editor) will generate
one of these per PIE instance.
2) GameMode is a subclass of GameModeBase that behaves like a multiplayer match-based
game. It has default behavior for picking spawn points and match state. If you want a
simpler base, inherit from GameModeBase instead.

3) PlayerControllers are used by human players to control Pawns.


ControlRotation (accessed via GetControlRotation()), determines the aiming orientation
of the controlled Pawn. In networked games, PlayerControllers exist on the server for every
player-controlled pawn, and also on the controlling client's machine. They do NOT exist on
a client's machine for pawns controlled by remote players elsewhere on the network.

 Для чего используется UPROPERTY? Можно ли заменить его SharedRef'ами? Как


решить Circular Dependency у экторов (родитель имеет указатель на ребёнка, ребёнок
— на родителя)? Когда будет удалён UObject? Как защитить сущность от удаления
Garbage Collector'ом? Как удалить Actor'а?

1)Exposing Variables and Functions to the Editor


2)A Shared Reference is a strong, non-nullable Smart Pointer for data objects outside of
the Engine's UObject system. This means you cannot reset a Shared Reference, assign a
null object to it, or create an empty one. Because of this, Shared References always contain a
valid object, and do not even have an IsValid method. When choosing between Shared
References and Shared Pointers, Shared References are the preferred option unless you
need an empty or nullable object. If you need potentially-empty or nullable references, you
should use Shared Pointers instead

https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/SmartPointerLib
rary/SharedReference/
3) https://unrealcommunity.wiki/forward-declarations-teqxgfp6
4)
5)referencing in reflection,ptr to obj stored in container, strong pointer class,
emplace obj on GC graph, derived obj not from uobject
6)GetWorld()->DestroyActor() or remote on dedicated server
 Что такое CDO? Как можно прервать цепочку Reference'ов классов друг на друга, и
зачем?
1)CDO is Class Default Object, it's a master copy of object for specific class contained in
reflection system which in this case it's contained in class representing the class which is
UClass. CDO contains object defaults and make them accessible very easily since C++ don't
have such a feature. It is also used to hold default values of variables in virtual classes
created from blueprints for example. CDO is created when engine is initialized when it
generates UClass objects for each class, then it naturally executes constructor setting default
variables. Thats also reason why you should not use objects or gameplay code in constructor,
because constructor is executed early in engine initiation stage where most objects don't
exist, not to mention level is most likely won't be even loaded at that point. You should use
different start up events which both UObject and AActor contains for many stages of it's
creation process
access CDO
https://docs.unrealengine.com/4.27/en-
US/API/Runtime/CoreUObject/UObject/UClass/GetDefaultObject/1/
 Каков порядок инициализации основных сущностей движка (хотя бы на уровне
контроллер/павны/стейты)? Каков порядок спавна Aactor'а?
1)https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Framework/GameFlow/
2) https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/ActorLife
cycle/
https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/Spawning
/

 Компонент в компоненте — хорошо или плохо?


https://www.reddit.com/r/unrealengine/comments/kp26mc/ue4_add_components_from_com
ponent/

 Что такое WorldContextObject? Можно ли его взять в UObject'е, и если да, то


откуда?

 В чем принципиальное отличие Slate от UMG?


1) Slate is the old Unreal UI system, and is what the UMG and the editor are built on. It uses
some funky-looking C++ to simplify setting up widgets. It’s important to understand that
just because it’s the “old” system doesn’t mean it’s obsolete. You will gradually need to
learn Slate in order to add more complicated functionality to your UIs. UMG is the newer
UI system that was added as part of Unreal 4. It is designed to be more Blueprint-friendly
and let designers visually lay out their UIs in the editor. Each UMG widget generally has an
almost-identically named Slate class inside it. The **Slate class handles most of the logic,
and its corresponding UMG class is a wrapper around it. e.g. UImage is the UMG class,
and it contains a SImage instance inside it.

https://benui.ca/unreal/ui-cpp-basics/
 Можно ли использовать STL? Зачем в Unreal Engine свой набор контейнеров? Зачем
движку нужны свои "умные указатели", если есть UPROPERTY?

1)https://forums.unrealengine.com/t/why-doesnt-ue-utilize-stl-containers/34551
2)https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/SmartPointerLib
rary/
 Как узнать потребление памяти на момент Х и структуру (содержимое) этой памяти?
Каким образом можно проверить целостность памяти и найти утечки? Как работает
Garbage Collector и какие у него боттлнеки?

https://docs.unrealengine.com/4.27/en-
US/ProductionPipelines/DevelopmentSetup/Tools/LowLevelMemoryTracker/
https://www.unrealengine.com/en-US/blog/debugging-and-optimizing-memory
https://docs.unrealengine.com/5.0/en-
US/PerformanceAndPlatformFeatures/MemoryInsights/
UPROPERTY adds overhead in that the code gets bigger, and there is also some runtime
overhead (although most of that is per-class, not per-class-instance, as far as I understand it.)
It also makes your class harder to configure in blueprints, because it will have tons of visible
variables. If you don’t use blueprints, not so much of a problem. If you use blueprints,
making then “Advanced Display” may help reduce clutter.
Epic’s GC knows about UObjects. GC will only look at properties with UPROPERTY to see
if the UOBJECT is being referenced. No UPROPERTY at all on an UOBJECT, then that
UOBJECT can be deleted as it is not pointing to any other object and as that object is not
being held as a reference by another UPROPERTY since you were not using any
UPROPERTY.
GC - https://nerivec.github.io/old-ue4-wiki/pages/garbage-collection-dynamic-memory-
allocation.html
https://mikelis.net/garbage-collection-in-ue4-a-high-level-overview/
 Каким образом можно загрузить что-либо (текстуру, блюпринт, эктор, карту)
асинхронно, и какие ограничения на этот процесс есть у движка? К чему приведет
вызов функции синхронной загрузки ассета или его части в общем процессе
асинхронной загрузки?
1)https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/Assets/AsyncLoading/
https://habr.com/en/company/mailru/blog/309228/
 Многопоточный ли анриал? Как устроен основной цикл кадра/обновления мира?
Какие способы проводить асинхронные вычисления есть на движке, и какие у них
особенности?
1)Yes
2)https://docs.unrealengine.com/4.26/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/Ticking/
3)https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Rendering/ShaderDevelopment/AsyncCompute/
 Почему UPROPERTY — это пустой макрос? Как происходит процесс сборки
бинарников проекта? Что такое unity build, зачем он нужен и какие
плюсы/минусы у него есть?
1)Those macros are empty, they just markers for UHT and they are bypassed by compiler
2) https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/BuildTools/

3)https://en.wikipedia.org/wiki/Unity_build
 Что такое SlateApplication и какую роль играет в основном loop'е движка?
Какой путь проходит событие ввода от нажатия клавиши до PlayerInput?

1)https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/Slate/Sleeping/
2)https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Input/

Blueprints
 Чем отличаются макросы от функций?
https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Blueprints/BestPractices/
 Использование чего именно приводит к образованию Referenc'ов между классами?
Ассетами? Как этого избежать?
https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/ProgrammingWithCPP/ReferenceAssets/
 Что такое нативизация блюпринтов и какая от неё польза? Какие недостатки у
включенной нативизации?
https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Blueprints/TechnicalGuide/NativizingBlueprints/
https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Blueprints/TechnicalGuide/NativizingBlueprints/Advanced/
 Как технически работают блюпринты на уровне виртуальной машины? Как устроен
EventGraph и что такое FFrame? Как происходит вызов функций из БП в нативный
код и обратно?
1)https://ikrima.dev/ue4guide/engine-programming/blueprints/bp-virtualmachine-overview/
https://forums.unrealengine.com/t/how-does-blueprint-system-technically-work/118569/2
2)https://docs.unrealengine.com/4.27/en-
US/AnimatingObjects/SkeletalMeshAnimation/AnimBlueprints/EventGraph/
https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/FFrame/
3)https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Blueprints/TechnicalGuide/NativizingBlueprints/
 Как устроены латентные функции?
https://www.casualdistractiongames.com/post/2016/05/15/creating-latent-functions-for-
blueprints-in-c
http://unktomi.github.io/Latent-Actions-Cont/Cont.html
 (Advanced) Как можно реализовать wildcard in/out параметры и как работают
CustomThunk функции?

https://forums.unrealengine.com/t/tutorial-how-to-accept-wildcard-structs-in-your-
ufunctions/18968
CustomThunk - The UnrealHeaderTool code generator will not produce a thunk for this
function; it is up to the user to provide one with the DECLARE_FUNCTION or
DEFINE_FUNCTION macros.

Сеть
 Где хранить геймплейные данные пользователя (например, инвентарь или количество
очков) во время игровой сессии? Является ли APlayerController подходящим
местом?
https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Framework/Controller/PlayerController/
 Как PlayerState'ы реплицируются на клиенты? Каков жизненный цикл
PlayerController'а и PlayerState'ов при переподключении игрока?
https://michaeljcole.github.io/wiki.unrealengine.com/Replication/
https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/Blueprints/
 Как разграничить репликацию данных по ролям? Что такое сетевые роли? Кем и по
каким правилам они назначаются?
https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Networking/Actors/Roles/
 На каких классах можно вызывать RPC и почему? Можно ли расширить эту
возможность на другой класс/сущность? Какие накладные расходы существуют на
вызов RPC?
1)https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/Actors/RPCs/
 Как реплицируются компоненты эктора? Как понять, что эктор реплицировался
«целиком»? Что произойдет, если требуется отреплицировать, допустим, 3 Мб
данных в экторе: как будет вести себя этот эктор? игра в целом?
1) https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/Actors/Components/
2) https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/Actors/ReplicationPerformance/
 Как реплицируются массивы? И как реплицируются вложенные свойства
(реплицируемое поле является структурой)?
1)https://answers.unrealengine.com/questions/170276/array-replication-to-all-clients.html
https://answers.unrealengine.com/questions/1021826/what-is-the-best-way-of-replicating-
this-array-of.html
2) https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/Actors/Properties/
 Какие ограничения сети существуют? (Цифры!) Как профилировать нагрузку на сеть?
Какие методы оптимизации сети применяются? Для чего нужен ForceNetUpdate?

1)https://answers.unrealengine.com/questions/990482/network-bandwith-limit.html
https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/Actors/ReplicationPerformance/
2)https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/NetworkProfiler/
3)https://docs.unrealengine.com/4.27/en-
US/InteractiveExperiences/Networking/Actors/ReplicationPerformance/
4)Force actor to be updated to clients/demo net drivers
https://answers.unrealengine.com/questions/868935/force-net-update-and-reliable.html

Физика и базовые алгоритмы


https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Physics/
 Как работает демпфирование? Что такое сабстеппинг? Для чего он используется? Как
работает синхронизация физики по сети?
1)https://docs.unrealengine.com/4.26/en-
US/InteractiveExperiences/Physics/Constraints/DampingAndFriction/
2) https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Physics/Substepping/
3) https://forums.unrealengine.com/t/video-player-controlled-replicating-physics-movement-
simulating-physics/7302
https://gafferongames.com/post/introduction_to_networked_physics/
 Что такое кватернион и какие проблемы решает их применение?
https://habr.com/en/post/426863/
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Core/Math/FQuat/
 Что такое каналы объектов и трассировки? Можно ли настроить различное поведение
в рамках одного physics asset? Если нет, то почему, и как это обойти?
1)https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Tracing/
 Насколько дорогой операцией является трассировка? От чего это зависит?

Потоки
 Какие основные потоки есть в UE4? Какие задачи выполняются параллельно, а какие
нет? Как устроены тик-группы?
 Какие действия можно выполнять в собственных параллельных потоках? (Или какие
действия точно нельзя выполнять?) Как синхронизировать результаты с основным
тредом?
https://unrealcommunity.wiki/multi-threading:-how-to-create-threads-in-ue4-0bsy2g96
https://unrealcommunity.wiki/multithreading-with-frunnable-2a4xuf68
https://unrealcommunity.wiki/multi-threading:-task-graph-system-pah8k101
https://medium.com/hri-tech/tick-101-implementation-approach-and-optimization-tips-
c6be10b3e092
https://www.orfeasel.com/implementing-multithreading-in-ue4/

Rendering
Означенная глубина погружения не предполагает, что вы — рендер-программист. Скорее
это взгляд со стороны техарта и "интересующегося" программиста на одни из самых
высокоуровневых вопросов.
https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/Rendering/
 Что такое draw call? Какие есть способы батчинга? Инстансинг vs батчинг?
1) https://unreal.tips/en/what-are-draw-calls/
2)https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Rendering/MeshDrawingPipeline/
 В чем разница между Forward и Deferred рендерингом? (Advanced) А сколько вообще
основных архитектур на текущий момент? Чем принципиально отличается рендеринг
на мобилках/консолях от десктопного?
 В чем отличия рендеринга непрозрачных объектов от прозрачных? Что за зверь
Masked? (Advanced) А чем такой подход опасен на мобилках?

 Чем отличается Shader от Material?

https://answers.unrealengine.com/questions/174314/shaders-vs-materials.html
 Какие типы шейдеров существуют и в чем назначение каждого? Как это используется
в движке и отражено в материалах?
https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Rendering/ShaderDevelopment/
 Зачем нужны mipmaps? В чем сила power of two текстур?
1) , mipmaps (also MIP maps) or pyramidsare pre-calculated, optimized sequences of
images, each of which is a progressively lower resolution representation of the previous. The
height and width of each image, or level, in the mipmap is a factor of two smaller than the
previous level. Mipmaps do not have to be square. They are intended to increase rendering
speed and reduce aliasing artifacts. A high-resolution mipmap image is used for high-density
samples, such as for objects close to the camera; lower-resolution images are used as the
object appears farther away. This is a more efficient way of downfiltering (minifying) a
texture than sampling all texels in the original texture that would contribute to a screen
pixel; it is faster to take a constant number of samples from the appropriately downfiltered
textures. Mipmaps are widely used in 3D computer games, flight simulators, other 3D
imaging systems for texture filtering, and 2D and 3D GIS software. Their use is known as
mipmapping. The letters MIP in the name are an acronym of the Latin phrase multum in
parvo, meaning "much in little". Since mipmaps, by definition, are pre-allocated, additional
storage space is required to take advantage of them. They are also related to wavelet
compression. Mipmap textures are used in 3D scenes to decrease the time required to render
a scene. They also improve image quality by reducing aliasing and Moiré patterns that occur
at large viewing distances,at the cost of 33% more memory per texture.
2) https://gamedev.stackexchange.com/questions/26187/why-are-textures-always-square-
powers-of-two-what-if-they-arent
 Что такое texture compression, как оно работает и используется?

https://en.wikipedia.org/wiki/Texture_compression
 В чем сила indirect sampling? Что означает это на практике в контексте анрила?

 Как устроен цикл рендеринга на движке? Что такое RHI и <Smth>Proxy


(FPrimitiveSceneProxy)?

1)https://habr.com/en/post/341080/
2)https://docs.unrealengine.com/4.27/en-
US/ProgrammingAndScripting/Rendering/Overview/
 Как работают Particle Systems? Где происходит расчет частиц, в каких случаях?

https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/ParticleSystems/

Animation
 В чем отличия рендеринга skeletal mesh от static mesh? Какие основные
параметры и метрики у скелеталки? Какие техники оптимизации скелетной анимации
используются на движке? (Advanced) По каким причинам Nanite не работает для
скелетной анимации?
1) static = no animations, no rigg -> for the level creation
skeletal mesh = rigg, animations -> used for moving stuff like characters
https://www.notion.so/UE4-Meshes-d5d36e44c4f3449b8810837af43d371e
2)https://docs.unrealengine.com/4.27/en-
US/AnimatingObjects/SkeletalMeshAnimation/Persona/MeshDetails/
3)https://docs.unrealengine.com/4.27/en-
US/AnimatingObjects/SkeletalMeshAnimation/Optimization/
4)Nanite is currently limited to rigid meshes. These represent greater than 90% of the
geometry in any typical scene for projects and is the initial focus of Nanite development.
Nanite supports dynamic translation, rotation, and non-uniform scaling of rigid meshes, but
does not support general mesh deformation, whether it is dynamic or static. This means any
position of a Nanite mesh in a way that is more complex than can be expressed in a single
4x3 matrix multiply applied to the entire mesh.
 Какие методы наследования и композиции в Animation Blueprint возможны для
использования? Плюсы и минусы каждого из них?
1)https://docs.unrealengine.com/4.27/en-
US/AnimatingObjects/SkeletalMeshAnimation/AnimHowTo/AnimBPOverride/

 Какие способы анимации вообще могут быть? Какая информация и каким образом
хранится в каждом случае?
https://docs.unrealengine.com/4.27/en-
US/AnimatingObjects/SkeletalMeshAnimation/Overview/

Прочее
Пара дополнительных полезных вопросов вне категорий.
 Что влияет на размер финального билда? Каким образом можно исследовать этот
вопрос?
https://docs.unrealengine.com/4.27/en-
US/TestingAndOptimization/PerformanceAndProfiling/ReducingPackageSize/
 Git, Perforce, Subversion, PlasticSCM и другие — что лучше для работы с
Unreal Engine и почему? Какие проблемы могут быть?

Profiling
https://docs.unrealengine.com/4.27/en-US/TestingAndOptimization/
https://docs.unrealengine.com/4.27/en-US/SharingAndReleasing/PixelStreaming/

AutoTesting
https://docs.unrealengine.com/4.27/en-US/TestingAndOptimization/Automation/
https://blog.zuru.tech/coding/2021/02/12/unit-testing-with-unreal-engine-4
https://www.orfeasel.com/unit-testing/