diff --git a/Source/ASDisplayNode.mm b/Source/ASDisplayNode.mm index 75604bc995..9047d7311f 100644 --- a/Source/ASDisplayNode.mm +++ b/Source/ASDisplayNode.mm @@ -3377,7 +3377,8 @@ ASDISPLAYNODE_INLINE BOOL subtreeIsRasterized(ASDisplayNode *node) { // - If it doesn't have a calculated or pending layout that fits its current bounds, a measurement pass will occur // (see -__layout and -_u_measureNodeWithBoundsIfNecessary:). This scenario is uncommon, // and running a measurement pass here is a fine trade-off because preloading any time after this point would be late. - if (self.automaticallyManagesSubnodes) { + + if (self.automaticallyManagesSubnodes && !ASActivateExperimentalFeature(ASExperimentalDidEnterPreloadSkipASMLayout)) { [self layoutIfNeeded]; } [self enumerateInterfaceStateDelegates:^(id del) { diff --git a/Source/ASExperimentalFeatures.h b/Source/ASExperimentalFeatures.h index 626975636c..b51523e1d8 100644 --- a/Source/ASExperimentalFeatures.h +++ b/Source/ASExperimentalFeatures.h @@ -24,6 +24,7 @@ typedef NS_OPTIONS(NSUInteger, ASExperimentalFeatures) { ASExperimentalCollectionTeardown = 1 << 6, // exp_collection_teardown ASExperimentalFramesetterCache = 1 << 7, // exp_framesetter_cache ASExperimentalClearDataDuringDeallocation = 1 << 8, // exp_clear_data_during_deallocation + ASExperimentalDidEnterPreloadSkipASMLayout = 1 << 9, // exp_did_enter_preload_skip_asm_layout ASExperimentalFeatureAll = 0xFFFFFFFF }; diff --git a/Source/ASExperimentalFeatures.mm b/Source/ASExperimentalFeatures.mm index eaa24387fb..68a6871f04 100644 --- a/Source/ASExperimentalFeatures.mm +++ b/Source/ASExperimentalFeatures.mm @@ -20,7 +20,8 @@ NSArray *ASExperimentalFeaturesGetNames(ASExperimentalFeatures flags @"exp_network_image_queue", @"exp_collection_teardown", @"exp_framesetter_cache", - @"exp_clear_data_during_deallocation"])); + @"exp_clear_data_during_deallocation", + @"exp_did_enter_preload_skip_asm_layout"])); if (flags == ASExperimentalFeatureAll) { return allNames; diff --git a/Tests/ASConfigurationTests.mm b/Tests/ASConfigurationTests.mm index d2f2b5a6cd..a563b92049 100644 --- a/Tests/ASConfigurationTests.mm +++ b/Tests/ASConfigurationTests.mm @@ -13,15 +13,16 @@ #import "ASConfigurationInternal.h" static ASExperimentalFeatures features[] = { - ASExperimentalGraphicsContexts, - ASExperimentalTextNode, - ASExperimentalInterfaceStateCoalescing, - ASExperimentalUnfairLock, - ASExperimentalLayerDefaults, - ASExperimentalNetworkImageQueue, - ASExperimentalCollectionTeardown, - ASExperimentalFramesetterCache, - ASExperimentalClearDataDuringDeallocation + ASExperimentalGraphicsContexts, + ASExperimentalTextNode, + ASExperimentalInterfaceStateCoalescing, + ASExperimentalUnfairLock, + ASExperimentalLayerDefaults, + ASExperimentalNetworkImageQueue, + ASExperimentalCollectionTeardown, + ASExperimentalFramesetterCache, + ASExperimentalClearDataDuringDeallocation, + ASExperimentalDidEnterPreloadSkipASMLayout }; @interface ASConfigurationTests : ASTestCase @@ -34,16 +35,17 @@ static ASExperimentalFeatures features[] = { + (NSArray *)names { return @[ - @"exp_graphics_contexts", - @"exp_text_node", - @"exp_interface_state_coalesce", - @"exp_unfair_lock", - @"exp_infer_layer_defaults", - @"exp_network_image_queue", - @"exp_collection_teardown", - @"exp_framesetter_cache", - @"exp_clear_data_during_deallocation" - ]; + @"exp_graphics_contexts", + @"exp_text_node", + @"exp_interface_state_coalesce", + @"exp_unfair_lock", + @"exp_infer_layer_defaults", + @"exp_network_image_queue", + @"exp_collection_teardown", + @"exp_framesetter_cache", + @"exp_clear_data_during_deallocation", + @"exp_did_enter_preload_skip_asm_layout", + ]; } - (ASExperimentalFeatures)allFeatures {