mieki256's diary



2017/04/22() [n年前の日記]

#1 [python] pygame_sdl2について調べてるけど

_pygame_sdl2 について調べてるけど、さっぱり分からんなと…。Windows上にインストールする方法すら分からない…。ちなみに手元の環境は Windows10 x64 + Python 2.7.13 32bit版。

_http://nightly.renpy.org/pygame_sdl2/ に「Nightly builds が置いてあるよ」と書かれてるけど、404で。

_Index of /pygame_sdl2/current/ (Internet Archive) には2016/07/09版のリストがあったけど、.whlファイルそのものは残ってない模様。残念。

_Lemma Soft Forums - View topic - Can't install pygame_SDL2 によると、「Ren'PyのSDKを落とせば中に pygame_sdl2 も入ってる」と書いてあるような…。

_Ren'Py 6.99.12 からSDKのzipをDLして中を覗いてみたけど、たしかに SDL2.dll だの pygame_sdl2 なるフォルダが入ってる、が、前述のやり取りでは「ソレを取り出したけどやっぱり動かないんですけど」みたいなことが書かれてるようでもあり。

ビルドとやらをするしかないのかな…。ハードル高いな…。こんなんじゃ「たーのしー!」とか全然言えないよな…。

ビルド云々について調べる。 :

_renpy/pygame_sdl2_windeps: Windows dependencies for pygame_sdl2. に、pygame_sdl2 をWindows上でビルドする際に必要になるファイル群があるよ、てな話も見かけた。ていうか pygame_sdl2 の README.md に書いてあるな…。一覧を眺めると、 _pygame_sdl2_windeps/lib/x86 のあたりに SDL2.dll や SDL2_image.dll が入ってるようで。

ビルドするには、使ってるPythonのバージョンと合ってる Visual Studio が必要、とも書いてある…。

自分が使ってるのは Python 2.7 だけど…。 _WindowsCompilers - Python Wiki を眺めた感じでは、
  • Python 2.6 〜 3.2 までは Visual C++ 9.0。
  • Python 3.3 と 3.4 は Visual C++ 10.0。
  • Python 3.5 と 3.6 は Visual C++ 14.0。
と書いてあるから…。Python 2.7用の pygame_sdl2 をビルドするには Visual C++ 9.0 が必要、ってことになるのかな。「Visual Studio 2008 をインストールする必要は無い」って書いてあるけど…Express版は使えないのだろうか。 _Microsoft Visual C++ - Wikipedia を眺めると、一応 Visual C++ 2008 Express に入ってるみたいだけど…。

むむ? よく見たら、 _Microsoft Visual C++ Compiler for Python 2.7 てのが用意されてるのか。Python用のアレコレをビルドするための環境がMicrosoftのサイトから正式に入手できるとは…。嘘だろ。マジかよ。Microsoft、やるなあ。 _Windows での Python 2.7, 3.4, 3.5 の拡張モジュールビルド環境 - Qiita によると去年から用意してくれたらしい。Microsoft、凄いぞ。素晴らしい。いや、ちょっとコレ、 _ヤンキー効果 が入ってる気もするけど…。でも、スゴイ。Microsoft、グッジョブ。

とりあえず Visual C++ Compiler for Python 2.7 を Windows10上でインストール。スタートメニューに「Microsoft Visual C++ Compiler Package for Python 2.7」というフォルダが出来て、ショートカットが登録された。「Visual C++ 2008 32-bit Command Prompt」を実行。DOS窓が開いた。
>where cl
C:\Users\ユーザアカウント名\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\bin\cl.exe
このへんにインストールされたのか…。「インストールしたユーザしか使えないよ」って感じかな…。 *1

cl /?
と打つと、色々出てくる。

とりあえず、この Visual C++ のコンパイラを使いたい時は、「Visual C++ 2008 *-bit Command Prompt」を実行してDOS窓開いてそこで作業すべし、ということらしい。

_Microsoft Visual C++ Compiler for Python 2.7はひとのためならず | site-hhs を参考に、 _lru-dict とやらをビルドすることで動作確認。lru-dict-1.1.6.tar.gz をDLして解凍して中に入って python setup.py build と打ったら、buildというフォルダが作られて中に色々なファイルが作られた。どうやらちゃんと使えそうな予感。

Nightly buildsがあるっぽい。 :

ここまで調べといてなんだけど。色々見ていたら、 _Unavailable nightly builds - Issue #66 - renpy/pygame_sdl2 で、「Nightly buildsは _http://nightly.renpy.org/current/ の一番上にあるよ」てな話が…。しかし、DLして中を覗いたけどバイナリが入ってるようには見えなかった。何だろう、コレは…。

