diff --git a/Sources/kha/internal/AssetsBuilder.hx b/Sources/kha/internal/AssetsBuilder.hx index 529e2b4d0..b5285cfec 100644 --- a/Sources/kha/internal/AssetsBuilder.hx +++ b/Sources/kha/internal/AssetsBuilder.hx @@ -6,13 +6,17 @@ import haxe.macro.Context; import haxe.macro.Expr; #if macro import sys.io.File; +import sys.FileSystem; #end using StringTools; class AssetsBuilder { #if macro - public static var files: Array; + @:persistent static var cache: Map}> = []; + @:persistent static var files: Array; + @:persistent static var filesTime: Float = 0.0; + static var debug = false; #end public static function findResources(): String { @@ -51,18 +55,31 @@ class AssetsBuilder { } macro static public function build(type: String): Array { - var fields = Context.getBuildFields(); - if (files == null) { - var content = Json.parse(File.getContent(findResources() + "files.json")); + final fields = Context.getBuildFields(); + final resPath = findResources() + "files.json"; + Context.registerModuleDependency(Context.getLocalModule(), resPath); + + final time = FileSystem.stat(resPath).mtime.getTime(); + if (cache[type] != null && cache[type].time == time) { + return cache[type].fields; + } + + if (files == null || filesTime != time) { + final content = Json.parse(File.getContent(resPath)); files = content.files; + filesTime = time; + if (debug) + trace("reparse files.json (Assets)"); } + if (debug) + trace('invalidate Assets.$type'); - var names = new Array(); + final names = new Array(); for (file in files) { - var name = file.name; + final name = file.name; final pos = Context.currentPos(); - var filesize: Int = file.file_sizes[0]; + final filesize: Int = file.file_sizes[0]; if (file.type == type) { names.push(macro $v{name}); @@ -210,6 +227,10 @@ class AssetsBuilder { kind: FVar(macro : Array, macro $a{names}), pos: Context.currentPos() }); + cache[type] = { + fields: fields, + time: time, + }; return fields; } diff --git a/Sources/kha/internal/ShadersBuilder.hx b/Sources/kha/internal/ShadersBuilder.hx index d86a7096e..4bba00779 100644 --- a/Sources/kha/internal/ShadersBuilder.hx +++ b/Sources/kha/internal/ShadersBuilder.hx @@ -6,25 +6,32 @@ import haxe.macro.Expr.Field; import haxe.Serializer; #if macro import sys.io.File; +import sys.FileSystem; #end using StringTools; class ShadersBuilder { #if macro - public static var files: Array; + @:persistent static var cache: {time: Float, fields: Array} = null; + static var debug = false; #end macro static public function build(): Array { - var fields = Context.getBuildFields(); - - var manifestPath = AssetsBuilder.findResources() + "files.json"; - var content = Json.parse(File.getContent(manifestPath)); - + final fields = Context.getBuildFields(); + final manifestPath = AssetsBuilder.findResources() + "files.json"; // rebuild Shaders module whenever manifest file is changed Context.registerModuleDependency(Context.getLocalModule(), manifestPath); - files = content.files; + final time = FileSystem.stat(manifestPath).mtime.getTime(); + if (cache != null && time == cache.time) { + return cache.fields; + } + + final content = Json.parse(File.getContent(manifestPath)); + final files: Array = content.files; + if (debug) + trace("invalidate Shaders"); var init = macro {}; @@ -204,6 +211,10 @@ class ShadersBuilder { }), pos: Context.currentPos() }); + cache = { + fields: fields, + time: time, + }; return fields; }