WTS/game/scripts/utility/engine.rpy
LoafyLemon 22588ba646 Crash Defender
* Fixed missing cache file from android builds
* Added crash defender workaround for devices with borked OGL implementations
2022-07-07 22:05:22 +01:00

78 lines
2.8 KiB
Plaintext

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