zshshr closed pull request #1994: [iOS] Add display link task and report vdom, component count to apm b… URL: https://github.com/apache/incubator-weex/pull/1994
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj index d7c4e24a45..ba8efa81a8 100644 --- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj +++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj @@ -90,9 +90,9 @@ 4505D12C219B216D0083A1A2 /* class_window.cc in Sources */ = {isa = PBXBuildFile; fileRef = 98399A8321916A9700D83CCE /* class_window.cc */; }; 4505D12D219B21760083A1A2 /* class_window.h in Headers */ = {isa = PBXBuildFile; fileRef = 98399A8521916A9700D83CCE /* class_window.h */; }; 4505D12E219B22630083A1A2 /* op_code.cc in Sources */ = {isa = PBXBuildFile; fileRef = 98399A8A21916A9800D83CCE /* op_code.cc */; }; - 4532670A213FC84A00DAA620 /* WXDisplayLinkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 45326708213FC84900DAA620 /* WXDisplayLinkManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4532670A213FC84A00DAA620 /* WXDisplayLinkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 45326708213FC84900DAA620 /* WXDisplayLinkManager.h */; }; 4532670B213FC84A00DAA620 /* WXDisplayLinkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 45326709213FC84900DAA620 /* WXDisplayLinkManager.m */; }; - 4532670C213FCF2300DAA620 /* WXDisplayLinkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 45326708213FC84900DAA620 /* WXDisplayLinkManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4532670C213FCF2300DAA620 /* WXDisplayLinkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 45326708213FC84900DAA620 /* WXDisplayLinkManager.h */; }; 4532670D213FCFB400DAA620 /* WXDisplayLinkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 45326709213FC84900DAA620 /* WXDisplayLinkManager.m */; }; 453267142140E38900DAA620 /* vcomponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 453267122140E38900DAA620 /* vcomponent.h */; }; 453267152140E38900DAA620 /* vcomponent.cc in Sources */ = {isa = PBXBuildFile; fileRef = 453267132140E38900DAA620 /* vcomponent.cc */; }; @@ -2750,7 +2750,6 @@ buildActionMask = 2147483647; files = ( 7715EB6221A69DD9001F1108 /* WXRichText.h in Headers */, - 4532670A213FC84A00DAA620 /* WXDisplayLinkManager.h in Headers */, B8D66C1B21255730003960BD /* style.h in Headers */, B8D66C2321255730003960BD /* layout.h in Headers */, B8D66C2521255730003960BD /* flex_enum.h in Headers */, @@ -2811,6 +2810,7 @@ B8D66C3121255730003960BD /* render_action_appendtree_createfinish.h in Headers */, B8F2C6EE2133A83C00635B37 /* class.h in Headers */, B8D66C7F21255730003960BD /* render_scroller_factory.h in Headers */, + 4532670A213FC84A00DAA620 /* WXDisplayLinkManager.h in Headers */, 74A4BA5B1CABBBD000195969 /* WXDebugTool.h in Headers */, 2A837AB41CD9DE9200AEDF03 /* WXLoadingIndicator.h in Headers */, 45E0B4C121CB7B82005D1B3B /* WXConvertUtility.h in Headers */, @@ -3043,7 +3043,6 @@ buildActionMask = 2147483647; files = ( 7715EB6321A69DD9001F1108 /* WXRichText.h in Headers */, - 4532670C213FCF2300DAA620 /* WXDisplayLinkManager.h in Headers */, B8D66C1C21255730003960BD /* style.h in Headers */, B8D66C2421255730003960BD /* layout.h in Headers */, B8D66C2621255730003960BD /* flex_enum.h in Headers */, @@ -3103,6 +3102,7 @@ DCA445AC1EFA574A00D0CFA8 /* WXNetworkProtocol.h in Headers */, DCA445C31EFA57DC00D0CFA8 /* WXAppMonitorProtocol.h in Headers */, B8D66BC42125572F003960BD /* vnode_render_context.h in Headers */, + 4532670C213FCF2300DAA620 /* WXDisplayLinkManager.h in Headers */, DCA445AF1EFA575D00D0CFA8 /* WXModuleProtocol.h in Headers */, 4547FD102153932A00E79971 /* js_common_function.h in Headers */, 45E0B4C221CB7B9C005D1B3B /* WXConvertUtility.h in Headers */, diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h index 2fa258e2d2..63678c21fa 100644 --- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h +++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h @@ -19,7 +19,6 @@ #import <CoreGraphics/CoreGraphics.h> #import <Foundation/Foundation.h> -#import "WXDisplayLinkManager.h" @class WXBridgeMethod; @class WXSDKInstance; @@ -36,7 +35,7 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void)); } #endif -@interface WXComponentManager : NSObject <WXDisplayLinkClient> +@interface WXComponentManager : NSObject @property (nonatomic, readonly, weak) WXSDKInstance *weexInstance; @property (nonatomic, readonly, assign) BOOL isValid; diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm index 6edbae14fb..aef0292343 100644 --- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm +++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm @@ -41,12 +41,37 @@ #import "WXCoreBridge.h" #import "WXComponent_performance.h" #import "WXAnalyzerCenter.h" +#import "WXDisplayLinkManager.h" static NSThread *WXComponentThread; +/* Task scheduled on component thread and triggered every N display link ticks. + If display link is stopped, the tasks are also suspended. */ +@interface WXComponentThreadTickTask : NSObject + +@property (nonatomic, assign) NSUInteger displayTickCount; // Triggered every N display link ticks +@property (nonatomic, copy) dispatch_block_t block; + +@end + +@implementation WXComponentThreadTickTask + ++ (instancetype)taskWithBlock:(dispatch_block_t)block tickCount:(NSUInteger)tickCount +{ + WXComponentThreadTickTask* task = [[WXComponentThreadTickTask alloc] init]; + task.displayTickCount = tickCount; + task.block = block; + return task; +} + +@end + #define WXAssertComponentExist(component) WXAssert(component, @"component not exists") #define MAX_DROP_FRAME_FOR_BATCH 200 +@interface WXComponentManager () <WXDisplayLinkClient> +@end + @implementation WXComponentManager { __weak WXSDKInstance *_weexInstance; @@ -59,6 +84,15 @@ @implementation WXComponentManager NSMapTable<NSString *, WXComponent *> *_indexDict; NSMutableArray<dispatch_block_t> *_uiTaskQueue; NSMutableDictionary *_uiPrerenderTaskQueue; + + NSUInteger _displayTick; + NSMutableArray<WXComponentThreadTickTask*> *_displayTaskQueue; + + // vdom depth and component count statistics + NSUInteger _maxVdomDepth; + NSUInteger _maxVdomDepthReported; + NSUInteger _maxComponentCount; + NSUInteger _maxComponentCountReported; WXComponent *_rootComponent; NSMutableArray *_fixedComponents; @@ -86,6 +120,7 @@ - (instancetype)initWithWeexInstance:(id)weexInstance _indexDict = [NSMapTable strongToWeakObjectsMapTable]; _fixedComponents = [NSMutableArray wx_mutableArrayUsingWeakReferences]; _uiTaskQueue = [NSMutableArray array]; + _displayTaskQueue = [NSMutableArray array]; _isValid = YES; pthread_mutexattr_init(&_propertMutexAttr); pthread_mutexattr_settype(&_propertMutexAttr, PTHREAD_MUTEX_RECURSIVE); @@ -93,6 +128,7 @@ - (instancetype)initWithWeexInstance:(id)weexInstance WXPerformBlockOnComponentThread(^{ // We should ensure that [WXDisplayLinkManager sharedInstance] is only invoked in component thread. + [self _addVdomAndComponentCountTask]; [self _startDisplayLink]; }); } @@ -313,8 +349,11 @@ - (void)addComponent:(NSString*)ref component->_lazyCreateView = YES; } + // update max vdom depth & component count, and will update apm data on next display task. [self recordMaximumVirtualDom:component]; - [component.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_MAX_COMPONENT_NUM curMaxValue:[_indexDict count]]; + if ([_indexDict count] > _maxComponentCount) { + _maxComponentCount = [_indexDict count]; + } if (!component->_isTemplate) { __weak typeof(self) weakSelf = self; @@ -416,12 +455,14 @@ - (void)recordMaximumVirtualDom:(WXComponent*) component maxDeep++; component = component.supercomponent; } - [self.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_MAX_DEEP_DOM curMaxValue:maxDeep]; - if(maxDeep > [self weexInstance].performance.maxVdomDeep) - { + + if (maxDeep > [self weexInstance].performance.maxVdomDeep) { [self weexInstance].performance.maxVdomDeep = maxDeep; } - + + if (maxDeep > _maxVdomDepth) { + _maxVdomDepth = maxDeep; + } } - (void)_checkFixedSubcomponentToRemove:(WXComponent *)component @@ -928,12 +969,32 @@ - (BOOL)isValid return _isValid; } -#pragma mark Layout Batch +#pragma mark Display link task + +- (void)_addVdomAndComponentCountTask +{ + __weak WXComponentManager* wself = self; + [_displayTaskQueue addObject:[WXComponentThreadTickTask taskWithBlock:^{ + __strong WXComponentManager* sself = wself; + if (sself) { + if (sself->_maxComponentCount != sself->_maxComponentCountReported) { + [sself.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_MAX_COMPONENT_NUM curMaxValue:sself->_maxComponentCount]; + sself->_maxComponentCountReported = sself->_maxComponentCount; + } + + if (sself->_maxVdomDepth != sself->_maxVdomDepthReported) { + [sself.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_MAX_DEEP_DOM curMaxValue:sself->_maxVdomDepth]; + sself->_maxVdomDepthReported = sself->_maxVdomDepth; + } + } + } tickCount:30 /* triggered about every 500ms */]]; +} - (void)_startDisplayLink { WXAssertComponentThread(); [[WXDisplayLinkManager sharedInstance] registerDisplayClient:self]; + _displayTick = 0; } - (void)_stopDisplayLink @@ -946,12 +1007,14 @@ - (void)_suspendDisplayLink { WXAssertComponentThread(); _suspend = YES; + [self _executeDisplayTask:YES]; // on suspend, executes every task once } - (void)_awakeDisplayLink { WXAssertComponentThread(); _suspend = NO; + _displayTick = 0; } - (void)_handleDisplayLink @@ -959,6 +1022,23 @@ - (void)_handleDisplayLink WXAssertComponentThread(); [self _layoutAndSyncUI]; + + if (!_suspend) { + // execute tasks in _displayTaskQueue + _displayTick ++; + [self _executeDisplayTask:NO]; + } +} + +- (void)_executeDisplayTask:(BOOL)onSuspend +{ + for (WXComponentThreadTickTask* task in _displayTaskQueue) { + if (onSuspend || (_displayTick % task.displayTickCount == 0)) { + if (task.block) { + task.block(); + } + } + } } - (void)_layoutAndSyncUI diff --git a/ios/sdk/WeexSDK/Sources/WeexSDK.h b/ios/sdk/WeexSDK/Sources/WeexSDK.h index 4389bf43be..e29bdc1bc4 100644 --- a/ios/sdk/WeexSDK/Sources/WeexSDK.h +++ b/ios/sdk/WeexSDK/Sources/WeexSDK.h @@ -60,7 +60,6 @@ #import "WXExceptionUtils.h" #import "WXEventModuleProtocol.h" #import "WXErrorView.h" -#import "WXDisplayLinkManager.h" #import "WXDefine.h" #import "WXDebugTool.h" #import "WXConvert.h" ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services