2021/02/24(水) [n年前の日記]
#1 [raspberrypi][love2d] SDL2をRaspberry Pi Zero W向けにビルドし直し
昨日、Raspberry Pi Zero W + Raspberry Pi OS buster 上で love2d の動作確認をしたけれど。
_love2d を Raspberry Pi OS buster上でインストールしてみたい
SDL2を、Raspberry Pi Zero W 上で、OpenGLを有効にしなくても速度が出るようにビルドし直したい。
examples/png2theora.c を修正。
_love2d を Raspberry Pi OS buster上でインストールしてみたい
SDL2を、Raspberry Pi Zero W 上で、OpenGLを有効にしなくても速度が出るようにビルドし直したい。
◎ SDL2関係のメモ。 :
SDL2をビルドし直す前に、SDL2関係のアレコレを一応メモしておく。
SDL2の公式サイトは以下。
_Simple DirectMedia Layer - SDL version 2.0.14 (stable)
Debian buster (Debian 10.x) の各パッケージは、以下のバージョンになってる。Raspberry Pi OS buster も、たぶん同じはず。
ちなみに、Debian bullseye (Debian 11.x) は SDL 2.0.14 になっているっぽい。
SDL2 入手先。
_Index of /release
_libsdl-org/SDL: Simple Directmedia Layer
_https://www.libsdl.org/release/SDL2-2.0.9.tar.gz
SDL_image 2.0 入手先。
_SDL_image 2.0
_libsdl-org/SDL_image: Image decoding for many popular formats for Simple Directmedia Layer.
_https://github.com/libsdl-org/SDL_image/archive/release-2.0.4.tar.gz
SDL_ttf 2.0 入手先。
_SDL_ttf 2.0
_libsdl-org/SDL_ttf: Support for TrueType (.ttf) font files with Simple Directmedia Layer.
_https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.15.tar.gz
SDL_mixer 2.0 入手先。
_SDL_mixer 2.0
_libsdl-org/SDL_mixer: An audio mixer that supports various file formats for Simple Directmedia Layer.
_https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.4.tar.gz
SDL_net 2.0 入手先。
_SDL_net 2.0
_libsdl-org/SDL_net: A simple, cross-platform wrapper over TCP/IP sockets.
_https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.0.1.tar.gz
smpeg2 入手先。
_Index of /projects/smpeg/release
_https://www.libsdl.org/projects/smpeg/release/smpeg2-2.0.0.tar.gz
openal-soft 入手先。
_kcat/openal-soft: OpenAL Soft is a software implementation of the OpenAL 3D audio API.
_https://github.com/kcat/openal-soft/archive/openal-soft-1.19.1.tar.gz
libtheora-dev 入手先。
_Theora.org :: downloads - Theora, video for everyone
_http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2
SDL2の公式サイトは以下。
_Simple DirectMedia Layer - SDL version 2.0.14 (stable)
Debian buster (Debian 10.x) の各パッケージは、以下のバージョンになってる。Raspberry Pi OS buster も、たぶん同じはず。
- SDL 2.0.9 (libsdl2-dev 2.0.9)
- libsdl2-image-dev 2.0.4
- libsdl2-mixer-dev 2.0.4
- libsdl2-ttf-dev 2.0.15
- libsdl2-net-dev 2.0.1
- libopenal-dev 1.19.1-1
- libtheora-dev 1.1.1
ちなみに、Debian bullseye (Debian 11.x) は SDL 2.0.14 になっているっぽい。
SDL2 入手先。
_Index of /release
_libsdl-org/SDL: Simple Directmedia Layer
_https://www.libsdl.org/release/SDL2-2.0.9.tar.gz
SDL_image 2.0 入手先。
_SDL_image 2.0
_libsdl-org/SDL_image: Image decoding for many popular formats for Simple Directmedia Layer.
_https://github.com/libsdl-org/SDL_image/archive/release-2.0.4.tar.gz
SDL_ttf 2.0 入手先。
_SDL_ttf 2.0
_libsdl-org/SDL_ttf: Support for TrueType (.ttf) font files with Simple Directmedia Layer.
_https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.15.tar.gz
SDL_mixer 2.0 入手先。
_SDL_mixer 2.0
_libsdl-org/SDL_mixer: An audio mixer that supports various file formats for Simple Directmedia Layer.
_https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.4.tar.gz
SDL_net 2.0 入手先。
_SDL_net 2.0
_libsdl-org/SDL_net: A simple, cross-platform wrapper over TCP/IP sockets.
_https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.0.1.tar.gz
smpeg2 入手先。
_Index of /projects/smpeg/release
_https://www.libsdl.org/projects/smpeg/release/smpeg2-2.0.0.tar.gz
openal-soft 入手先。
_kcat/openal-soft: OpenAL Soft is a software implementation of the OpenAL 3D audio API.
_https://github.com/kcat/openal-soft/archive/openal-soft-1.19.1.tar.gz
libtheora-dev 入手先。
_Theora.org :: downloads - Theora, video for everyone
_http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2
◎ SDL2関係のソースをまとめて入手。 :
SDL2関係のソースをまとめて入手する。~/tmp/ を作成して、その中にDLする。
url.txt に以下のURL群を記述。
wget でまとめてDL。
一部のファイルを分かりやすくリネーム。
mkdir ~/tmp cd ~/tmp vi url.txt
url.txt に以下のURL群を記述。
https://www.libsdl.org/release/SDL2-2.0.9.tar.gz https://github.com/libsdl-org/SDL_image/archive/release-2.0.4.tar.gz https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.0.4.tar.gz https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.0.1.tar.gz https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.0.15.tar.gz https://github.com/kcat/openal-soft/archive/openal-soft-1.19.1.tar.gz https://www.libsdl.org/projects/smpeg/release/smpeg2-2.0.0.tar.gz http://downloads.xiph.org/releases/theora/libtheora-1.1.1.tar.bz2
wget でまとめてDL。
wget -nd -N -i url.txt
- -nd, --no-directories : 再帰ダウンロード時にディレクトリを作成しない
- -N, --timestamping : ファイルのタイムスタンプをサーバ上のタイムスタンプに変更
- -i ファイル名, --input-file=ファイル名 : 指定したファイルからダウンロードするURLを読み込む
一部のファイルを分かりやすくリネーム。
mv release-2.0.4.tar.gz SDL2_image-2.0.4.tar.gz
◎ ビルドするためのディレクトリを作成。 :
mkdir ~/src~/src/ 以下でビルドしていくことにする。
◎ ビルドに必要なパッケージをインストール。 :
昨日の作業で済ませてあるけど、一応、ビルドに必要らしいパッケージをインストール。不要なものも入ってるかもしれんけど…。
sudo apt install autotools-dev automake libtool libdevil-dev libluajit-5.1-dev libphysfs-dev libsdl2-dev libopenal-dev libogg-dev libvorbis-dev libflac-dev libflac++-dev libmodplug-dev libmpg123-dev libmng-dev libturbojpeg0-dev libtheora-dev sudo apt install libudev-dev libasound2-dev libdbus-1-dev libfreeimage-dev libsndfile1-dev libtiff5-dev libwebp-dev cmake sudo apt install build-essential pkg-config libfreetype6-dev
◎ SDL2をビルド。 :
「--disable-*」を付けていくことで、OpenGLを使わないSDL2をビルドする。
Raspberry Pi Zero W 上では、1時間ぐらいでビルドできた。
基本的に、出来上がった *.so は、/usr/local/lib/ の中にコピーされる。
cd ~/src tar xpf ~/tmp/SDL2-2.0.9.tar.gz cd SDL2-2.0.9 mkdir build && cd build ../configure --disable-pulseaudio --disable-esd --disable-video-mir --disable-video-wayland --disable-video-x11 --disable-video-opengl | tee configure.log make | tee make.log sudo make install | tee makeinstall.log
- *.log に、configure時、make時の結果が残ってるので、何か問題が起きた時は参照のこと。
- configure時の Video の中に「rpi」があれば、Raspberry Pi用(GPU VC4に特化)したビルド設定になっているはず。
Raspberry Pi Zero W 上では、1時間ぐらいでビルドできた。
基本的に、出来上がった *.so は、/usr/local/lib/ の中にコピーされる。
◎ SDL_image 2.0をビルド。 :
もしかすると、SDL_image 2.0 は、apt で入手できる版をそのまま使ってもいいのかもしれない…。そのへんよく分からんので、一応ビルドしてみる。
cd ~/src tar xpf ~/tmp/SDL2_image-2.0.4.tar.gz cd SDL_image-release-2.0.4 mkdir build && cd build ../configure | tee configure.log make | tee make.log sudo make install | tee makeinstall.log6分ほどでビルド。
◎ SMPEG 2.0をビルド。 :
これもビルドしなくていいのかもしれない…?
audio/hufftable.cpp を修正。「#include <climits>」を入れて、「0-1」と書かれた部分を「UINT_MAX」に置換。
12分ほどでビルド。
cd ~/src tar xpf ~/tmp/smpeg2-2.0.0.tar.gz cd smpeg2-2.0.0
audio/hufftable.cpp を修正。「#include <climits>」を入れて、「0-1」と書かれた部分を「UINT_MAX」に置換。
*************** *** 9,14 **** --- 9,15 ---- #include "config.h" #endif + #include <climits> #include "MPEGaudio.h" static const unsigned int *************** *** 550,560 **** const HUFFMANCODETABLE MPEGaudio::ht[HTN]= { { 1, 2-1, 2-1, 0, 7,htd01}, { 2, 3-1, 3-1, 0, 17,htd02}, { 3, 3-1, 3-1, 0, 17,htd03}, { 5, 4-1, 4-1, 0, 31,htd05}, { 6, 4-1, 4-1, 0, 31,htd06}, { 7, 6-1, 6-1, 0, 71,htd07}, --- 551,561 ---- const HUFFMANCODETABLE MPEGaudio::ht[HTN]= { { 1, 2-1, 2-1, 0, 7,htd01}, { 2, 3-1, 3-1, 0, 17,htd02}, { 3, 3-1, 3-1, 0, 17,htd03}, { 5, 4-1, 4-1, 0, 31,htd05}, { 6, 4-1, 4-1, 0, 31,htd06}, { 7, 6-1, 6-1, 0, 71,htd07}, *************** *** 564,570 **** {11, 8-1, 8-1, 0,127,htd11}, {12, 8-1, 8-1, 0,127,htd12}, {13,16-1,16-1, 0,511,htd13}, {15,16-1,16-1, 0,511,htd15}, {16,16-1,16-1, 1,511,htd16}, {17,16-1,16-1, 2,511,htd16}, --- 565,571 ---- {11, 8-1, 8-1, 0,127,htd11}, {12, 8-1, 8-1, 0,127,htd12}, {13,16-1,16-1, 0,511,htd13}, {15,16-1,16-1, 0,511,htd15}, {16,16-1,16-1, 1,511,htd16}, {17,16-1,16-1, 2,511,htd16},
mkdir build && cd build ../configure | tee configure.log make | tee make.log sudo make install | tee makeinstall.log
12分ほどでビルド。
◎ SDL_mixer 2.0をビルド。 :
これもビルドしなくていいのかもしれない…?
cd ~/src tar xpf ~/tmp/SDL2_mixer-2.0.4.tar.gz cd SDL2_mixer-2.0.4 mkdir build && cd build ../configure | tee configure.log make | tee make.log sudo make install | tee makeinstall.log6分ほどでビルド。
◎ SDL_net 2.0をビルド。 :
これもビルドしなくていいのかもしれない…?
cd ~/src tar xpf ~/tmp/SDL2_net-2.0.1.tar.gz cd SDL2_net-2.0.1 mkdir build && cd build ../configure | tee configure.log make | tee make.log sudo make install | tee makeinstall.log5分ほどでビルド。
◎ SDL_ttf 2.0をビルド。 :
他と違って、OpenGLのサポートを無効にするように configure を変更してからビルドする。
cd ~/src tar xpf ~/tmp/SDL2_ttf-2.0.15.tar.gz cd SDL2_ttf-2.0.15 mkdir build && cd build sed -i -e 's/have_opengl=yes/have_opengl=no/' ../configure ../configure | tee configure.log make | tee make.log sudo make install | tee makeinstall.log4分ほどでビルド。
◎ OpenALをビルド。 :
以下を参考にしてオプション指定。JACK だの PULSEAUDIO だのを無効にしているらしい。
_LoVE (Love2D) を Raspbian Stretch で動かす: Digitalians' Alchemy
_LoVE (Love2D) を Raspbian Stretch で動かす: Digitalians' Alchemy
cd ~/src tar xpf ~/tmp/openal-soft-1.19.1.tar.gz cd openal-soft-openal-soft-1.19.1/build cmake -DALSOFT_BACKEND_JACK=OFF -DALSOFT_BACKEND_PULSEAUDIO=OFF .. or cmake .. make | tee make.log sudo make install | tee makeinstall.log11分ほどでビルド。
◎ Theoraをビルド。 :
cd ~/src tar xpf ~/tmp/libtheora-1.1.1.tar.bz2 cd libtheora-1.1.1
examples/png2theora.c を修正。
*************** *** 462,470 **** png_set_strip_alpha(png_ptr); row_data = (png_bytep)png_malloc(png_ptr, row_pointers = (png_bytep *)png_malloc(png_ptr, for(y = 0; y < height; y++) { row_pointers[y] = row_data + y*(3*width); } --- 462,470 ---- png_set_strip_alpha(png_ptr); row_data = (png_bytep)png_malloc(png_ptr, row_pointers = (png_bytep *)png_malloc(png_ptr, for(y = 0; y < height; y++) { row_pointers[y] = row_data + y*(3*width); }
./configure | tee configure.log make | tee make.log sudo make install | tee makeinstall.log13分ほどでビルド。
◎ 共有ライブラリの優先度を変更。 :
/etc/ld.so.conf を修正して、/usr/local/lib を先頭行に追加。
一応、/etc/ld.so.conf.d/ の中の libc.conf で該当場所は書かれているのだけど、呼ばれる優先順位は低いのではないか…。たぶん。
共有ライブラリを更新。
一応、/etc/ld.so.conf.d/ の中の libc.conf で該当場所は書かれているのだけど、呼ばれる優先順位は低いのではないか…。たぶん。
共有ライブラリを更新。
sudo ldconfig ldconfig -p | grep openal/usr/local/lib/ 以下の共有ライブラリのほうが先に出てくればOK。
◎ love2dをビルドし直し。 :
もしかするとやらなくてもいいのかもしれんけど…。一応、love2d をビルドし直しておく。
_love2d/love: LoVE is an awesome 2D game framework for Lua.
_Releases - love2d/love
configure を走らせた際に --prefix=/usr/local を指定しておいたので、/usr/local/bin/ に love がコピーされる。
_love2d/love: LoVE is an awesome 2D game framework for Lua.
_Releases - love2d/love
wget https://github.com/love2d/love/releases/download/11.3/love-11.3-linux-src.tar.gz tar xvzf love-11.3-linux-src.tar.gz cd love-11.3 ./configure --prefix=/usr/local | tee configure.log make | tee make.log sudo make install | tee makeinstall.log3時間ほどかかってビルド。
configure を走らせた際に --prefix=/usr/local を指定しておいたので、/usr/local/bin/ に love がコピーされる。
◎ 動作確認。 :
Ctrl + Alt + T で端末を開いて、love と打ち込めば、ヒヨコがふらふらするデモが全画面で表示される。apt でインストールされる版と違って、OpenGL を無効にしてあっても滑らかに動いてくれた。ただし、ウインドウ表示ではなく、必ず全画面表示になる。
自分が以前書いたスクリプトを動かしてみた。
_mieki256/love2d_stg_sample02: love2d sample. top view scroll shooting game.
ここで問題・不具合が発生…。
ということで、エラーが出たり動作が怪しくなる時は、デスクトップの画面解像度を落として試してみたほうが良いのかもしれない。おそらくだけど、Raspberry Pi Zero W のメモリは少ないので、メモリ不足が起きてる気がする…。
love とだけ打ってデモ表示をした時は、画面解像度 1920x1080 でもエラーが出ないので、スクリプトの書き方次第、描画関連バッファの持ち方次第で結果が変わってくるのかもしれない。
自分が以前書いたスクリプトを動かしてみた。
_mieki256/love2d_stg_sample02: love2d sample. top view scroll shooting game.
git clone https://github.com/mieki256/love2d_stg_sample02.git love love2d_stg_sample02
ここで問題・不具合が発生…。
- デスクトップ画面解像度 1920x1080@60Hz, GPUメモリ=64MBでは、エラー(glGetError 0x505)を出して正常動作しない。画面すら出ない。
- デスクトップ画面解像度 1920x1080@60Hz, GPUメモリ=256MBでは、画面は表示されるけど、音声関係のエラーが端末に出力され続ける。(AL lib: (EE) ALCplaybackAlsa_mixerNoMMapProc: available update failed: Broken pipe)
- デスクトップ画面解像度 1280x720@60Hz, GPUメモリ=64MBなら、画面も表示されるし、音声関係のエラーも出ない。
- デスクトップ画面解像度 720x640@60Hz, GPUメモリ=64MBも、問題無し。
ということで、エラーが出たり動作が怪しくなる時は、デスクトップの画面解像度を落として試してみたほうが良いのかもしれない。おそらくだけど、Raspberry Pi Zero W のメモリは少ないので、メモリ不足が起きてる気がする…。
love とだけ打ってデモ表示をした時は、画面解像度 1920x1080 でもエラーが出ないので、スクリプトの書き方次第、描画関連バッファの持ち方次第で結果が変わってくるのかもしれない。
◎ 2Dゲーム制作ライブラリの雑感。 :
Raspberry Pi Zero W上で動作する、2Dゲーム制作向けのライブラリ・ゲームエンジン等をここ数日触ってみたけど、以下のような印象を受けた。
お試しで気楽にゲームっぽいものを作ってみるという用途なら、やっぱり Pygame になるのかなと…。導入が簡単だから、作ったスクリプトを誰かに渡すことも気兼ねなくできるだろうし…。その代わり描画は遅いので、作れる範囲に制約が出てくるだろうけど。
Python の学習も兼ねることができるという点で、Pyxel もイイ感じなのだけど、導入するために gcc 9 をインストールするあたりが、ちょっと面倒で…。
Raspberry Pi3、Pi4以降なら、OpenGLを有効にできるだろうから(昨今は標準で有効になっているという話も見かけた)、その場合は love2d がイイ感じかもしれない。
HSP は、導入に関して、git clone してスクリプトを実行してビルドを待つだけなので、とてもイイ感じなのだけど。相性が悪くて無反応になるキーボードやマウスを使ってしまうと、スクリプト実行後にラズパイ本体のみで終了させる方法が無くなるあたりが大変厳しいなと…。
念のために書いておくけど、これはあくまで Raspberry Pi Zero W上で試した場合の印象で。フツーのPC上で使うなら、どれも導入は簡単だし、描画も速いです。
- Python + Pygame : 導入が簡単。描画はかなり遅い。
- HSP : 導入は比較的簡単。描画は速い。ただ、現状では、利用できるキーボードやマウスが限られてしまう可能性が高い。相性がある。
- Python + Pyxel : 導入はちょっと面倒。OpenGL有効なら描画は速い。OpenGL無効では描画はとんでもなく遅い。
- love2d : apt でインストールするだけなら導入は簡単。OpenGL有効なら描画はそこそこ速い。OpenGLが無効でも実用になる版を導入するなら面倒なビルドが必要になる。その代わり描画は速くなる。
お試しで気楽にゲームっぽいものを作ってみるという用途なら、やっぱり Pygame になるのかなと…。導入が簡単だから、作ったスクリプトを誰かに渡すことも気兼ねなくできるだろうし…。その代わり描画は遅いので、作れる範囲に制約が出てくるだろうけど。
Python の学習も兼ねることができるという点で、Pyxel もイイ感じなのだけど、導入するために gcc 9 をインストールするあたりが、ちょっと面倒で…。
Raspberry Pi3、Pi4以降なら、OpenGLを有効にできるだろうから(昨今は標準で有効になっているという話も見かけた)、その場合は love2d がイイ感じかもしれない。
HSP は、導入に関して、git clone してスクリプトを実行してビルドを待つだけなので、とてもイイ感じなのだけど。相性が悪くて無反応になるキーボードやマウスを使ってしまうと、スクリプト実行後にラズパイ本体のみで終了させる方法が無くなるあたりが大変厳しいなと…。
念のために書いておくけど、これはあくまで Raspberry Pi Zero W上で試した場合の印象で。フツーのPC上で使うなら、どれも導入は簡単だし、描画も速いです。
[ ツッコむ ]
以上です。