周口市网站建设_网站建设公司_VS Code_seo优化
2025/12/31 14:29:45 网站建设 项目流程

背景

内容

使用上的区别

ImGui是每一帧告诉GPU现在UI的样子。
Retained GUI是构造一次GUI,然后有需要的时候修改它。

Mental model shortcut
ImGui: “Every frame, tell the UI what it looks like right now.”
Retained GUI: “Build a UI once, then modify it over time.”

技术实现的区别

ImGui的drawCall没有合批, Retained GUI 会尽量合批。

ImGui

Unity中我们无法绕过的ImGui接口是GUIStyle.Draw,基本上所有EditorGUI的接口都依赖这个函数。
这个函数对应到C++代码,就是GUIStyle.cppGUIStyle::Draw函数。里面会分别调用DrawBackgroundDrawContent,这两个接口最终会调用GUITexture.CPP文件内的DrawGUITexture函数。

DrawGUITexture函数中的FillGUITextureVBOChunkInverted会将上层的参数转化为GPU所需的VBO相关数据(顶点数据),最后通过GfxDevice发起DrawCall。

可以说 Unity的ImGui是对底层渲染接口的简单封装,一次GUIStyle.Draw函数对应了一个SetPass和一个Draw

Retained GUI

C#
Camera.Render->
CPP
Camera::StandaloneRender->Camera::Render->Camera::DoRender->

或者是

WinMain.cpp里面的PlayerMainWndProc->RenderManager::RenderCameras->Camera::Render->

Camera::DoRender-> DoRenderLoop ->ForwardShaderRenderLoop.cpp里面的DoForwardShaderRenderLoop(或者DoForwardVertexRenderLoop)
->ForwardShaderRenderLoop::PerformRendering->BatchRenderer::Add->BatchRenderer::Flush
MeshRenderer::RenderMultiple会调用MeshRenderer.cpp里的RenderDynamicBatch
RenderDynamicBatch 会分别调用GfxDevice.BeginDynamicBatching GfxDevice.DynamicBatchMesh GfxDevice.EndDynamicBatching

RenderManagerInvokeOnRenderObjectCallbacks 会调用 MonoBehavior.OnRenderObject

综合对比

Aspect ImGui Retained GUI
GPU calls per frame Yes Yes
Rebuild vertex data Every frame Only when dirty
GPU buffer reuse Rare Common
Draw call batching Limited Strong
CPU cost Higher Lower (steady UI)

参考

https://chatgpt.com/

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询