From b6c77b19923c1a80747b05bacf5c33af46179759 Mon Sep 17 00:00:00 2001 From: LoafyLemon Date: Fri, 14 Jul 2023 02:33:58 +0100 Subject: [PATCH] Multi-threading preference * Implemented multi-threading preference option * Adjusted code to make asynchronous calls optional * Fixed initialization order for certain tasks --- game/scripts/doll/clothes.rpy | 14 +++++++++++--- game/scripts/doll/common.rpy | 1 + game/scripts/doll/main.rpy | 21 ++++++++++++++------- game/scripts/doll/outfits.rpy | 12 +++++++++--- game/scripts/gui/preferences.rpy | 3 ++- game/scripts/options.rpy | 3 ++- game/scripts/utility/settings.rpy | 2 +- game/scripts/wardrobe/wardrobe.rpy | 14 ++++++++++---- 8 files changed, 50 insertions(+), 20 deletions(-) diff --git a/game/scripts/doll/clothes.rpy b/game/scripts/doll/clothes.rpy index 0f33ef5b..2c3cf17f 100644 --- a/game/scripts/doll/clothes.rpy +++ b/game/scripts/doll/clothes.rpy @@ -281,11 +281,19 @@ init python: thread = DollThread(target=_func, args=(self, self._hash)) thread.start() - @property - def button(self): - return self._button.get_with_default(self._loading) + if settings.get("multithreading"): + @property + def button(self): + return self._button.get_with_default(self._loading) + else: + @property + def button(self): + return self._build_button(self._hash) def clear_button_cache(self): + if not settings.get("multithreading"): + return + self.build_button.cache_clear() def apply_color(self, img, n, maxsize): diff --git a/game/scripts/doll/common.rpy b/game/scripts/doll/common.rpy index 59141225..8aaee2c6 100644 --- a/game/scripts/doll/common.rpy +++ b/game/scripts/doll/common.rpy @@ -79,6 +79,7 @@ init -1 python: for i in states.dolls: doll = getattr(store, i) doll.build_image() + renpy.restart_interaction() config.after_load_callbacks.append(DollRebuild) # end_skip_callbacks.append(DollRebuild) \ No newline at end of file diff --git a/game/scripts/doll/main.rpy b/game/scripts/doll/main.rpy index d85bf6be..9e7d8c60 100644 --- a/game/scripts/doll/main.rpy +++ b/game/scripts/doll/main.rpy @@ -141,17 +141,22 @@ init python: return Fixed(*sprites, self.emote, fit_first=True) - def build_image(self): + if settings.get("multithreading"): + def build_image(self): - def _func(self, hash): - result = self._build_image(hash) - self._sprite.put(result) + def _func(self, hash): + result = self._build_image(hash) + self._sprite.put(result) - thread = DollThread(target=_func, args=(self, self._hash)) - thread.start() + thread = DollThread(target=_func, args=(self, self._hash)) + thread.start() + else: + def build_image(self): + self._sprite.put(self._build_image(self._hash)) + renpy.restart_interaction() def _image(self, st, at): - return self._sprite.get_with_default(None), None + return self._sprite.get_with_default(Null()), None @property def image(self): @@ -619,6 +624,8 @@ init python: self.is_stale() def clear_outfit_button_cache(self): + if not settings.get("multithreading"): + return DollThread.stop_all() diff --git a/game/scripts/doll/outfits.rpy b/game/scripts/doll/outfits.rpy index 9e12198c..16604274 100644 --- a/game/scripts/doll/outfits.rpy +++ b/game/scripts/doll/outfits.rpy @@ -180,9 +180,15 @@ init python: thread = DollThread(target=_func, args=(self, self._hash, subcat)) thread.start() - @property - def button(self): - return self._button.get_with_default(self._loading) + if settings.get("multithreading"): + @property + def button(self): + return self._button.get_with_default(self._loading) + else: + @property + def button(self): + global current_subcategory + return self._build_button(self._hash, current_subcategory) def clear_button_cache(self): self.build_button.cache_clear() diff --git a/game/scripts/gui/preferences.rpy b/game/scripts/gui/preferences.rpy index 76d01658..f1d4ec2d 100644 --- a/game/scripts/gui/preferences.rpy +++ b/game/scripts/gui/preferences.rpy @@ -166,6 +166,7 @@ screen preferences_visuals(): textbutton _("Transitions") action Preference("transitions", "toggle") textbutton _("Videos") action InvertSelected(Preference("video sprites", "toggle")) textbutton _("Power-saving") action Preference("gl powersave", "toggle") + textbutton _("multithreading") action settings.Toggle("multithreading") tooltip "Improves performance by executing tasks asynchronously. (Requires restart)" #if not renpy.mobile: #textbutton _("Preserve Aspect Ratio") action [settings.Toggle("preserve_aspect_ratio"), _DisplayReset()] @@ -176,7 +177,7 @@ screen preferences_visuals(): hbox: bar value DictValue(persistent.custom_settings, "image_cache_size", range=1792, max_is_zero=False, style="slider", offset=256, step=128, force_step=True, action=Notify("Restart the game to apply image cache size changes.")) tooltip "Improves performance at a cost of higher memory usage." - + text get_gpu_info() yalign 1.0 size 10 screen preferences_sound(): diff --git a/game/scripts/options.rpy b/game/scripts/options.rpy index 146577bd..7fa06fa3 100644 --- a/game/scripts/options.rpy +++ b/game/scripts/options.rpy @@ -10,7 +10,7 @@ default preferences.renderer = "auto" default preferences.gl_powersave = False default preferences.audio_when_minimized = False -init python: +init -5 python: settings.default("theme", "auto") settings.default("text_color_day", "#402313ff") settings.default("text_color_night", "#341c0fff") @@ -21,6 +21,7 @@ init python: settings.default("animations", True) settings.default("updates", True) settings.default("image_cache_size", 512) + settings.default("multithreading", True) renpy.music.register_channel("background", "sfx", True) renpy.music.register_channel("sound2", "sfx", False) diff --git a/game/scripts/utility/settings.rpy b/game/scripts/utility/settings.rpy index 3e022954..7b9e801c 100644 --- a/game/scripts/utility/settings.rpy +++ b/game/scripts/utility/settings.rpy @@ -6,7 +6,7 @@ init offset = -10 default persistent.custom_settings = {} default persistent.custom_settings_default = {} -init python in settings: +init -10 python in settings: from store import persistent, Action, DictEquality not_set = object() diff --git a/game/scripts/wardrobe/wardrobe.rpy b/game/scripts/wardrobe/wardrobe.rpy index 9d705298..7a565aa1 100644 --- a/game/scripts/wardrobe/wardrobe.rpy +++ b/game/scripts/wardrobe/wardrobe.rpy @@ -88,10 +88,14 @@ init python: rebuild_wardrobe_icons(category_items, current_subcategory) - thread = DollThread(target=_func, args=(cloth,), interval=0.05) - thread.start() + if settings.get("multithreading"): + thread = DollThread(target=_func, args=(cloth,), interval=0.05) + thread.start() + else: + _func(cloth) + renpy.restart_interaction() - @functools.cache # Cache resets on wardrobe exit + # @functools.cache # Cache resets on wardrobe exit def set_wardrobe_categories(current_category): category_items = OrderedDict( sorted( @@ -425,6 +429,8 @@ label wardrobe_menu(): current_item = char_active.get_equipped_wardrobe_item(category_items, current_subcategory) + category_items = set_wardrobe_categories(current_category) + elif _choice[0] == "deloutfit": python: _confirmed = wardrobe_suppress_warnings or renpy.call_screen("confirm", "Delete this outfit?") @@ -580,7 +586,7 @@ label wardrobe_menu(): renpy.music.play(last_track) DollThread.stop_all() - set_wardrobe_categories.cache_clear() + # set_wardrobe_categories.cache_clear() char_active.build_image() enable_game_menu()