2017/09/14(木) [n年前の日記]
#1 [pi3d][python][raspberrypi] pi3dで画像を表示する。その2
pi3d で画像を表示できたけど、只の静止画状態では今一つなので試しに動かしてみたり。
_imagesprite3.py
_ufo.png
_DXRubyでインチキ多関節を試してみる をpi3dでもやってみた、みたいな。
_imagesprite3.py
_ufo.png
u""" pi3d ImageSprite sample. スプライトを描画するサンプル。 透視投影で描画しつつグネグネ動かす。 ESCキーで終了する。 Windows10 x64 + Python 2.7.12 32bit + pi3d 2.20 """ from __future__ import absolute_import from __future__ import division from __future__ import print_function from __future__ import unicode_literals from math import radians from math import sin import pi3d # ウインドウ生成 display = pi3d.Display.create(w=640, h=480, frames_per_second=60) # シェーダーを生成。uv_flatは照明関係の計算をしない。 shader = pi3d.Shader("uv_flat") # カメラを透視投影に camera = pi3d.Camera(is_3d=True) # テクスチャを読み込み tex = pi3d.Texture("ufo.png") # スプライトをたくさん生成 sprs = [] num = 30 for i in range(num): spr = pi3d.ImageSprite(tex, shader, w=10.0, h=10.0) sprs.append(spr) # キーボード取得用クラスを生成 keys = pi3d.Keyboard() bs_z = 50.0 x_ang, y_ang, z_ang = 0.0, 0.0, 0.0 # メインループ while display.loop_running(): x_ang = (x_ang + 3.0) % 360.0 y_ang = (y_ang + 4.0) % 360.0 z_ang = (z_ang + 2.2) % 360.0 # 先っぽ tx = 0.0 ty = 0.0 tz = 30.0 * sin(radians(z_ang)) + bs_z # 根元 bx = 0.0 by = 0.0 bz = tz + 200.0 dx = (tx - bx) / num dy = (ty - by) / num dz = (tz - bz) / num for i, spr in enumerate(sprs): x = bx + (dx * i) + (15.0 * sin(radians(x_ang + (10.0 * i)))) y = by + (dy * i) + (12.0 * sin(radians(y_ang + (25.0 * i)))) z = bz + (dz * i) spr.position(x, y, z) # スプライトの座標を設定 spr.draw() # スプライトを描画 if keys.read() == 27: # ESCキーが押されたらループを抜けて終了 keys.close() display.destroy() break
_DXRubyでインチキ多関節を試してみる をpi3dでもやってみた、みたいな。
◎ Raspberry Pi Zero W上で動かしてみたのだけど。 :
上記のソレは Windows10 上で動かした場合の結果だけど、試しに Raspberry Pi Zero W上で動かしたら、とんでもなく遅かった…。まさかここまで遅くなるとは…。ちゃんと測ってないけど、5〜6FPSしか出てないんじゃないかなあ…。
スプライト枚数を減らして動作確認してみたら、減らせば減らしただけフレームレートが改善されていったので、どうも大量に描画するのは厳しいみたいだなと。…この程度で息も絶え絶えでは困るんだけど。
ただ、 _pi3d_demos/SpriteBalls.py を動かすと、大量に画像が表示されてるのに、40FPS以上は出てるし…。工夫次第でどうにかなる可能性もありそうな。
スプライト枚数を減らして動作確認してみたら、減らせば減らしただけフレームレートが改善されていったので、どうも大量に描画するのは厳しいみたいだなと。…この程度で息も絶え絶えでは困るんだけど。
ただ、 _pi3d_demos/SpriteBalls.py を動かすと、大量に画像が表示されてるのに、40FPS以上は出てるし…。工夫次第でどうにかなる可能性もありそうな。
◎ 画像の代わりに球を出してみた。 :
もしや画像を描画すると遅くなるのかなと疑問が湧いたので、試しに ImageSprite ではなく Sphere にして、Zero W上で動作確認してみたり。
_spheres.py
残念ながら、見た目でほとんど変わらなかった。やっぱり遅い…。遅過ぎる…。
ということは、描画しようとしてるオブジェクトの種類に関係なく、とにかく大量に出した時点で遅くなるようだなと…。大量と言っても、この場合、30個程度なんだけどなあ。ファミコンですらスプライト64枚、MSXですら32枚だった(らしい)のに…。
オブジェクトの発生個数や座標計算のあたりはそのままにして、描画する個数のみを1〜3個にしてみたところ、滑らかに動いた。ということは…描画で処理落ちしちゃってるのだな…。
_spheres.py
残念ながら、見た目でほとんど変わらなかった。やっぱり遅い…。遅過ぎる…。
ということは、描画しようとしてるオブジェクトの種類に関係なく、とにかく大量に出した時点で遅くなるようだなと…。大量と言っても、この場合、30個程度なんだけどなあ。ファミコンですらスプライト64枚、MSXですら32枚だった(らしい)のに…。
オブジェクトの発生個数や座標計算のあたりはそのままにして、描画する個数のみを1〜3個にしてみたところ、滑らかに動いた。ということは…描画で処理落ちしちゃってるのだな…。
[ ツッコむ ]
以上、1 日分です。