Avoid updating textures more often than needed#2365
Open
axeldavy wants to merge 2 commits intohoffstadt:masterfrom
Open
Avoid updating textures more often than needed#2365axeldavy wants to merge 2 commits intohoffstadt:masterfrom
axeldavy wants to merge 2 commits intohoffstadt:masterfrom
Conversation
The textures are updated using a PBO. The correct order is: - Fill the PBO - Trigger the texture update from the PBO And not the other. This fixes incorrect data being sent on some frames.
Track whether the texture content has changed. This enables to avoid updating the texture every frame if the content hasn't changed.
|
Sadly this will break some advanced usecases: import dearpygui.dearpygui as dpg
import array
SIZE = dict(
X = 500,
Y = 500,
)
float_rgba = array.array('f') # sizeof 4
float_rgb = array.array('f') # sizeof 4
for i in range(0, SIZE["X"] * SIZE["Y"]):
# r g b a
float_rgba.extend((1.0, 0, 1.0, 1.0))
float_rgb.extend ((1.0, 0, 1.0))
def update_dynamic_texture(sender, app_data, target_color):
if "pick_float_rgba" == sender:
for i, val in enumerate(target_color):
target_color[i] = app_data[i % 4]
elif "pick_float_rgb" == sender:
for i, val in enumerate(target_color):
target_color[i] = app_data[i % 3]
dpg.create_context()
with dpg.texture_registry(show=True):
dpg.add_raw_texture(width=SIZE["X"], height=SIZE["Y"], default_value=float_rgba, format=dpg.mvFormat_Float_rgba, tag="float_rgba")
dpg.add_raw_texture(width=SIZE["X"], height=SIZE["Y"], default_value=float_rgb, format=dpg.mvFormat_Float_rgb, tag="float_rgb")
with dpg.window(tag="MAIN",label="???"):
with dpg.group(horizontal=True):
dpg.add_image("float_rgba")
dpg.add_color_picker(
(255, 0, 255, 255),
tag="pick_float_rgba",
label="float_rgba",
no_side_preview=True,
alpha_bar=True,
width=SIZE["X"],
callback=update_dynamic_texture,
user_data=float_rgba
)
dpg.add_image("float_rgb")
dpg.add_color_picker(
(255, 0, 255),
tag="pick_float_rgb",
label="float_rgb",
no_side_preview=True,
alpha_bar=True,
width=SIZE["X"],
callback=update_dynamic_texture,
user_data=float_rgb
)
dpg.create_viewport(title='???', width=1000, height=1000)
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.set_primary_window("MAIN", True)
dpg.start_dearpygui()
dpg.destroy_context()Problem stems from fact that with raw textures the data could be modified directly inside the array and DPG just listens upon it, there's just no trigger that it was modified. :( |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
name: Pull Request
about: Create a pull request to help us improve
title: Avoid updating textures more often than needed
assignees: @hoffstadt
Description:
Currently textures are updated more often than needed, which can slow frame rate.
I found this issue using image series with large textures.
This pull request ensures that dynamic textures and raw textures are only updated when needed.
In addition the linux backend has a small bug that is fixed in this pull request. Indeed the previous PBO content was uploaded to the texture. This could introduce artifacts on a single frame. But since the textures are not updated every frame anymore with the proposed change, this fix is mandatory to prevent staying with the wrong content. The windows and Apple code do not seem to have this issue based on my analysis of the code.
In my use-case, the changes result in a x4 speedup.
Concerning Areas:
The changes are pretty trivial, and should be easy to review.