perf: avoid too large buffer allocations #119
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I noticed that displaying an png was taking a significant amount of memory.
After some profiling I found too issues that cause too much memory allocations:
rows_frame
androws_buffer
arepng_bytep
arrays. C++ will already allocate the elements to have a size ofpng_bytep
. Us multiplying the height with thesizeof(png_bytep)
is actually not needed.sizeof(png_bytep)
returns1
anyway. However, for correctness I added this change.height * width
as frame byte size to theApngFrame
:size = height * row_bytes
whererow_bytes
is basicallywidth * channels (4)
ApngFrame
s internal pixel array is already auint32_t
. Meaning one value already includes the precomputed value for all channels (seesaveFrame
).ApngFrame
s internal pixel array is oversized by 4x. By changing it towidth * height
its size is correctWe had an extreme case where the animation (and rest of the app) before took ~1.7GB:
With this change we were able to bring it down to ~700mb, a 2.3x improvement:
Related to:
Important
This performance improvement was sponsored by Discord 🌟