From f12f2f9012ec8580701ff9184cd9b6429034773c Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sun, 12 Feb 2017 21:57:23 +0700 Subject: [PATCH] new small vector scaled items optimization --- Assets/FlashTools/Docs/CHANGELOG.txt | 1 + .../FlashTools/FlashExport/FlashExport.jsfl | 142 ++++++++++++++++-- .../FTEditor/Editors/SwfClipAssetEditor.cs | 2 +- 3 files changed, 131 insertions(+), 14 deletions(-) diff --git a/Assets/FlashTools/Docs/CHANGELOG.txt b/Assets/FlashTools/Docs/CHANGELOG.txt index b44a874..573d83c 100644 --- a/Assets/FlashTools/Docs/CHANGELOG.txt +++ b/Assets/FlashTools/Docs/CHANGELOG.txt @@ -5,6 +5,7 @@ ETC separated alpha support Export animations with custom scale (for retina) Added note message about problems of animation in preview +New small vector scaled items optimization ------------------- -- Version 1.2.0 -- diff --git a/Assets/FlashTools/FlashExport/FlashExport.jsfl b/Assets/FlashTools/FlashExport/FlashExport.jsfl index 773fe3a..97256a1 100644 --- a/Assets/FlashTools/FlashExport/FlashExport.jsfl +++ b/Assets/FlashTools/FlashExport/FlashExport.jsfl @@ -18,6 +18,7 @@ profile_mode : false, verbose_mode : false, graphics_scale : 1.0, + optimize_small_items : true, optimize_static_items : true, optimize_single_graphics : true }; @@ -216,12 +217,23 @@ ft.type_assert(doc, Document); ft.profile_function(function() { ftdoc.prepare_folders(doc); }, "Prepare folders"); ft.profile_function(function() { ftdoc.full_exit_edit_mode(doc); }, "Full exit edit mode"); + ft.profile_function(function() { ftdoc.remove_unused_items(doc); }, "Remove unused items"); ft.profile_function(function() { ftdoc.prepare_all_bitmaps(doc); }, "Prepare all bitmaps"); ft.profile_function(function() { ftdoc.unlock_all_timelines(doc); }, "Unlock all timelines"); ft.profile_function(function() { ftdoc.optimize_all_timelines(doc); }, "Optimize all timelines"); ft.profile_function(function() { ftdoc.rasterize_all_shapes(doc); }, "Rasterize all shapes"); ft.profile_function(function() { ftdoc.export_swf(doc); }, "Export swf"); }; + + ftdoc.get_temp = function (doc) { + if (!ftdoc.hasOwnProperty("temp")) { + ftdoc["temp"] = { + x_scales : {}, + y_scales : {} + } + } + return ftdoc["temp"]; + }; ftdoc.prepare_folders = function (doc) { ft.type_assert(doc, Document); @@ -245,6 +257,17 @@ doc.exitEditMode(); } }; + + ftdoc.remove_unused_items = function (doc) { + ft.type_assert(doc, Document); + var unused_items = doc.library.unusedItems; + ft.array_reverse_foreach(unused_items, function(item) { + if (ft.verbose_mode) { + ft.trace_fmt("Remove unused item: {0}", item.name); + } + doc.library.deleteItem(item.name); + }); + }; ftdoc.unlock_all_timelines = function (doc) { ft.type_assert(doc, Document); @@ -254,6 +277,11 @@ ftdoc.optimize_all_timelines = function (doc) { ft.type_assert(doc, Document); + if (ft.optimize_small_items) { + ft.profile_function(function () { + ftlib.optimize_small_items(doc, doc.library); + }, "Optimize small items"); + } if (ft.optimize_static_items) { ft.profile_function(function () { ftlib.optimize_static_items(doc, doc.library); @@ -350,6 +378,72 @@ fttim.unlock(item.timeline); }); }; + + ftlib.optimize_small_items = function (doc, library) { + ft.type_assert(doc, Document); + ft.type_assert(library, Library); + + var x_scales = ftdoc.get_temp(doc).x_scales; + var y_scales = ftdoc.get_temp(doc).y_scales; + + var walk_by_timeline = function(timeline, func, acc) { + ft.type_assert(timeline, Timeline); + ft.type_assert(func, Function); + ft.array_foreach(timeline.layers, function (layer) { + ft.array_foreach(layer.frames, function (frame) { + ft.array_foreach(frame.elements, function (elem) { + walk_by_timeline( + elem.libraryItem.timeline, + func, + func(elem, acc)); + }, fttim.is_symbol_instance); + }, fttim.is_keyframe); + }); + }; + + var walk_by_library = function(lib, func, acc) { + ft.type_assert(lib, Library); + ft.type_assert(func, Function); + ft.array_foreach(lib.items, function (item) { + walk_by_timeline(item.timeline, func, acc) + }, ftlib.is_symbol_item); + }; + + var x_func = function(elem, acc) { + var elem_sx = elem.scaleX * acc; + var item_name = elem.libraryItem.name; + x_scales[item_name] = Math.max( + x_scales.hasOwnProperty(item_name) ? x_scales[item_name] : elem_sx, + elem_sx); + return elem_sx; + }; + + var y_func = function(elem, acc) { + var elem_sy = elem.scaleY * acc; + var item_name = elem.libraryItem.name; + y_scales[item_name] = Math.max( + y_scales.hasOwnProperty(item_name) ? y_scales[item_name] : elem_sy, + elem_sy); + return elem_sy; + }; + + walk_by_library(library, x_func, 1.0); + walk_by_timeline(doc.getTimeline(), x_func, 1.0); + + walk_by_library(library, y_func, 1.0); + walk_by_timeline(doc.getTimeline(), y_func, 1.0); + + if (ft.verbose_mode) { + for (var item_name in x_scales) { + var max_x_scale = x_scales.hasOwnProperty(item_name) ? x_scales[item_name] : 1.0; + var max_y_scale = y_scales.hasOwnProperty(item_name) ? y_scales[item_name] : 1.0; + var max_c_scale = Math.max(max_x_scale, max_y_scale); + if (max_c_scale < 1.0) { + ft.trace_fmt("Small item for optimize: {0} - {1}", item_name, max_c_scale); + } + } + } + }; ftlib.optimize_static_items = function (doc, library) { ft.type_assert(doc, Document); @@ -423,15 +517,26 @@ new_item_elem.setTransformationPoint({x: 0, y: 0}); new_item_elem.transformX = 0; new_item_elem.transformY = 0; - if (ft.approximately(ft.graphics_scale, 1.0, 0.01)) { + + var x_scales = ftdoc.get_temp(doc).x_scales; + var y_scales = ftdoc.get_temp(doc).y_scales; + + var final_scale = ft.graphics_scale; + if (x_scales.hasOwnProperty(item.name) && y_scales.hasOwnProperty(item.name)) { + var max_scale_x = x_scales[item.name]; + var max_scale_y = y_scales[item.name]; + final_scale = Math.min(final_scale, Math.max(max_scale_x, max_scale_y)); + } + + if (ft.approximately(final_scale, 1.0, 0.01)) { doc.convertSelectionToBitmap(); } else { var wrapper_item_name = ft.gen_unique_name(); var wrapper_item = doc.convertToSymbol("graphic", wrapper_item_name , "center"); - fttim.recursive_scale_filters(doc, wrapper_item.timeline); - doc.scaleSelection(ft.graphics_scale, ft.graphics_scale); + fttim.recursive_scale_filters(doc, wrapper_item.timeline, final_scale); + doc.scaleSelection(final_scale, final_scale); doc.convertSelectionToBitmap(); - doc.scaleSelection(1.0 / ft.graphics_scale, 1.0 / ft.graphics_scale); + doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale); } return true; } else { @@ -444,7 +549,6 @@ ftlib.optimize_single_graphics = function (doc, library) { ft.type_assert(doc, Document); ft.type_assert(library, Library); - ft.array_reverse_foreach(library.items, function (item) { fttim.optimize_single_graphics(doc, item.timeline, item); }, ftlib.is_symbol_item); @@ -556,7 +660,7 @@ return Math.round(frame_width) * Math.round(frame_height); } - fttim.recursive_scale_filters = function (doc, timeline) { + fttim.recursive_scale_filters = function (doc, timeline, scale) { ft.type_assert(doc, Document); ft.type_assert(timeline, Timeline); ft.array_foreach(timeline.layers, function (layer) { @@ -565,12 +669,12 @@ var elem_filters = elem.filters; if (Array.isArray(elem_filters)) { ft.array_foreach(elem_filters, function (elem_filter, filter_index) { - elem_filter.blurX *= ft.graphics_scale; - elem_filter.blurY *= ft.graphics_scale; + elem_filter.blurX *= scale; + elem_filter.blurY *= scale; }); elem.filters = elem_filters; } - fttim.recursive_scale_filters(doc, elem.libraryItem.timeline); + fttim.recursive_scale_filters(doc, elem.libraryItem.timeline, scale); }, fttim.is_symbol_instance); }, fttim.is_keyframe); }, fttim.is_not_guide_layer); @@ -671,15 +775,27 @@ doc.selectNone(); doc.selection = ft.array_filter(frame.elements, fttim.is_shape_instance); if (doc.selection.length > 0) { - if (ft.approximately(ft.graphics_scale, 1.0, 0.01)) { + + var x_scales = ftdoc.get_temp(doc).x_scales; + var y_scales = ftdoc.get_temp(doc).y_scales; + + var item = timeline.libraryItem; + var final_scale = ft.graphics_scale; + if (item && x_scales.hasOwnProperty(item.name) && y_scales.hasOwnProperty(item.name)) { + var max_scale_x = x_scales[item.name]; + var max_scale_y = y_scales[item.name]; + final_scale = Math.min(final_scale, Math.max(max_scale_x, max_scale_y)); + } + + if (ft.approximately(final_scale, 1.0, 0.01)) { doc.convertSelectionToBitmap(); } else { var wrapper_item_name = ft.gen_unique_name(); var wrapper_item = doc.convertToSymbol("graphic", wrapper_item_name , "center"); - fttim.recursive_scale_filters(doc, wrapper_item.timeline); - doc.scaleSelection(ft.graphics_scale, ft.graphics_scale); + fttim.recursive_scale_filters(doc, wrapper_item.timeline, final_scale); + doc.scaleSelection(final_scale, final_scale); doc.convertSelectionToBitmap(); - doc.scaleSelection(1.0 / ft.graphics_scale, 1.0 / ft.graphics_scale); + doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale); } doc.arrange("back"); any_rasterize = true; diff --git a/Assets/FlashTools/Scripts/Editor/FTEditor/Editors/SwfClipAssetEditor.cs b/Assets/FlashTools/Scripts/Editor/FTEditor/Editors/SwfClipAssetEditor.cs index b058814..8a18a9f 100644 --- a/Assets/FlashTools/Scripts/Editor/FTEditor/Editors/SwfClipAssetEditor.cs +++ b/Assets/FlashTools/Scripts/Editor/FTEditor/Editors/SwfClipAssetEditor.cs @@ -157,7 +157,7 @@ namespace FTEditor.Editors { void DrawGUINotes() { EditorGUILayout.Separator(); EditorGUILayout.HelpBox( - "Masks of animation may not be displayed correctly in preview window. " + + "Masks and blends of animation may not be displayed correctly in preview window. " + "Instance animation to the scene, to see how it will look like the animation in the game.", MessageType.Info); }