mieki256's diary



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 上でビルド・インストールしてみる。

インストール手順。 :

前述のページの中に、Raspberry Pi に導入するときの手順が書いてあるので、ソレに従って作業。~/ 以下に git clone して作業してみる。
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 のコンパイルでエラーが出る。

$ 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 を修正する。
$ 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).so
linux向けの処理をする際に、g++ ではなく g++-9.1 を使うようにするらしい。

再度、Pyxel をビルド。
cd ~/pyxel
make -C pyxel/core clean all
pip3 install .
ビルドができて、インストールもできた。

Pyxelサンプルファイルのインストール。 :

~/.local/bin/ 以下に、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 を編集。
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系で使うのは少々厳しい気配。

雑感。 :

gcc 9 を導入したり、OpenGL を有効にしたり等、ちょっと色々やらないといけない部分はあるけれど。一通り設定できれば、ハードウェアスペック面では非力と思われている Raspberry Pi Zero W 上でも、Python + Pyxel を使えば結構滑らかに動くゲームを作れそうだなと分かった。

ただ、gcc 9 の導入が、ちょっと気になる。この作業をしたことで、ライブラリのパスを弄ってしまっただろうし、他の何かしらのビルド時に問題が出てきたりはしないのだろうか…。そのあたりがちょっと不安。

以上です。

過去ログ表示

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