From 99fcfb6a72432564a2c11ec14f97285b7e83ab96 Mon Sep 17 00:00:00 2001 From: Haowen Wu Date: Tue, 20 Oct 2020 17:55:56 +0800 Subject: [PATCH] Enable user define glFPS observer class --- .../FPSTrace/Core/MTHFPSTrace.h | 4 + .../FPSTrace/Core/MTHFPSTrace.m | 77 +++++-------------- 2 files changed, 24 insertions(+), 57 deletions(-) diff --git a/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.h b/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.h index 6f9a8e1..0877018 100644 --- a/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.h +++ b/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.h @@ -57,11 +57,15 @@ typedef struct { * caculate gl-fps count when renderProcessSEL call */ + (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo; ++ (void)registerGLESClass:(Class)rendererClass; - (void)addDelegate:(id)delegate; - (void)removeDelegate:(id)delegate; - (void)start; - (void)stop; + +- (void)glesRenderer:(id)renderer start:(BOOL)start; +- (void)glesRenderProcess:(id)renderer; @end @protocol MTHFPSTraceDelegate diff --git a/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.m b/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.m index 7ab9ac7..f9a351e 100644 --- a/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.m +++ b/MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.m @@ -27,7 +27,7 @@ @interface MTHFPSTrace () @property (nonatomic, assign) NSTimeInterval fpsTickLastTime; @property (nonatomic, assign) BOOL gpuImageViewFPSEnable; @property (nonatomic, strong) NSHashTable> *delegates; -@property (nonatomic, strong) NSArray *renderInfos; +@property (nonatomic, strong) NSMutableArray *renderInfos; @end @implementation MTHFPSTrace @@ -46,6 +46,15 @@ + (instancetype)shared { } #pragma mark - + ++ (void)registerGLESClass:(Class)rendererClass { + [self registerGLESRenderInfo:(MTHFPSGLRenderInfo){ + rendererClass, + NSSelectorFromString(@"createDisplayFramebuffer"), + NSSelectorFromString(@"destroyDisplayFramebuffer"), + NSSelectorFromString(@"presentFramebuffer")}]; +} + + (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo { if (!renderInfo.rendererClass || !renderInfo.startRenderSEL || !renderInfo.endRenderSEL || !renderInfo.renderProcessSEL) { return; @@ -57,9 +66,9 @@ + (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo { NSValue *value = [NSValue value:&renderInfo withObjCType:@encode(MTHFPSGLRenderInfo)]; if (![MTHFPSTrace shared].renderInfos) { - [MTHFPSTrace shared].renderInfos = [NSArray array]; + [MTHFPSTrace shared].renderInfos = [NSMutableArray array]; } - [[[MTHFPSTrace shared] mutableArrayValueForKey:@"renderInfos"] addObject:value]; + [[MTHFPSTrace shared].renderInfos addObject:value]; } - (void)addDelegate:(id)delegate { @@ -86,31 +95,18 @@ - (void)start { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - [MTHFPSTrace registerGLESRenderInfo:(MTHFPSGLRenderInfo){ - NSClassFromString(@"GPUImageView"), - NSSelectorFromString(@"createDisplayFramebuffer"), - NSSelectorFromString(@"destroyDisplayFramebuffer"), - NSSelectorFromString(@"presentFramebuffer")}]; - - [MTHFPSTrace registerGLESRenderInfo:(MTHFPSGLRenderInfo){ - NSClassFromString(@"MTCameraGPUImageView"), - NSSelectorFromString(@"createDisplayFramebuffer"), - NSSelectorFromString(@"destroyDisplayFramebuffer"), - NSSelectorFromString(@"presentFramebuffer")}]; + [MTHFPSTrace registerGLESClass:NSClassFromString(@"GPUImageView")]; + [MTHFPSTrace registerGLESClass:NSClassFromString(@"MTCameraGPUImageView")]; for (NSValue *value in self.renderInfos) { MTHFPSGLRenderInfo renderInfo; [value getValue:&renderInfo]; - - if ([NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"GPUImageView"] || - [NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"MTCameraGPUImageView"]) { - self.gpuImageViewFPSEnable = YES; - } + self.gpuImageViewFPSEnable = YES; SEL swizzledSel = [MTHawkeyeHooking swizzledSelectorForSelector:renderInfo.startRenderSEL]; void (^swizzleStartBlock)(id) = ^void(id obj) { - ((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel); [self glesRenderer:obj start:YES]; + ((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel); }; [MTHawkeyeHooking replaceImplementationOfKnownSelector:renderInfo.startRenderSEL onClass:renderInfo.rendererClass @@ -119,8 +115,8 @@ - (void)start { SEL swizzledSel1 = [MTHawkeyeHooking swizzledSelectorForSelector:renderInfo.endRenderSEL]; void (^swizzleEndBlock)(id) = ^void(id obj) { - ((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel1); [self glesRenderer:obj start:NO]; + ((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel1); }; [MTHawkeyeHooking replaceImplementationOfKnownSelector:renderInfo.endRenderSEL onClass:renderInfo.rendererClass @@ -184,28 +180,9 @@ - (void)glesRenderer:(id)renderer start:(BOOL)start { return; } - NSValue *surpportedRenderer = nil; - MTHFPSGLRenderCounter *counter = nil; - for (NSValue *obj in self.renderInfos) { - MTHFPSGLRenderInfo renderInfo; - [obj getValue:&renderInfo]; - if ([renderer isKindOfClass:renderInfo.rendererClass]) { - counter = [self getDynamicAttachGLESCounter:renderer]; - counter.isActive = start; - surpportedRenderer = obj; - if ([NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"GPUImageView"] || - [NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"MTCameraGPUImageView"]) { - counter.isGPUImageView = YES; - } else { - counter.isGPUImageView = NO; - } - break; - } - } - - if (!surpportedRenderer) { - return; - } + MTHFPSGLRenderCounter *counter = [self getDynamicAttachGLESCounter:renderer]; + counter.isActive = start; + counter.isGPUImageView = YES; for (id delegate in self.delegates) { if (delegate && [delegate respondsToSelector:@selector(glRenderCounterValueChange:)]) { @@ -223,20 +200,6 @@ - (void)glesRenderProcess:(id)renderer { return; } - NSValue *surpportedRenderer = nil; - for (NSValue *obj in self.renderInfos) { - MTHFPSGLRenderInfo renderInfo; - [obj getValue:&renderInfo]; - if ([renderer isKindOfClass:renderInfo.rendererClass]) { - surpportedRenderer = obj; - break; - } - } - - if (!surpportedRenderer) { - return; - } - MTHFPSGLRenderCounter *counter = [self getDynamicAttachGLESCounter:renderer]; if (!counter.isActive) { return;