githubからcloneしてビルドに挑戦してみる。 :

pygame_sdl2 がビルドできそうなのか、ダメ元でやってみる。再度書いておくけど、環境は Windows10 x64 + Python 2.7.13 32bit版。

「Visual C++ 2008 32-bit Command Prompt」を実行して、DOS窓を開いて…。

そのままだと C:\WINDOWS\system32\ というWindowsのシステム的に大変恐ろしい場所に居るので、cd でどこか問題無さげな場所に移動して。…Cドライブのルートにtempフォルダでも作ってそこに行こうかな。
mkdir C:\temp
cd C:\temp

適当なフォルダを作って、中に入って。
mkdir pygame_sdl2
cd pygame_sdl2

git clone で github からソース群をDL。git を使うので、git がインストールされてる必要有。もっとも、githubのページからzipをDLして解凍するのもアリかもしれんけど。
git clone https://github.com/renpy/pygame_sdl2.git

pygame_sdl2 というフォルダが作られた。中に入って、ファイルを確認。
cd pygame_sdl2
dir
色々なファイルがDLされた模様。Python でビルドやインストールに使われるらしい setup.py というファイルも見える。

ビルド時に必要になるという、pygame_sdl2_windeps も git clone でDL。
git clone https://github.com/renpy/pygame_sdl2_windeps
dir と打って確認すると、pygame_sdl2_windeps というフォルダが作られてる。中にはビルドに必要な色んなファイルが入ってるらしい。

いきなりインストールするのは怖いので、まずはビルドだけ試してみる。
python setup.py build

エラーが出た。cython がねえよ、って怒られてるような?

_Why don't have yet a release in PyPI? - Issue #39 - renpy/pygame_sdl2 によると、「Cythonをインストールしろや」って書かれてるな…。Cythonって何ですか?

_深入りしないCython入門 - Qiita
Pythonは処理速度は決して早くない、むしろ遅い部類である。 そこで、C/C++に変換することにより高速化しようというのがCythonである。

深入りしないCython入門 - Qiita より

そういうものらしい。

_WindowsでもCythonを使えるようにする。 - Qiita でインストール方法が紹介されてた。pip install でイケるらしい。
pip install cython
たぶんこれでインストールされたんじゃないかな。

もう一度ビルドにチャレンジ。
python setup.py build
警告がガンガン出てるけど、なんだかずらずらと表示しながら処理が進んでるっぽい…。ていうか、Windows上でやってるのに、
sh: sdl2-config: command not found
とか出てるけど、大丈夫なの? 自分の環境は mingw をインストールしているから sh.exe も入ってるけどさ…。

とりあえず、処理が終わったっぽい。build というフォルダが作成されて、中に色々なファイルが入ってた。SDL2.dll等のファイルも見える。

一応ビルドが通ったように見えなくもないし…。怖いけど…インストールしてみるか…。
python setup.py install
Python2.7インストールフォルダ\Lib\site-packages\ の中に、pygame_sdl2-2.1.0-py2.7-win32.egg というフォルダが作られて、中に色々入った、ようではある。

ここまでできたということは…。wheelパッケージとやらも作れるのだろうか?

_Python: Wheel でパッケージを配布する | CUBE SUGAR STORAGE によると、
python setup.py bdist_wheel
で作れるっぽいけど…。でも、site-packages\ の中は 〜.egg というフォルダが作られているんだよな…。

試してみたら、dist というフォルダの中に、 _pygame_sdl2-2.1.0-cp27-cp27m-win32.whl というファイルができていた。コレを使ってインストールできるのかしら。一応置いときます。手元の環境では pip install 〜.whl でインストールできたけど、他の環境でインストールできるかどうかは不明。

サンプルは無いのかな。 :

動作確認してみたいのだけど、どこかにサンプルは無いのかな?

_renpytom/rapt-pygame-example: Example of using RAPT to package Pygame(_sdl2) games. で、Android版のサンプルは公開されてるようだけど…。

_rapt-pygame-example/main.py を眺めると、最初のあたりで、
import pygame_sdl2
pygame_sdl2.import_as_pygame()

import pygame
みたいな感じで書いとけば、pygame_sdl2 が使われるっぽい。

_ウィンドウを表示する - 人工知能に関する断創録 を参考に、ウインドウを表示するだけのスクリプトを書いてみたり。

_helloworld_pygame_sdl2.py
# pygame_sdl2 test. window display only

import pygame_sdl2
pygame_sdl2.import_as_pygame()

import pygame
from pygame.locals import *
import os

SCREEN_SIZE = (640, 480)

