mieki256's diary



2017/09/14(木) [n年前の日記]

#1 [pi3d][python][raspberrypi] pi3dで画像を表示する。その2

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以上は出てるし…。工夫次第でどうにかなる可能性もありそうな。

画像の代わりに球を出してみた。 :

もしや画像を描画すると遅くなるのかなと疑問が湧いたので、試しに ImageSprite ではなく Sphere にして、Zero W上で動作確認してみたり。

_spheres.py

残念ながら、見た目でほとんど変わらなかった。やっぱり遅い…。遅過ぎる…。

ということは、描画しようとしてるオブジェクトの種類に関係なく、とにかく大量に出した時点で遅くなるようだなと…。大量と言っても、この場合、30個程度なんだけどなあ。ファミコンですらスプライト64枚、MSXですら32枚だった(らしい)のに…。

オブジェクトの発生個数や座標計算のあたりはそのままにして、描画する個数のみを1〜3個にしてみたところ、滑らかに動いた。ということは…描画で処理落ちしちゃってるのだな…。

以上、1 日分です。

過去ログ表示

Prev - 2017/09 - 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 29 30

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project