Skip to content

Commit

Permalink
Enable user define glFPS observer class
Browse files Browse the repository at this point in the history
  • Loading branch information
haowenwu committed Oct 20, 2020
1 parent 00d6dce commit 99fcfb6
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 57 deletions.
4 changes: 4 additions & 0 deletions MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,15 @@ typedef struct {
* caculate gl-fps count when renderProcessSEL call
*/
+ (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo;
+ (void)registerGLESClass:(Class)rendererClass;

- (void)addDelegate:(id<MTHFPSTraceDelegate>)delegate;
- (void)removeDelegate:(id<MTHFPSTraceDelegate>)delegate;
- (void)start;
- (void)stop;

- (void)glesRenderer:(id)renderer start:(BOOL)start;
- (void)glesRenderProcess:(id)renderer;
@end

@protocol MTHFPSTraceDelegate <NSObject>
Expand Down
77 changes: 20 additions & 57 deletions MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ @interface MTHFPSTrace ()
@property (nonatomic, assign) NSTimeInterval fpsTickLastTime;
@property (nonatomic, assign) BOOL gpuImageViewFPSEnable;
@property (nonatomic, strong) NSHashTable<id<MTHFPSTraceDelegate>> *delegates;
@property (nonatomic, strong) NSArray<NSValue *> *renderInfos;
@property (nonatomic, strong) NSMutableArray<NSValue *> *renderInfos;
@end

@implementation MTHFPSTrace
Expand All @@ -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;
Expand All @@ -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<MTHFPSTraceDelegate>)delegate {
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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<MTHFPSTraceDelegate> delegate in self.delegates) {
if (delegate && [delegate respondsToSelector:@selector(glRenderCounterValueChange:)]) {
Expand All @@ -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;
Expand Down

0 comments on commit 99fcfb6

Please sign in to comment.