def main():
    pygame.init()
    screen = pygame.display.set_mode( SCREEN_SIZE )
    pygame.display.set_caption('Hello pygame_sdl2')

    while True:
        screen.fill((0, 0, 255))  # screen fill Blue
        pygame.display.update()
        
        for event in pygame.event.get():  # check event
            if event.type == QUIT:
                return
            if (event.type == KEYDOWN and
                event.key  == K_ESCAPE):  # push Escape key ?
                return

if __name__ == '__main__':
    main()

helloworld_pygame_sdl2_ss.png

一応動いたことは動いた、ような気がする。しかしコレだけでは見た目が pygame と変わらん…。何をどうしたら pygame_sdl2 で動いてるってことが分かるのやら。

画像描画を試してみたり。 :

画像ファイルを読んで描画する処理を試してみたり。

_draw_image.py
_ufo.png
_bg.png
# draw image by pygame_sdl2

try:
    import pygame_sdl2
    pygame_sdl2.import_as_pygame()
except:
    print "pygame_sdl2 not available"

import pygame
import pygame.image
# from pygame.locals import *

SCREEN_SIZE = (640, 480)

def main():
    pygame.init()
    screen = pygame.display.set_mode( SCREEN_SIZE, pygame.HWSURFACE | pygame.DOUBLEBUF )
    pygame.display.set_caption('draw image by pygame_sdl2')

    sysfont = pygame.font.SysFont(None, 64)
    textsurface = sysfont.render("Hello world", True, (255, 255, 255))
    
    bg = pygame.image.load('bg.png').convert()
    image = pygame.image.load('ufo.png').convert_alpha()

    x = 10
    y = 10
    dx = 2
    dy = 1
    bgx = 0
    clock = pygame.time.Clock()
    cnt = 0

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return
            if (event.type == pygame.KEYDOWN and event.key  == pygame.K_ESCAPE):
                return

        if x + dx < 0 or x + dx + image.get_width() >= SCREEN_SIZE[0]:
            dx *= -1
        if y + dy < 0 or y + dy + image.get_height() >= SCREEN_SIZE[1]:
            dy *= -1
        x += dx
        y += dy
        bgx -= 3
        if bgx < -640:
            bgx = 0
        
        # draw bg image
        screen.blit(bg, (bgx,0))
        screen.blit(bg, (bgx + SCREEN_SIZE[0],0))
        
        screen.blit(image, (x, y))        # draw image
        screen.blit(textsurface, (0, 0))  # draw text image
        
        # pygame.display.update()
        pygame.display.flip()
        
        clock.tick(60)  # 60fps
        
        cnt += 1
        if cnt % 180 == 0:
            print str(clock.get_fps()) + " FPS"

if __name__ == '__main__':
    main()

draw_image_ss.png

一応描画されたが、妙なメッセージが表示される。
> python draw_image.py
libpng warning: iCCP: known incorrect sRGB profile

libpng のバグ(?)らしい。

_Libpng errors - ArchWiki
_Cocos Studioで生成した.csbをcocos2d-xに読み込んだ際に"libpng warning: iCCP: known incorrect sRGB profile" - Qiita
_dvipdfmxで「warning: iCCP: known incorrect sRGB profile」というエラーが出る場合の対処方法 - Qiita

ImageMagickの convert を使って画像ファイル内から余計な情報を削除せよ、とのこと。
convert -strip input_file output_file

しかし、ImageMagick 7.0.3-2 の magick.exe を使ったら上記のオプションが反応しなかった。ImageMagick 6.9.1-10 の convert なら処理してくれたのだけど…。

書き方がいかんかったらしい。以下の書き方をしたら処理してくれた。
magick input_file -strip output_file

そもそもSDL2って何だろう。 :

SDL1.2 に比べて SDL2 は何が違っているのだろう。

_SDL2の使い方 - mirichiの日記
_SDL2で出来る事メモごく一部 - nyaocatのがんばるブログ
_SDL 2.0と1.2に関するメモ
_SDL 1.2から2.0への移行
_SDL2の紹介

色々変わったらしいが…とにかく描画が速くなった、と思っておけばいいのかな。

pygameよりpygame_sdl2のほうが遅いらしい。 :

_Pygame_SDL2 runs slower when large quantity of sprites are drawn - Issue #36 - renpy/pygame_sdl2 で気になる話が。pygameよりpygame_sdl2のほうが遅いらしい…。

ここまで試したのに、なんじゃそりゃって感じ…。

でもまあ、おかげで Microsoft Visual C++ Compiler for Python 2.7 の存在を知ることができたのは幸いというか。

*1: 一応、ダウンロードページの下のほうに、「全ユーザで使える状態にしたいならオプションを指定してインストールすればできるよ」と書いてある。

以上、1 日分です。

過去ログ表示

Prev - 2017/04 - 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