mirror of
https://github.com/godotengine/godot.git
synced 2024-11-24 21:22:48 +00:00
Use afterMinimumDuration to correct frame pacing
This commit is contained in:
parent
0f5f3bc954
commit
376c6c0c7d
@ -107,6 +107,7 @@ public:
|
|||||||
uint32_t height = 0;
|
uint32_t height = 0;
|
||||||
DisplayServer::VSyncMode vsync_mode = DisplayServer::VSYNC_ENABLED;
|
DisplayServer::VSyncMode vsync_mode = DisplayServer::VSYNC_ENABLED;
|
||||||
bool needs_resize = false;
|
bool needs_resize = false;
|
||||||
|
double present_minimum_duration = 0.0;
|
||||||
|
|
||||||
Surface(
|
Surface(
|
||||||
#ifdef __OBJC__
|
#ifdef __OBJC__
|
||||||
@ -123,6 +124,7 @@ public:
|
|||||||
virtual Error resize(uint32_t p_desired_framebuffer_count) = 0;
|
virtual Error resize(uint32_t p_desired_framebuffer_count) = 0;
|
||||||
virtual RDD::FramebufferID acquire_next_frame_buffer() = 0;
|
virtual RDD::FramebufferID acquire_next_frame_buffer() = 0;
|
||||||
virtual void present(MDCommandBuffer *p_cmd_buffer) = 0;
|
virtual void present(MDCommandBuffer *p_cmd_buffer) = 0;
|
||||||
|
void set_max_fps(int p_max_fps) { present_minimum_duration = p_max_fps ? 1.0 / p_max_fps : 0.0; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __OBJC__
|
#ifdef __OBJC__
|
||||||
|
@ -172,7 +172,7 @@ public:
|
|||||||
count--;
|
count--;
|
||||||
front = (front + 1) % frame_buffers.size();
|
front = (front + 1) % frame_buffers.size();
|
||||||
|
|
||||||
[p_cmd_buffer->get_command_buffer() presentDrawable:drawable];
|
[p_cmd_buffer->get_command_buffer() presentDrawable:drawable afterMinimumDuration:present_minimum_duration];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -220,6 +220,7 @@ public:
|
|||||||
virtual FramebufferID swap_chain_acquire_framebuffer(CommandQueueID p_cmd_queue, SwapChainID p_swap_chain, bool &r_resize_required) override final;
|
virtual FramebufferID swap_chain_acquire_framebuffer(CommandQueueID p_cmd_queue, SwapChainID p_swap_chain, bool &r_resize_required) override final;
|
||||||
virtual RenderPassID swap_chain_get_render_pass(SwapChainID p_swap_chain) override final;
|
virtual RenderPassID swap_chain_get_render_pass(SwapChainID p_swap_chain) override final;
|
||||||
virtual DataFormat swap_chain_get_format(SwapChainID p_swap_chain) override final;
|
virtual DataFormat swap_chain_get_format(SwapChainID p_swap_chain) override final;
|
||||||
|
virtual void swap_chain_set_max_fps(SwapChainID p_swap_chain, int p_max_fps) override final;
|
||||||
virtual void swap_chain_free(SwapChainID p_swap_chain) override final;
|
virtual void swap_chain_free(SwapChainID p_swap_chain) override final;
|
||||||
|
|
||||||
#pragma mark - Frame Buffer
|
#pragma mark - Frame Buffer
|
||||||
|
@ -982,6 +982,12 @@ RDD::DataFormat RenderingDeviceDriverMetal::swap_chain_get_format(SwapChainID p_
|
|||||||
return swap_chain->data_format;
|
return swap_chain->data_format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderingDeviceDriverMetal::swap_chain_set_max_fps(SwapChainID p_swap_chain, int p_max_fps) {
|
||||||
|
SwapChain *swap_chain = (SwapChain *)(p_swap_chain.id);
|
||||||
|
RenderingContextDriverMetal::Surface *metal_surface = (RenderingContextDriverMetal::Surface *)(swap_chain->surface);
|
||||||
|
metal_surface->set_max_fps(p_max_fps);
|
||||||
|
}
|
||||||
|
|
||||||
void RenderingDeviceDriverMetal::swap_chain_free(SwapChainID p_swap_chain) {
|
void RenderingDeviceDriverMetal::swap_chain_free(SwapChainID p_swap_chain) {
|
||||||
SwapChain *swap_chain = (SwapChain *)(p_swap_chain.id);
|
SwapChain *swap_chain = (SwapChain *)(p_swap_chain.id);
|
||||||
_swap_chain_release(swap_chain);
|
_swap_chain_release(swap_chain);
|
||||||
|
Loading…
Reference in New Issue
Block a user