mieki256's diary



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を有効にしなくても速度が出るようにビルドし直したい。

SDL2関係のメモ。 :

SDL2をビルドし直す前に、SDL2関係のアレコレを一応メモしておく。

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する。
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を読み込む
_【 wget 】コマンド――URLを指定してファイルをダウンロードする:Linux基本コマンドTips(24) - @IT

一部のファイルを分かりやすくリネーム。
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をビルドする。
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.log
6分ほどでビルド。

SMPEG 2.0をビルド。 :

これもビルドしなくていいのかもしれない…?
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.log
6分ほどでビルド。

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.log
5分ほどでビルド。

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.log
4分ほどでビルド。

OpenALをビルド。 :

以下を参考にしてオプション指定。JACK だの PULSEAUDIO だのを無効にしているらしい。

_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.log
11分ほどでビルド。

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.log
13分ほどでビルド。

共有ライブラリの優先度を変更。 :

/etc/ld.so.conf を修正して、/usr/local/lib を先頭行に追加。

一応、/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

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.log
3時間ほどかかってビルド。

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.
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ゲーム制作向けのライブラリ・ゲームエンジン等をここ数日触ってみたけど、以下のような印象を受けた。
  • 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上で使うなら、どれも導入は簡単だし、描画も速いです。

以上、1 日分です。

過去ログ表示

Prev - 2021/02 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project