Nim言語: GUIライブラリNimgl/ImGuiを発見した時のメモ 2023/02,2023/07
Nim言語用のGUIライブラリ(バインディング)はいろいろあるが、
NimglというGUIライブラリを見つけたのでメモする
Nimglライブラリ
NimglはDear ImGui(以下ImGuiと表記)というC++で書かれたマルチプラットフォーム(Windows,Linux,Mac,etc)GUIライブラリを
CImGuiライブラリ経由でNim言語から利用するラッパーライブラリとなっている
- CImGuiライブラリ
CImGuiライブラリはImGuiライブラリをC++以外の言語から使えるようにするための
C言語インターフェースライブラリとなっている
このライブラリのおかげで多数の言語からImGuiが使えるのだった
有名どころの言語なら使えるかも。。。 Bindings
ImGuiライブラリ
動作デモ
以下はImGuiライブラリでどういうGUI要素(Widget)が表示され/使えるかのデモ画面です
ライブ・デモはこれ(v1.88) スゴ
ImPlot: Imguiのアドインライブラリ ライブ・デモ これもスゴ
参考: (egui ライブ・デモ ImGuiにインスパイアされたRust版GUI)
以下はImGuiのスタンドアロンアプリ(*.exeとか)を作るときの話、

以下はギャラリー
Gallery: Post your screenshots PART16
参考リンク
ベースとなるImGuiについてのメモ
-
元(今でも?)はゲームエンジン等々のプロパティや属性を設定してデバッグ、調整するための
(簡易な?)GUIライブラリだった?模様(詳細不明)。 UE4で使用されている様だ(詳細不明)
-
GUIライブラリとしては超軽量(Gtk,Qt 比)
Windows10上のスタティックリンクだと以下になる(注2)
コンパイラ |
最小EXEサイズ: Windows10上 |
MS Visual Studio C++ |
800K程度 + 100KB程度(VCRUNTIME140.dll) |
GCC |
1.3Mバイトから1.7Mバイト程度 (外部依存DLL無し)(-d:lto指定なし) |
GUI部品ライブラリ(or Widget集? or フレームワーク?)としては軽量であることを考慮すれば悪くないかも
-
GtkやQtに比べればEXE(dll)のサイズは極小である。(注1)
-
ただし、Gtk,Qt,Visual Studio + { C#,VB,WPF }, Delphi/C++Builder/Lazarus等々と比べると
GUI部品機能としては少し物足りない部分があるかも、 例えば
- ツールバー、ツールボタン、
スピンボタン等々に相当する物がない風
- カラー・イメージ・アイコン等々がメニューを含め全体的に使用できない風
- レイアウト機能が貧弱または限定的、固定的風 (個人の感想です 😃
-
ボタンや部品を画面に貼り付けてGUIを作る様なことはできない
全てコードベタ書きで作ります
これらでできる様です
-
ファイルオープンダイアログ系が標準ではできない
別途 プラグインで対応可能
軽くしたいならOS固有のAPIを使えばOKではある (Win32APIとか)
ImGuiの日本語対応 (2023/03 修正と追記)(2023/07 さらに修正)
日本語入力についてのメモ
- Nimgl(ImGui v1.84.2)については
単語変換候補の表示位置がズレる問題と
入力中の文字列が見えない点が大きい(そこを我慢すれば入力自体は可能)
Nimglにこだわるなら最新版の変更をNimglに自前でバックポートするのも手かも
どうもこちらの間違いだった様で日本語入力・表示とも正常にできることを確認しました(2023/07)
最新版のImGUi v1.89.3 では日本語入力はSDL2系を除いて問題なく可能となった
v1.84.2の時点で既に日本語入力可能でした(SDL2系を除く)
詳細は 次のブログに記述 Nim言語: ImGui と日本語入力のメモ 2023/03
描画のバックエンド
実際に描画する時のUIと描画ドライバ(バックエンド)を多数から選択できる
各種言語バインディングについてのメモ
過去の体験からするとC/C++以外だとGUIやグラフィカル・ライブラリの言語バインディングで
うまく動作する例があまりない印象だった。
ある言語の特定バージョン縛りだったり、
裏でgccやMSVCが必要だったりで挫折したり等々
最近のPythonなんかは例外的にうまくいっている気はする
と思ったら
2023/02時点で Python3.11でImGuiを使うのは無理で Python3.10ならOKだって
orz orz
Nim言語でNimglをコンパイル
Nimgl: Nim言語: 珍しく すんなりコンパイル実行できた (^^;
目標
上述のデモアプリ相当のものをNim言語でコンパイル・実行する
必要条件
- Windows上
- Nim言語 Nim-1.6.10 (2023/02 時点)で
Hello World
程度がコンパイル実行できていること
(Nim言語のHello Worldは echo "hello world"
の 18文字で動作する)
- Gitがインストールされコマンドラインで動作すること
- Linuxツールズを少々 rm,makeコマンドとかetc
コンパイルと実行
適当な作業フォルダで
$ git clone https://github.com/dinau/nimgl_test
$ cd nimgl_test
$ nimble build
実行は、
$ nimble jpfont
Linux系 Debian 11 Bullseye でコンパイルするための準備
Debianは以下の事前インストールで上記Nimglデモがコンパイル実行できました。
恐らくUbuntuでも同じかも(未確認)
$ sudo apt install xorg-dev libopengl-dev ibgl1-mesa-glx libgl1-mesa-dev
コンパイルエラーやリンクエラーが出た場合はその内容から予測して
適宜ライブラリを追加してみて下さい (^^;
Nimgl 日本語表示 デモexe
コンパイル済みデモEXEファイル nimgl-test-jp-font-imgui-v1.84.2-ime-ok-2023-07.exe.7z (ソース)
-
Nimglに付属のImGuiはv1.84.2とちょっと古い(約1年前)もののひとまずOKとする
ImGuiは現在の最新版v1.89.8 (2023/08)に差し替えました
-
ファイルオープンダイアログはNim用の簡易なものを採用した nim-osdialog
ソース行
-
日本語フォントは4種類登録したのでWindows10なら表示可能
ソース行
("meiryob.ttc","メイリオ B",14.0)
,("YuGothM.ttc","遊ゴシック M",11.0)
,("meiryo.ttc","メイリオ",14.0)
,("msgothic.ttc","MS ゴシック",11.0)
フォント名の「游ゴシック」を「遊ゴシック」に変更しているが
io.fonts.getGlyphRangesJapanese()
部分の範囲変更で対応可能と思われる
DLLを使ってフルコンパイル時間を短縮する
(追記 2023/04) コンパイル時間短縮の件は「ccache」(のマスカレード機能)導入で
お気楽極楽全面解決したのでどうでもよくなってしまったのが現状(追記終わり)
以下 MinGW/gccを使う場合(注3)の話
スタティックリンクだとGLFW3とImGuiのコンパイルに時間がかかるので
この2つとg++のstdc++もダイナミックリンクにします
-
利点
各種ライブラリをDLLにすればフルコンパイル時間が大幅に短縮される
-
欠点
Winodwsの場合、ImGuiをDLL化して使うのは非推奨となっている。
DLL呼び出しのオーバーヘッドで実行速度が落ちるらしい
でもスクリプト言語系のバインディングは全部DLL型なので気にしなくてOKかも
-
採用
開発中はDLLリンクで使い、リリース時にスタティックリンクに変更すればいいという方針
-
分離されるDLL
-
cimgui.dll : 別途コンパイルが必要(MinGWのgccで)
cd C:\Users\%USERNAME%\.nimble\pkgs\nimgl-1.3.2\nimgl\private\cimgui
make
カレントフォルダにcimgui.dllができるのでこれを使う
$ strip cimgui.dll
でデバッグ情報を削ればサイズは小さくなる
-
glfw3.dll
https://www.glfw.org/downloadここから glfw-3.3系列を取得
mingw用のglfw3.dllを使う
後述の自前でコンパイル
でもOK
-
libstdc++-6.dll
gccに実行パスが通っている限り気にしなくて良い
-
cimgui.dllとglfw3.dllは nimgl_test.exeと同じフォルダに置く
-
リンクをダイナミック・リンクに変更する
config.nims内で
const STATIC_LINK = false
とした後
pwd
nimgl_test
make clean
make
で完了
GUIアプリの ひな形プロジェクト
その他の参考リンク
CImGuiは Dear Bindingsに移行しようとしている
C言語インターフェース(各種言語バインディング用)はCImGuiをやめてDear Bindingsに移行しようとしているみたいだけど
状況は未調査
glfw3.dllを自前でコンパイルするメモ
上ではglfw本家からダウンロードしたがNimgl付属のソースからglfw3.dllを生成する方法のメモ
$ git clone https://github.com/nimgl/nimgl
nimgl/private/glfw/CMakeLists.txt
の 25行目の
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
を
option(BUILD_SHARED_LIBS "Build shared libraries" ON)
に変更後、
$ cd nimgl/private/glfw
$ mkdir build
$ cd build
$ cmake .. -G"MSYS Makefiles"
$ make glfw
で ./src/glfw3.dll が生成されている
$ strip ./src/glfw3.dll
でデバッグ情報を削除可能
デモアプリEXEも同時に作りたいときは、
make
だけで ./examples
と./tests
の中にEXEファイルが生成される
さらに link
(注)
(注1) EXEの小ささを言えばC#
が恐らく最小。(.NETライブラリがWindows標準装備なので)
でも単独バイナリEXEにまとめると10MBくらいだった orz
(注2) VCRUNTIME140.dllが外部DLLかどうか不明なものの
100KBくらいなのでコードサイズ的な影響は小さい
スタティックリンクにする場合は以下を参照
imguiのサンプルを動かす
(注3) MSVC(MS Visual Studio C++)ではコンパイル不能(--cc:vcc 時)
変更履歴