2024/03/18(月) [n年前の日記]
#1 [prog] C言語とOpenGLで疑似3D道路の描画実験中。その5
C言語 + OpenGL + glfw を使って実験中。疑似3D道路を描画してみたい。
_昨日、 C言語で書いた疑似3D道路を描画するプログラムを、省電力CPUを載せてるサブPC上で動かしてみたところ、30 - 37FPS ぐらいしか出なくてガッカリしたのだけど、他のサブPC上で動かしたらどうなるのか気になったので試してみた。
_昨日、 C言語で書いた疑似3D道路を描画するプログラムを、省電力CPUを載せてるサブPC上で動かしてみたところ、30 - 37FPS ぐらいしか出なくてガッカリしたのだけど、他のサブPC上で動かしたらどうなるのか気になったので試してみた。
◎ サブPCのスペック :
1つは、Core i3-6100T機。
1つは、Core i5-2500機。
1つは、A6-3500機。
- CPU : Intel Core i3-6100T (2C/4T, 3.2GHz, 35W, 第6世代)
- GPU : 内蔵GPU Intel HD Graphics 530 (350 - 950MHz)
- RAM : 8GB
- OS : Ubuntu Linux 22.04 LTS 64bit
- 画面解像度 : 1920 x 1080
1つは、Core i5-2500機。
- CPU : Intel Core i5-2500 (4C/4T, 3.3 - 3.7GHz, 95W, 第2世代)
- GPU : 内蔵GPU Intel HD Graphics 2000 (850MHz - 1.10GHz)
- RAM : 8GB
- OS : Ubuntu Linux 20.04 LTS 64bit
- 画面解像度 : 1920 x 1200
1つは、A6-3500機。
- CPU : AMD A6-3500 (3C/3T, 2.1 - 2.4GHz, 65W)
- GPU : 内蔵GPU Radeon HD 6530D (443MHz)
- RAM : 8GB
- OS : Linux Mint 21.1 64bit
- 画面解像度 : 1920 x 1200
◎ 結果 :
i3-6100T機は60FPSで動いてくれた。Intel第6世代CPU、しかも省電力タイプなのに60FPSで描画してくれたのは助かる…。例えば今現在2万円台で買えるミニPCには Intel N100 を載せてる製品が多いけど、その N100 が第8世代と同じくらいの性能らしいので…。第6世代の i3-6100T で60FPSが出るなら、第8世代相当と言われる Intel N100 でも、おそらく60FPSで動いてくれそうな気がする。
i5-2500機は、なかなか厳しい結果になった。16 - 60FPS で描画されている。道路と背景しかない場所なら60FPSで滑らかに動くけれど、ビルボードがたくさんある場所に来ると酷い時は 16FPS まで落ち込む。もう画面がガックンガックン。紙芝居かと思うほど。まあ、第2世代だし、内蔵GPUが圧倒的に非力なのだろうけど…。
A6-3500機も、ちと厳しい結果になった。34 - 60FPS で描画されている。i5-2500機と同様に、道路と背景だけなら60FPSで動くけど、ビルボード密集地は34FPSまで落ち込む。それでも30FPSを下回らないあたり、当時としては比較的スペックが高いとされていた内蔵GPUを載せてるだけのことはあるなと…。
何はともあれ、ビルボードの描画で、昔の非力な内蔵GPU達が悲鳴を上げてるようではあるなと…。ビルボードを描画しないモードをつけておいたほうがいいのかもしれない。
i5-2500機は、なかなか厳しい結果になった。16 - 60FPS で描画されている。道路と背景しかない場所なら60FPSで滑らかに動くけれど、ビルボードがたくさんある場所に来ると酷い時は 16FPS まで落ち込む。もう画面がガックンガックン。紙芝居かと思うほど。まあ、第2世代だし、内蔵GPUが圧倒的に非力なのだろうけど…。
A6-3500機も、ちと厳しい結果になった。34 - 60FPS で描画されている。i5-2500機と同様に、道路と背景だけなら60FPSで動くけど、ビルボード密集地は34FPSまで落ち込む。それでも30FPSを下回らないあたり、当時としては比較的スペックが高いとされていた内蔵GPUを載せてるだけのことはあるなと…。
何はともあれ、ビルボードの描画で、昔の非力な内蔵GPU達が悲鳴を上げてるようではあるなと…。ビルボードを描画しないモードをつけておいたほうがいいのかもしれない。
◎ ビルボードを一部削ってみた :
木のビルボードが出てくると描画が重くなってる印象を受けたので、試しに、木のビルボードは草のビルボードに置き換えてしまう処理を入れてみた。
件のモードをつけたことで、A6-3500機上では常時60FPSが出るようになった。
ただ、i5-2500機上では、一応フレームレートが改善したものの、法面ビルボードが出てくるあたりでググッとフレームレートが落ちてしまう。法面の有無は結構印象を変えてくれる気もするけれど、一応出さないモードもつけておくか…。
件のモードをつけたことで、A6-3500機上では常時60FPSが出るようになった。
ただ、i5-2500機上では、一応フレームレートが改善したものの、法面ビルボードが出てくるあたりでググッとフレームレートが落ちてしまう。法面の有無は結構印象を変えてくれる気もするけれど、一応出さないモードもつけておくか…。
◎ Linuxで時間を取得するあたりでハマった :
Ubuntu Linux 22.04 / 20.04 LTS でもビルドできるようにソースを修正するあたりで少しハマった。そもそも、Linux + C言語で時間取得をする方法が分からなくて…。
最初は clock() を使ったけれど、自分の使い方が間違ってたのか、頓珍漢な時間を取得する状態になってしまったようで、カメラの移動速度その他が珍妙なことに…。clock_gettime() を使ったら、どうにかそれらしい値が取得できたっぽい。
_時間情報の取得 clock() - 時間の扱い - 碧色工房
_時間情報の取得 clock_gettime() - 時間の扱い - 碧色工房
ただ、clock_gettime() 等を使う際、Windows + Visual Studio Code の環境で自動補完機能(IntelliSense)が働いてくれなくて、ソースを書くのがちょっと面倒な状態になった。普段は Visual Studio Code に対して MinGW gcc 9.2.0 を設定しているのだけど、どうやら MinGW gcc 9.2.0 では、clock_gettime() や CLOCK_MONOTONIC が利用できないようで…。Visual Studio Code の 「C/C++ : 構成の編集 (UI)」で、MSYS2 gcc 13.2.0 (D:/msys64/mingw64/bin/gcc.exe) を利用するようにしてみたら改善された。
最初は clock() を使ったけれど、自分の使い方が間違ってたのか、頓珍漢な時間を取得する状態になってしまったようで、カメラの移動速度その他が珍妙なことに…。clock_gettime() を使ったら、どうにかそれらしい値が取得できたっぽい。
_時間情報の取得 clock() - 時間の扱い - 碧色工房
_時間情報の取得 clock_gettime() - 時間の扱い - 碧色工房
ただ、clock_gettime() 等を使う際、Windows + Visual Studio Code の環境で自動補完機能(IntelliSense)が働いてくれなくて、ソースを書くのがちょっと面倒な状態になった。普段は Visual Studio Code に対して MinGW gcc 9.2.0 を設定しているのだけど、どうやら MinGW gcc 9.2.0 では、clock_gettime() や CLOCK_MONOTONIC が利用できないようで…。Visual Studio Code の 「C/C++ : 構成の編集 (UI)」で、MSYS2 gcc 13.2.0 (D:/msys64/mingw64/bin/gcc.exe) を利用するようにしてみたら改善された。
◎ Linux上のvsync :
今現在、glfw で glfwSwapInterval(1) を指定することで、vsync をチェックしてダブルバッファを切り替えるようにしているはずだけど、Windows10 x64 22H2上のみならず、Linux実機上でも vsync をチェックしてくれるようで、その点は助かった。もし vsync を見ていなかったら時々60FPS以上のフレームレートになるはずだけど、今のところ60FPSは超えてないので…。これは vsync を見てくれてるようだなと。もっとも、液晶ディスプレイで表示しているのに vsync 云々というのもなんだかよく分からない状態なのだけど…。
[ ツッコむ ]
#2 [prog] 1つのMakefileでWindowsとLinuxに対応させたい
1つのMakefileで、Windows と Linux の両方に対応させたい。どうしたらいいのだろう。
以下が参考になった。ありがたや。
_【make】Makefile内の記述をWindowsとLinux両対応にする│株式会社シーポイントラボ|浜松のシステム・RTK-GNSS開発
一例。以下のように書いたら動いてくれた。
以下が参考になった。ありがたや。
_【make】Makefile内の記述をWindowsとLinux両対応にする│株式会社シーポイントラボ|浜松のシステム・RTK-GNSS開発
ifeq ($(OS),Windows_NT) # Windows else # Linux #endif
一例。以下のように書いたら動いてくれた。
SRCS = 04_ps3d_bb.c ifeq ($(OS),Windows_NT) # Windows TARGET = 04_ps3d_bb.exe GCC_VERSION=$(shell gcc -dumpversion) ifeq ($(GCC_VERSION),6.3.0) # MinGW gcc 6.3.0 LIBS = -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3dll -mwindows else # MinGW gcc 9.2.0, MSYS2 LIBS = -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3 -mwindows endif else # Linux (Ubuntu Linux 22.04 LTS, gcc 11.4.0) TARGET = 04_ps3d_bb LIBS = -lSOIL -lGL -lGLU -lglfw -lm endif all: $(TARGET) $(TARGET): $(SRCS) glbitmfont.h Makefile gcc $< -o $@ $(LIBS) .PHONY: clean clean: rm -f $(TARGET) *.o
◎ OpenGLを使う時のライブラリ指定 :
ついでなので、MinGW gcc や Linux + gcc で、OpenGL, glfw(glfw3), SOIL を使ってるプログラムをビルドする時のライブラリ指定もメモ。
Windowsの場合。
Linux (Ubuntu Linux (22.04|20.04) LTS) の場合。
ちなみに、Ubuntu Linux で SOIL(Simple OpenGL Image Library) や glfw3 を使いたい時はパッケージをインストールするだけで済む。
Windowsの場合。
gcc hoge.c -o hoge.exe -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3 -mwindows or gcc hoge.c -o hoge.exe -static -lSOIL -lopengl32 -lglu32 -lwinmm -lgdi32 -lglfw3dll -mwindows
Linux (Ubuntu Linux (22.04|20.04) LTS) の場合。
gcc hoge.c -o hoge -lSOIL -lGL -lGLU -lglfw -lm
ちなみに、Ubuntu Linux で SOIL(Simple OpenGL Image Library) や glfw3 を使いたい時はパッケージをインストールするだけで済む。
sudo apt install libsoil-dev sudo apt install libglfw3-dev
[ ツッコむ ]
以上、1 日分です。