立即模式(Immediate mode)界面

为了给我的新项目做UI库的选型,我调研了一些资料,最终陷入QT和imgui的纠结中。我决定点时间来整理一下思路。

好吧,来看看各种人是如何说的。

从reddit上的一篇帖子开始

QT和imgui各有褒贬,但是无疑对于游戏UI,大家对imgui还是很赞同的。对于桌面开发,大家就不一定了,一方面如果以往对QT有较深的积累,QtQuick也是directUI的较好选项。

近年来,网页前端和桌面开发有融合的趋势了,主要原因是互联网从业人员的巨大,javascript受众多。特别是V8引擎的横空出世,硬件逐步发展,使得js已入了开发者的法眼。由于js天然的异步特性,恰好与传统桌面应用相符,出现了Electron,HEX这样的桌面开发框架。

但是dear imgui,亲爱的,从另一个完全不同的角度带来了新的界面开发模式,立即模式(Immediate mode)。与传统模式需要管理一套界面数据结构不同,在立即模式下,界面对于开发者反而是透明的了。

以输入一串字符串为例(伪代码),

  • 传统MVC模式需要同时管理所需的数据以及界面本身两套结构,虽然QT、MFC等框架实现了一系列自动化的方法,替代了我们的部分工作,但是呢,我想说和立即模式对比一下。:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //界面结构声明
    Edit a;

    //另一处数据生命
    string str_a;

    //根据事件设置回调函数
    a.set_call_back(msg_end_edit,a.on_edit);

    //回调函数中传回数据
    on_edit()
    {
    str_a = a;
    }
  • 立即模式,嗯,这就齐活了

1
2
string str_a;
inputtext(a);

立即模式主要的问题是需要持续更新界面,并从中立即获得反馈,相比之下较传统方式耗一些CPU,但是经过优化后这方面的劣势并不突出。由于这一特性,imgui特别适合用于游戏界面的开发,因为游戏的三维画面是需要实时渲染的。

更进一步看一下使用QT的传统桌面应用开发者的看法

这篇帖子从传统桌面应用开发者的角度将两者的优劣进行了一定的分析。

  • 重新开始的痛苦:界面元素的管理、元素拷贝、UNICODE支持等等都需要重新开始写代码。
  • 重新开始真的很痛苦:字体渲染、载入icon、高DPI支持。还不知道怎么做啊。
  • 。。。

很具有代表性的一段,很多事情都是类似的,就像马的肩宽决定了现在铁轨主流宽度,作为IT工业一环的界面开发,也不得不背负太多历史的负担。程序员们互相支撑的过程确实很难一人说拥抱新东西大家就都有时间有精力来干这件事的。

好吧,既然闲着也是闲着,我决定还是趁着能折腾多经历一些,整一下imgui吧,毕竟UNITY也用的这个。