init python: if renpy.android: settings.default("crashdefendersetting", 0) # Attempts at fixing the texture leak plaguing # android devices, mainly running on Android11 & Android 12. class Android11TextureLeakFix(NoRollback): def __init__(self, limit=100): self.statements = 0 self.set_mode(settings.get("crashdefendersetting")) def set_mode(self, mode): if mode == 3: self.limit = 15 elif mode == 2: self.limit = 25 elif mode == 1: self.limit = 55 else: self.limit = 0 def __call__(self, name): if renpy.is_init_phase() or self.limit == 0: return self.statements += 1 if self.statements > self.limit: self.statements = 0 # Big thanks to Andykl (https://github.com/Andykl) # for finding the issue and inventing this workaround. # https://github.com/renpy/renpy/issues/3643 cache = renpy.display.im.cache cache_size = cache.get_total_size() cache_limit = cache.cache_limit * 0.95 if cache_size >= cache_limit: if config.developer: print("Cache limit reached, purging cache... ({}/{})\n{}".format(cache_size, cache_limit, renpy.get_filename_line())) cache.clear() if renpy.game.interface is not None: if config.developer: print("Statements limit reached, cleaning textures... ({})\n{}".format(self.limit, renpy.get_filename_line())) renpy.game.interface.full_redraw = True renpy.game.interface.restart_interaction = True if renpy.display.draw is not None: renpy.display.draw.kill_textures() renpy.display.render.free_memory() crashdefender = Android11TextureLeakFix() config.statement_callbacks.append(crashdefender) init -10 python: if renpy.windows: # On windows, Renpy does not support backslashes in some of its functions, # but because the code needs to be platform-independent, # we require to monkey patch those functions in order # to remain compatible with all platforms without losing functionality. @renpy.pure def _loadable(filename): filename = filename.replace("\\", "/") return renpy.loader.loadable(filename) renpy.loadable = _loadable