2021/02/22(月) [n年前の日記]
#1 [pyxel][python][raspberrypi] PyxelをRaspberry Pi Zero W上でインストールしてみた
Pyxel は、Python を使って2Dゲームを作成できるライブラリ・レトロゲームエンジン。
_pyxel/README.ja.md at master - kitao/pyxel
Pyxel を、Raspberry Pi Zero W + Raspberry Pi OS buster 上でビルド・インストールしてみる。
_pyxel/README.ja.md at master - kitao/pyxel
Pyxel を、Raspberry Pi Zero W + Raspberry Pi OS buster 上でビルド・インストールしてみる。
◎ インストール手順。 :
前述のページの中に、Raspberry Pi に導入するときの手順が書いてあるので、ソレに従って作業。~/ 以下に git clone して作業してみる。
しかし、エラーが出る。
ググってみたら以下の報告が。
_Pyxel install fails on Raspberry Pi 4 - Issue #286 - kitao/pyxel
gcc 9 が必要らしい…。Raspbeey Pi Zero W に gcc 9 をインストールしないといけない。
ちなみに、2021/02/22現在、標準では gcc 8.3.0 がインストールされている模様。
cd ~/ git clone https://github.com/kitao/pyxel.git cd pyxel make -C pyxel/core clean all pip3 install .
しかし、エラーが出る。
$ pip3 install . Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple Processing /home/pi/pyxel Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-req-build-oteqvc1l/setup.py", line 2, in <module> from pyxel import VERSION File "/tmp/pip-req-build-oteqvc1l/pyxel/__init__.py", line 10, in <module> from . import core # type: ignore File "/tmp/pip-req-build-oteqvc1l/pyxel/core/__init__.py", line 42, in <module> _lib = _load_library() File "/tmp/pip-req-build-oteqvc1l/pyxel/core/__init__.py", line 39, in _load_library return cdll.LoadLibrary(lib_path) File "/usr/lib/python3.7/ctypes/__init__.py", line 434, in LoadLibrary return self._dlltype(name) File "/usr/lib/python3.7/ctypes/__init__.py", line 356, in __init__ self._handle = _dlopen(self._name, mode) OSError: /tmp/pip-req-build-oteqvc1l/pyxel/core/bin/linux/libpyxelcore.so: undefined symbol: _ZNSt10filesystem7__cxx114path14_M_split_cmptsEv ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-req-build-oteqvc1l/
ググってみたら以下の報告が。
_Pyxel install fails on Raspberry Pi 4 - Issue #286 - kitao/pyxel
gcc 9 が必要らしい…。Raspbeey Pi Zero W に gcc 9 をインストールしないといけない。
ちなみに、2021/02/22現在、標準では gcc 8.3.0 がインストールされている模様。
$ gcc --version gcc (Raspbian 8.3.0-6+rpi1) 8.3.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
◎ gcc 9 のインストール。 :
ググったら、おそらくはビルドした gcc 9.1.0 を公開してくれてる方が居るようで。ありがたや。使わせてもらおう…。
_sol_prog / raspberry-pi-gcc-binary - Bitbucket
_Install GCC 9 on Raspberry Pi and build C++17 programs
上記ページに従ってインストール。
しかし、サンプルファイル test_fs.cpp のコンパイルでエラーが出る。
調べてみたら、/usr/include/sys のシンボリックリンク作成に失敗していたらしい…。
/usr/include/sys を sys_orig にリネームしてから、シンボリックリンクを作成し直し。
この状態で試したら、今度はコンパイルが通った。
_sol_prog / raspberry-pi-gcc-binary - Bitbucket
_Install GCC 9 on Raspberry Pi and build C++17 programs
上記ページに従ってインストール。
しかし、サンプルファイル test_fs.cpp のコンパイルでエラーが出る。
$ g++-9.1 -std=c++17 -Wall -pedantic test_fs.cpp -o test_fs In file included from /opt/gcc-9.1.0/include/c++/9.1.0/arm-linux-gnueabihf/bits/os_defines.h:39, from /opt/gcc-9.1.0/include/c++/9.1.0/arm-linux-gnueabihf/bits/c++config.h:524, from /opt/gcc-9.1.0/include/c++/9.1.0/iostream:38, from test_fs.cpp:4: /usr/include/features.h:424:12: 致命的エラー: sys/cdefs.h: そのようなファイルやディレクトリはありま せん 424 | # include <sys/cdefs.h> | ^~~~~~~~~~~~
コンパイルを停止しました。
調べてみたら、/usr/include/sys のシンボリックリンク作成に失敗していたらしい…。
/usr/include/sys を sys_orig にリネームしてから、シンボリックリンクを作成し直し。
cd /usr/include sudo mv sys sys_orig sudo ln -s /usr/include/arm-linux-gnueabihf/sys /usr/include/sys
この状態で試したら、今度はコンパイルが通った。
◎ 再度Pyxelをビルド。 :
gcc 9 をインストールできたはずなので、再度、Pyxel のビルドに挑戦。
~/pyxel/pyxel/core/Makefile を修正する。
再度、Pyxel をビルド。
~/pyxel/pyxel/core/Makefile を修正する。
$ diff Makefile.orig Makefile -u --- Makefile.orig 2021-02-22 09:17:20.318631952 +0900 +++ Makefile 2021-02-22 09:18:22.998105983 +0900 @@ -46,7 +46,7 @@ endif ifeq ($(PF),linux) -CC = g++ +CC = g++-9.1 SDL2_CFLAGS = `sdl2-config --cflags` SDL2_LDFLAGS = `sdl2-config --libs` -lSDL2_image -static-libgcc -static-libstdc++ TARGET = $(BINDIR)/linux/$(LIBNAME).solinux向けの処理をする際に、g++ ではなく g++-9.1 を使うようにするらしい。
再度、Pyxel をビルド。
cd ~/pyxel make -C pyxel/core clean all pip3 install .ビルドができて、インストールもできた。
◎ Pyxelサンプルファイルのインストール。 :
~/.local/bin/ 以下に、Pyxel関係のコマンドがインストールされていた。
~/.local/bin/ にPATHを通しておいたほうが良さそう。~/.bashrc の最後のあたりに追加。
端末を再起動すれば反映される。たしか、source ~/.bashrc を実行しても反映された気もするけど…。
Pyxelのサンプルファイルをインストール。今回は ~/prg/pyxel/ 以下に置いてみた。
$ ls ~/.local/bin install_pyxel_examples pyxeleditor pyxelpackager
~/.local/bin/ にPATHを通しておいたほうが良さそう。~/.bashrc の最後のあたりに追加。
export PATH=$PATH:/home/(ACCOUNT_NAME)/.local/bin
端末を再起動すれば反映される。たしか、source ~/.bashrc を実行しても反映された気もするけど…。
Pyxelのサンプルファイルをインストール。今回は ~/prg/pyxel/ 以下に置いてみた。
mkdir ~/prg cd ~/prg mkdir pyxel cd pyxel install_pyxel_examples cd pyxel_examples
◎ サンプルを実行。 :
サンプルを実行してみた。
スマホで録画した動画を置いてみるけど、こんな感じで動いてる。このままでは、なかなか厳しい。
python3 01_hello_pyxel.py python3 02_jump_game.pyとんでもなく遅い。たぶん1FPSも出ていない。
スマホで録画した動画を置いてみるけど、こんな感じで動いてる。このままでは、なかなか厳しい。
◎ OpenGLを有効化。 :
OpenGL(OpenGLES) を有効にしたら状況が変わるだろうか? 試しに有効にしてみる。/boot/config.txt を編集。
以下を追加。
更に、一応、デスクトップの画面解像度を液晶ディスプレイの解像度と合わせておく。自分は普段、1920x1200の液晶ディスプレイに、1280x720@60Hz のデスクトップ画面を表示しているけど、このまま OpenGL を有効にすると画面が表示されない状態になる。sudo raspi-config → Display Options → Resolution → Default Monitor preferred resolution を選択して、液晶ディスプレイの解像度と合わせる設定にしておく。
設定変更後、OS再起動。これで、OpenGL(OpenGLES)が有効状態になったはず。
ちなみに、Raspberry Pi Zero系で OpenGL を有効にするのはサポート外だったはず。以前、公式(?)フォーラム内で、メモリが足りないのでまともに動かないはず、てな話が出ていたような記憶が…。でもまあ、それでも一応設定してみると、それらしく動く時もあったりするわけで…。
sudo vi /boot/config.txt
以下を追加。
gpu_mem=128 dtoverlay=vc4-kms-v3d,cma-128
更に、一応、デスクトップの画面解像度を液晶ディスプレイの解像度と合わせておく。自分は普段、1920x1200の液晶ディスプレイに、1280x720@60Hz のデスクトップ画面を表示しているけど、このまま OpenGL を有効にすると画面が表示されない状態になる。sudo raspi-config → Display Options → Resolution → Default Monitor preferred resolution を選択して、液晶ディスプレイの解像度と合わせる設定にしておく。
設定変更後、OS再起動。これで、OpenGL(OpenGLES)が有効状態になったはず。
ちなみに、Raspberry Pi Zero系で OpenGL を有効にするのはサポート外だったはず。以前、公式(?)フォーラム内で、メモリが足りないのでまともに動かないはず、てな話が出ていたような記憶が…。でもまあ、それでも一応設定してみると、それらしく動く時もあったりするわけで…。
◎ OpenGL有効状態でサンプルを実行。 :
各サンプルを動かしてみた。今度は滑らかに動いてくれた。何FPS出てるのか分からんけど、かなりイイ感じに見える。
上記の動画には入ってないけど、音楽もちゃんと鳴っているような気がする。処理が間に合わなくて音にノイズが混ざったり等はしてない感じ。
ただ、06_click_game.py は強制終了してしまった…。それ以外のサンプルは、全部動いた。
同梱のリソースエディタ(ドットエディタ+サウンドエディタ)、pyxeleditor も動かしてみたけれど、これはかなり重かった。CPU負荷がずっと100%のままで、マウスカーソルの動きもガクガク。ちょっと実用にはならないかもしれない。CPUコアを複数持っている Raspberry Pi で動かせばスイスイと動くのかもしれんけど、1コアの Zero系で使うのは少々厳しい気配。
上記の動画には入ってないけど、音楽もちゃんと鳴っているような気がする。処理が間に合わなくて音にノイズが混ざったり等はしてない感じ。
ただ、06_click_game.py は強制終了してしまった…。それ以外のサンプルは、全部動いた。
同梱のリソースエディタ(ドットエディタ+サウンドエディタ)、pyxeleditor も動かしてみたけれど、これはかなり重かった。CPU負荷がずっと100%のままで、マウスカーソルの動きもガクガク。ちょっと実用にはならないかもしれない。CPUコアを複数持っている Raspberry Pi で動かせばスイスイと動くのかもしれんけど、1コアの Zero系で使うのは少々厳しい気配。
◎ 雑感。 :
gcc 9 を導入したり、OpenGL を有効にしたり等、ちょっと色々やらないといけない部分はあるけれど。一通り設定できれば、ハードウェアスペック面では非力と思われている Raspberry Pi Zero W 上でも、Python + Pyxel を使えば結構滑らかに動くゲームを作れそうだなと分かった。
ただ、gcc 9 の導入が、ちょっと気になる。この作業をしたことで、ライブラリのパスを弄ってしまっただろうし、他の何かしらのビルド時に問題が出てきたりはしないのだろうか…。そのあたりがちょっと不安。
ただ、gcc 9 の導入が、ちょっと気になる。この作業をしたことで、ライブラリのパスを弄ってしまっただろうし、他の何かしらのビルド時に問題が出てきたりはしないのだろうか…。そのあたりがちょっと不安。
[ ツッコむ ]
以上です。