2017/10/30(月) [n年前の日記]
#1 [prog][golang] Windows10 x64上で Mingw-builds版を使って go-sdl2をインストール
go-sdl2 は、golang(Go言語)からSDL2を操って、画像描画等ができるライブラリ。
_veandco/go-sdl2: SDL2 binding for Go
昨日は、Windows10 x64 + MSYS2 で go-sdl2 をインストールしてみたけれど。go-sdl2 の README.md には、Mingw-builds とやらを使ってインストールする方法が書いてある。それに従ってインストール作業をしてみたり。
_veandco/go-sdl2: SDL2 binding for Go
昨日は、Windows10 x64 + MSYS2 で go-sdl2 をインストールしてみたけれど。go-sdl2 の README.md には、Mingw-builds とやらを使ってインストールする方法が書いてある。それに従ってインストール作業をしてみたり。
◎ Mingw-builds版の mingw をインストール。 :
以下のページから辿って、mingw-w64-install.exe をDLして実行。
_Mingw-builds [mingw-w64]
インストールする mingw のタイプを尋ねてくるので…。
以下を選んでNEXTボタンを押す。
次にインストール場所を尋ねてくるけど。
自分の場合は以下にした。
それぞれ、以下のような指定らしい。
_Qt で MinGW-w64 を使用する際に必要になるスレッドモデルと例外機構の選択について | cutlassfish
_Mingw-builds [mingw-w64]
インストールする mingw のタイプを尋ねてくるので…。
以下を選んでNEXTボタンを押す。
- Version : 7.2.0
- Architecture : 64bit版なら x86_64 / 32bit版なら i686
- Threads : win32
- Exception : 64bit版なら seh / 32bit版なら dwarf
- Build revision : 0
次にインストール場所を尋ねてくるけど。
自分の場合は以下にした。
- 64bit版インストール場所 : D:\mingw-w64\x86_64-7.2.0-win32-seh-rt_v5-rev0
- 32bit版インストール場所 : D:\mingw-w64\i686-7.2.0-win32-dwarf-rt_v5-rev0
それぞれ、以下のような指定らしい。
- Architecture : 32bit版 = i686 / 64bit版 = x86_64
- Threads : win32 = 単独で動くバイナリを作れるけど一部機能が使えない。
- Threads : posix = libwinpthread-1.dll を必要とするし遅いけど機能は網羅されてるらしい。
- Exception : 例外関係。 seh > dwarf > sjlj の順で速いらしい?
_Qt で MinGW-w64 を使用する際に必要になるスレッドモデルと例外機構の選択について | cutlassfish
◎ go-sdl2のビルドに必要なSDL2関連ファイルを入手。 :
以下を参考にして、SDL2関連ファイルを入手する。
_go-sdl2-tut/windows.md at master - vinzBad/go-sdl2-tut
必要なのは、ランタイムバイナリと、Developmentライブラリ。32bit版なら x86 を、64bit版なら x64 をDLする。
_Simple DirectMedia Layer - SDL version 2.0.7 (stable)
_SDL_image 2.0
_SDL_mixer 2.0
_SDL_ttf 2.0
_go-sdl2-tut/windows.md at master - vinzBad/go-sdl2-tut
必要なのは、ランタイムバイナリと、Developmentライブラリ。32bit版なら x86 を、64bit版なら x64 をDLする。
_Simple DirectMedia Layer - SDL version 2.0.7 (stable)
SDL2-2.0.7-win32-x64.zip SDL2-2.0.7-win32-x86.zip SDL2-devel-2.0.7-mingw.tar.gz
_SDL_image 2.0
SDL2_image-2.0.2-win32-x64.zip SDL2_image-2.0.2-win32-x86.zip SDL2_image-devel-2.0.2-mingw.tar.gz
_SDL_mixer 2.0
SDL2_mixer-2.0.2-win32-x64.zip SDL2_mixer-2.0.2-win32-x86.zip SDL2_mixer-devel-2.0.2-mingw.tar.gz
_SDL_ttf 2.0
SDL2_ttf-2.0.14-win32-x64.zip SDL2_ttf-2.0.14-win32-x86.zip SDL2_ttf-devel-2.0.14-mingw.tar.gz
◎ SDL2関連ファイルを所定の場所にコピー。 :
ランタイムバイナリを解凍する。中に .dll が入っているので、以下にコピーする。
Developmentライブラリ(*-devel-*とついてるファイル)を解凍する。それぞれ、中に、以下のフォルダがあるので…。
64bit版 : D:\mingw-w64\x86_64-7.2.0-win32-seh-rt_v5-rev0\mingw64\bin 32bit版 : D:\mingw-w64\i686-7.2.0-win32-dwarf-rt_v5-rev0\mingw32\bin
Developmentライブラリ(*-devel-*とついてるファイル)を解凍する。それぞれ、中に、以下のフォルダがあるので…。
x86_64-w64-mingw32 i686-w64-mingw32
- 64bit版なら、x86_64 とついてるほうの中身(bin, include, lib, share等)を、
- 32bit版なら、i686 とついてるほうの中身(bin, include, lib, share等)を、
64bit版 : D:\mingw-w64\x86_64-7.2.0-win32-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32 32bit版 : D:\mingw-w64\i686-7.2.0-win32-dwarf-rt_v5-rev0\mingw32\i686-w64-mingw32上記フォルダ内にも、bin, include, lib があるので、フォルダ名が一致するようにコピーしていけばいい。
◎ 環境変数PATHを設定。 :
Windowsの環境変数PATHに、mingw-w64関係のPATHを2つ追加して、gcc等が使える状態にする。
PATHの先頭に追加しておいたほうがいいけれど…。他のアレコレと衝突しそうなので、今回はbatファイルを作成して、mingw-w64関係を使いたいときだけDOS窓上でそのbatファイルを実行してから作業する、ということにした。
mingww64.bat
64bit版は、環境変数 GOARCH=amd64 のままでいいけど、32bit版は、環境変数 GOARCH=386 を指定したほうがいいのだろうか…? とりあえず、go env で、現在のgo関係の環境変数を確認できる。
64bit版 D:\mingw-w64\x86_64-7.2.0-win32-seh-rt_v5-rev0\mingw64\bin D:\mingw-w64\x86_64-7.2.0-win32-seh-rt_v5-rev0\mingw64\x86_64-w64-mingw32\bin 32bit版 D:\mingw-w64\i686-7.2.0-win32-dwarf-rt_v5-rev0\mingw32\bin D:\mingw-w64\i686-7.2.0-win32-dwarf-rt_v5-rev0\mingw32\i686-w64-mingw32\bin
PATHの先頭に追加しておいたほうがいいけれど…。他のアレコレと衝突しそうなので、今回はbatファイルを作成して、mingw-w64関係を使いたいときだけDOS窓上でそのbatファイルを実行してから作業する、ということにした。
mingww64.bat
@echo # MinGW-w64 (Mingw-builds, MSYS, 64bit) enable @set MINGW_PATH=D:\mingw-w64\x86_64-7.2.0-win32-seh-rt_v5-rev0\mingw64 @set MINGW32_PATH=%MINGW_PATH%\x86_64-w64-mingw32 @set PATH=%MINGW_PATH%\bin;%MINGW32_PATH%\bin;%PATH% @echo add path %MINGW_PATH%\bin @echo add path %MINGW32_PATH%\bin set GOOS=windows set GOARCH=amd64
64bit版は、環境変数 GOARCH=amd64 のままでいいけど、32bit版は、環境変数 GOARCH=386 を指定したほうがいいのだろうか…? とりあえず、go env で、現在のgo関係の環境変数を確認できる。
◎ go-sdl2 をインストール。 :
DOS窓を開いて、前述のbatファイルを実行。環境変数PATHに先ほどインストールした MinGW のソレが追加されたので、gcc 等が使えるようになってるはず。gcc -v でバージョン確認ができる。
これでようやく、go-sdl2 がインストールできるる。
go-sdl2 がインストールされたフォルダに、examples というフォルダがあるから、その中の events/events.go を実行すると動作確認ができる。
同じように、go-sdl2 の他のアレコレもインストール。
この状態なら、golang でビルドした .exe が動いてくれた。まあ、SDL2関連のdllにPATHが通っていれば、だけど。
ちなみに .exe を作るのは…。go build hoge.go みたいな感じで打てばいい。
32bit版として go-sdl2 をインストール・利用する場合は…。手元の環境では、golang 64bit版を使って go-sdl2 をインストールすることはできなかったけれど、golang 32bit版を別途インストールして試してみたらインストールすることができた。
これでようやく、go-sdl2 がインストールできるる。
go get -v github.com/veandco/go-sdl2/sdlエラーが出なければインストールできてる。はず。
go-sdl2 がインストールされたフォルダに、examples というフォルダがあるから、その中の events/events.go を実行すると動作確認ができる。
cd %GOPATH%\src\github.com\veandco\go-sdl2\examples\events go run events.goマウスカーソルを動かしたら、座標値がずらずらと表示された。
同じように、go-sdl2 の他のアレコレもインストール。
go get -v github.com/veandco/go-sdl2/mix go get -v github.com/veandco/go-sdl2/img go get -v github.com/veandco/go-sdl2/ttf
この状態なら、golang でビルドした .exe が動いてくれた。まあ、SDL2関連のdllにPATHが通っていれば、だけど。
ちなみに .exe を作るのは…。go build hoge.go みたいな感じで打てばいい。
32bit版として go-sdl2 をインストール・利用する場合は…。手元の環境では、golang 64bit版を使って go-sdl2 をインストールすることはできなかったけれど、golang 32bit版を別途インストールして試してみたらインストールすることができた。
◎ gopherrunが終了時にエラーを出す件。 :
以下で紹介・公開されてる gopherrun というソレをビルドして動作確認したものの、終了時にエラーが出て悩んでたのだけど。
_Golang と SDL2 でゲームを作る - KaoriYa
_koron/gopherrun
ジャンプSEとして使われてる jump07.mp3 を ogg に変換して使うようにしてみたら、終了時にエラーが出なくなった。どうやら go-sdl2 は、というより SDL2 は、ogg の使用が推奨っぽいなと…。
_Golang と SDL2 でゲームを作る - KaoriYa
_koron/gopherrun
ジャンプSEとして使われてる jump07.mp3 を ogg に変換して使うようにしてみたら、終了時にエラーが出なくなった。どうやら go-sdl2 は、というより SDL2 は、ogg の使用が推奨っぽいなと…。
◎ 余談。mp3は筋が良くない。 :
余談だけど。そもそも mp3 をゲームの類で使うのは、あまり筋が良くないと自分は思っていたりして。
元々 mp3というフォーマットは、映像と一緒に使うことを前提にして作られた音声フォーマットだから、音声データがフレーム単位で記録されていて。故に、音声の実際の長さとフレーム単位のソレが合わなくてギャップ(無音部分)が含まれてしまうことが多いわけで。
そのあたりを解決すべく、例えば Adobe Flash などは、wav を放り込むと一見mp3に変換してるように見えながら独自情報もどこかに持っていてmp3をゴニョゴニョしながら再生してたので、何万円もする Adobe Flash CSx を買わなきゃループBGMを流すことすら難しかった(時期がある)し。 *1 lameなどは変換時にメタ情報としてギャップ情報を含めておくことで「再生側でイイ感じに処理してくれよな…後は…任せた…俺がやってやれるのはここまでだ…」というお約束にして誤魔化してたわけで。
しかも mp3 は、昔は特許が絡んできたので、使用にあたってはライセンス面でちと問題があったりして。いやまあ、 _ついこないだ特許が切れた ようではあるけれど。
それを考えると、後発故にフレーム単位などという縛りもなく、しかもライセンス面で問題ナサゲな ogg (Ogg Vorbis)を使ったほうがいいだろうと。てなわけで、ゲームの類で不可逆圧縮音声データを扱うなら、よほどの理由がない限りmp3よりoggだよなあ、と。しかしこれが、ブラウザの対応状況を鑑みたりすると、また面倒臭い状態に…。
元々 mp3というフォーマットは、映像と一緒に使うことを前提にして作られた音声フォーマットだから、音声データがフレーム単位で記録されていて。故に、音声の実際の長さとフレーム単位のソレが合わなくてギャップ(無音部分)が含まれてしまうことが多いわけで。
そのあたりを解決すべく、例えば Adobe Flash などは、wav を放り込むと一見mp3に変換してるように見えながら独自情報もどこかに持っていてmp3をゴニョゴニョしながら再生してたので、何万円もする Adobe Flash CSx を買わなきゃループBGMを流すことすら難しかった(時期がある)し。 *1 lameなどは変換時にメタ情報としてギャップ情報を含めておくことで「再生側でイイ感じに処理してくれよな…後は…任せた…俺がやってやれるのはここまでだ…」というお約束にして誤魔化してたわけで。
しかも mp3 は、昔は特許が絡んできたので、使用にあたってはライセンス面でちと問題があったりして。いやまあ、 _ついこないだ特許が切れた ようではあるけれど。
それを考えると、後発故にフレーム単位などという縛りもなく、しかもライセンス面で問題ナサゲな ogg (Ogg Vorbis)を使ったほうがいいだろうと。てなわけで、ゲームの類で不可逆圧縮音声データを扱うなら、よほどの理由がない限りmp3よりoggだよなあ、と。しかしこれが、ブラウザの対応状況を鑑みたりすると、また面倒臭い状態に…。
*1: もっとも、後のほうになるとFlash Player側で改良されたのか、lameで変換したmp3もギャップレス再生できるようになっていた…ような記憶が。
[ ツッコむ ]
以上、1 日分です。