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

Reply via email to