Revert "fix: temporary fix for fps drop issue when starting stream with graph disabled"

This reverts commit d72930877a.
This commit is contained in:
Acaki committed 2025-08-08 01:51:09 +08:00
1 parent 69026cbcd6
commit 1442495c9e
2 files changed
+36 -61

No files matched your search

-1
View File
@@ -20,7 +20,6 @@ typedef void (^MetricsHandler)(int plotId, CFTimeInterval value);
@property (nonatomic) FloatBuffer * _Nonnull frametimes; @property (nonatomic) FloatBuffer * _Nonnull frametimes;
@property (nonatomic) BOOL enableGraphs; @property (nonatomic) BOOL enableGraphs;
@property (nonatomic) float graphOpacity; @property (nonatomic) float graphOpacity;
@property (nonatomic) int streamFps;
@property (nonatomic) BOOL imguiRunning; @property (nonatomic) BOOL imguiRunning;
@property (nonatomic) MetricsHandler _Nonnull metricsHandler; @property (nonatomic) MetricsHandler _Nonnull metricsHandler;
+36 -60
View File
@@ -30,7 +30,6 @@
_enableGraphs = enableGraphs; _enableGraphs = enableGraphs;
_graphOpacity = (float)(graphOpacity / 100.0); _graphOpacity = (float)(graphOpacity / 100.0);
_bounds = bounds; _bounds = bounds;
_streamFps = streamFps;
_device = MTLCreateSystemDefaultDevice(); _device = MTLCreateSystemDefaultDevice();
_commandQueue = [_device newCommandQueue]; _commandQueue = [_device newCommandQueue];
@@ -84,45 +83,33 @@
self.mtkView.device = self.device; self.mtkView.device = self.device;
self.mtkView.delegate = self; self.mtkView.delegate = self;
self.mtkView.preferredFramesPerSecond = _streamFps; // Match the stream frame rate for proper display sync self.mtkView.preferredFramesPerSecond = 60; // ImGui overlay will always render at this rate
self.mtkView.opaque = NO; self.mtkView.opaque = NO;
self.mtkView.enableSetNeedsDisplay = NO; self.mtkView.enableSetNeedsDisplay = NO;
if (_enableGraphs) { if (_enableGraphs) {
[self ImGui_Init]; [self ImGui_Init];
self.mtkView.paused = NO; self.mtkView.paused = NO;
self.mtkView.hidden = NO;
} }
else { else {
// Keep Metal view running for display sync but don't initialize ImGui self.mtkView.paused = YES;
self.mtkView.paused = NO;
self.mtkView.hidden = YES; // Hide but keep running for display sync
} }
} }
// start & stop are used to show/hide graphs when swiping stats in or out // start & stop are used to show/hide graphs when swiping stats in or out
-(void)start { -(void)start {
[self ImGui_Init];
if (_enableGraphs) { if (_enableGraphs) {
[self ImGui_Init]; self.mtkView.paused = NO;
self.mtkView.hidden = NO;
} else {
// Keep running for display sync but stay hidden
self.mtkView.hidden = YES;
} }
self.mtkView.paused = NO;
} }
-(void)show { -(void)show {
if (_enableGraphs) { [self.mtkView setHidden:NO];
[self.mtkView setHidden:NO];
}
} }
-(void)hide { -(void)hide {
if (_enableGraphs) { [self.mtkView setHidden:YES];
[self.mtkView setHidden:YES];
}
// When graphs are disabled, ImGui stays hidden but keeps running for display sync
} }
-(void)stop { -(void)stop {
@@ -133,6 +120,14 @@
// Only called when mtkView.paused is false // Only called when mtkView.paused is false
- (void)drawInMTKView:(MTKView *)view - (void)drawInMTKView:(MTKView *)view
{ {
#if !defined(IMGUI_DISABLE)
ImGuiIO &io = ImGui::GetIO();
io.DisplaySize.x = view.bounds.size.width;
io.DisplaySize.y = view.bounds.size.height;
CGFloat framebufferScale = view.window.screen.scale ?: UIScreen.mainScreen.scale;
io.DisplayFramebufferScale = ImVec2(framebufferScale, framebufferScale);
id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer]; id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];
MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor; MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor;
@@ -141,59 +136,40 @@
return; return;
} }
if (_enableGraphs) { // Start the Dear ImGui frame
#if !defined(IMGUI_DISABLE) ImGui_ImplMetal_NewFrame(renderPassDescriptor);
ImGuiIO &io = ImGui::GetIO(); ImGui::NewFrame();
io.DisplaySize.x = view.bounds.size.width;
io.DisplaySize.y = view.bounds.size.height;
CGFloat framebufferScale = view.window.screen.scale ?: UIScreen.mainScreen.scale; // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
io.DisplayFramebufferScale = ImVec2(framebufferScale, framebufferScale); static bool show_demo_window = false;
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// Start the Dear ImGui frame // Custom Moonlight stuff goes here
ImGui_ImplMetal_NewFrame(renderPassDescriptor); [self drawStatsGraphs];
ImGui::NewFrame();
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). // Rendering
static bool show_demo_window = false; ImGui::Render();
if (show_demo_window) ImDrawData* draw_data = ImGui::GetDrawData();
ImGui::ShowDemoWindow(&show_demo_window);
// Custom Moonlight stuff goes here // This looks silly when clear_color is all zeros but the original example uses this method to tint or make transparent the rest of the viewport
[self drawStatsGraphs]; static ImVec4 clear_color = ImVec4(0, 0, 0, 0);
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
// Rendering id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
ImGui::Render(); [renderEncoder pushDebugGroup:@"Dear ImGui rendering"];
ImDrawData* draw_data = ImGui::GetDrawData(); ImGui_ImplMetal_RenderDrawData(draw_data, commandBuffer, renderEncoder);
[renderEncoder popDebugGroup];
[renderEncoder endEncoding];
// This looks silly when clear_color is all zeros but the original example uses this method to tint or make transparent the rest of the viewport // Present
static ImVec4 clear_color = ImVec4(0, 0, 0, 0);
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
[renderEncoder pushDebugGroup:@"Dear ImGui rendering"];
ImGui_ImplMetal_RenderDrawData(draw_data, commandBuffer, renderEncoder);
[renderEncoder popDebugGroup];
[renderEncoder endEncoding];
#endif
} else {
// When graphs are disabled, just render a transparent frame for display sync
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.0, 0.0, 0.0, 0.0);
id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
[renderEncoder pushDebugGroup:@"Display sync frame"];
// Don't render anything, just clear
[renderEncoder popDebugGroup];
[renderEncoder endEncoding];
}
// Present (always with timing for display sync)
#if TARGET_OS_SIMULATOR #if TARGET_OS_SIMULATOR
[commandBuffer presentDrawable:view.currentDrawable]; [commandBuffer presentDrawable:view.currentDrawable];
#else #else
[commandBuffer presentDrawable:view.currentDrawable afterMinimumDuration:1.0 / view.preferredFramesPerSecond]; [commandBuffer presentDrawable:view.currentDrawable afterMinimumDuration:1.0 / view.preferredFramesPerSecond];
#endif #endif
[commandBuffer commit]; [commandBuffer commit];
#endif
} }
- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size - (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size