Efficient HTTP file download by chunks in Unreal Engine C++

Chunk downloading is a technique used to retrieve large binary data from the server in separate parts, ensuring reliability and compatibility across different platforms. Unreal Engine’s HTTP module has a limitation of 2GB for binary HTTP response content due to internal restrictions. Specifically, TArray<uint8> uses the int32 size type, which has a maximum value of 2,147,483,647, approximately 2 GB in our case. To overcome this limitation, we can use the Range HTTP header supported by most servers, without requiring any file preparation or segmentation....

May 21, 2023 · 4 min · Georgy Treshchev

Comparison of TUniquePtr and rvalue references in Unreal Engine C++

Note: This is an experimental article and may look strange as it compares two completely different concepts. But nevertheless, I think that they can be compared to some extent, which I did in this article. Smart pointers are typically compared to raw pointers , but this article will compare TUniquePtr, a type of smart pointer in Unreal Engine, and direct rvalue reference. I intentionally add “direct” to the rvalue reference term to make it more clear, because the rvalue reference can be applied to TUniquePtr itself in the same way and this can cause confusion....

February 2, 2023 · 3 min · Georgy Treshchev

How to use mutex in Unreal Engine

Unreal Engine has an alternative implementation of std::mutex called FCriticalSection which makes it possible for your data to be safely accessed from different threads, preventing race conditions. This takes the same approach, handling it with one thread locking until the other thread completes the necessary operations. There are two ways to handle lock/unlock logic. The first is low-level, which is used to directly lock and unlock threads. Use with caution due to possible deadlocks ....

December 21, 2022 · 2 min · Georgy Treshchev

How to properly work with UObjects in background threads (GC)

This short article addresses the question of how to work with UObjects in a thread-safe way when passing them to some workers, asynchronous tasks, thread pools, or whatever else using a non-game thread. One of the crucial issues is garbage collection. When we pass a UObject that is not set to root directly to a background thread, it’s possible that the garbage collector may silently delete the passed UObject. Even if we frequently check the validity of the UObject (IsValidLowLevel()) on a background thread, we cannot guarantee that this object will remain alive, even just a few milliseconds after the check....

November 30, 2022 · 2 min · Georgy Treshchev

How to pass a variable by reference in C++ function called in Blueprints

By default, when a non-const reference is specified in a function, it will be treated by Blueprints as an output parameter: Show/hide content UFUNCTION(BlueprintCallable) static void RemoveDots(FString& String) { String.ReplaceInline(TEXT("."), TEXT(" ")); } There is a macro called UPARAM which is not widely used, but can control the behavior of parameters specified in UFUNCTIONs. In particular, it can change the behavior of passing non-const references by specifying a ref meta:...

August 14, 2022 · 1 min · Georgy Treshchev