2016/12/11(日) [n年前の日記]
#1 [ruby][gosu] WIndows上で Ruby + Gosu を試してみたり
_Ruby
というプログラミング言語を使って2Dゲームが作れるようになる
_Gosu
というライブラリがあるそうで。クロスプラットフォーム対応ライブラリ、つまりは Windows、Mac、Linux、どのOSでも動くライブラリなのだとか。
Windows に特化した2Dゲーム制作ライブラリなら _DXRuby があるけれど。DXRubyは、Windows の DirectX という機能を呼び出しているから、裏技(?)を使わないと Mac や Linux では動かない。もし、「Mac や Linux でも動くゲームを作ってみたいな」と思った時は、Gosu が選択肢に入ってくるのかもしれないなと。
ということで、数日前に Windows上で Gosu を少し触ってたのだけど。せっかくだからメモをまとめておいたほうがいいよなと思えてきたので、こうしてメモしておくのです。
環境は、Windows 10 x64 + Ruby 2.2.6 p396 mingw32版 + gosu 0.10.8 x86-mingw32版。
Windows に特化した2Dゲーム制作ライブラリなら _DXRuby があるけれど。DXRubyは、Windows の DirectX という機能を呼び出しているから、裏技(?)を使わないと Mac や Linux では動かない。もし、「Mac や Linux でも動くゲームを作ってみたいな」と思った時は、Gosu が選択肢に入ってくるのかもしれないなと。
ということで、数日前に Windows上で Gosu を少し触ってたのだけど。せっかくだからメモをまとめておいたほうがいいよなと思えてきたので、こうしてメモしておくのです。
環境は、Windows 10 x64 + Ruby 2.2.6 p396 mingw32版 + gosu 0.10.8 x86-mingw32版。
◎ Rubyのインストール。 :
まずは Ruby をインストールしないと話にならない。
_RubyInstaller for Windows
という、Windows にインストールできる Ruby があるので、ソレを利用させてもらう。
_Downloads ページから、Ruby 2.2.6 (rubyinstaller-2.2.6.exe) か Ruby 2.3.3 (rubyinstaller-2.3.3.exe) をダウンロード。
ダウンロードした .exe を実行するとRubyのインストールができる。詳細は以下の解説記事を参考に。
_WindowsにRubyをインストールする(初心者向け) - Qiita
_はじめてのRuby環境構築 (Windows編その1) - Qiita
_Rubyダウンロード及びインストール | Rubyインストール
DOS窓(コマンドプロンプト)を開いて、ruby -v と打ち込むと、Rubyのバージョンが表示される。
DOS窓の開き方が分からない? いくつか開き方があるけれど…。
_Downloads ページから、Ruby 2.2.6 (rubyinstaller-2.2.6.exe) か Ruby 2.3.3 (rubyinstaller-2.3.3.exe) をダウンロード。
ダウンロードした .exe を実行するとRubyのインストールができる。詳細は以下の解説記事を参考に。
_WindowsにRubyをインストールする(初心者向け) - Qiita
_はじめてのRuby環境構築 (Windows編その1) - Qiita
_Rubyダウンロード及びインストール | Rubyインストール
DOS窓(コマンドプロンプト)を開いて、ruby -v と打ち込むと、Rubyのバージョンが表示される。
> ruby -v ruby 2.2.6p396 (2016-11-15 revision 56800) [i386-mingw32]バージョンが表示されたということは、インストールができたということ。
DOS窓の開き方が分からない? いくつか開き方があるけれど…。
- Win+Rキーを押して「cmd」と打ち込んでEnterキー。
- スタートボタンを右クリックして「コマンドプロンプト」を選択。(Windows8.1/10の場合)
- Cortanaに「cmd」と打ち込むと「コマンドプロンプト」が一覧に出てくるのでソレをクリック。(Windows10の場合)
◎ Gosuのインストール。 :
Ruby には、gem というライブラリ管理ツールがあって、インターネット経由でライブラリをダウンロードしてインストールしたり、簡単にアンインストールできたりする。
例えばDOS窓を開いて gem list と打ち込んでみれば、今現在インストールされてるライブラリの一覧が表示される。
この gem というツールを使えば gosu をインストールすることができる。以下を打ち込むだけ。
例えばDOS窓を開いて gem list と打ち込んでみれば、今現在インストールされてるライブラリの一覧が表示される。
> gem list *** LOCAL GEMS *** addressable (2.5.0) aozora (0.2.0) ast (2.3.0) astrolabe (1.3.1) (以下略)
この gem というツールを使えば gosu をインストールすることができる。以下を打ち込むだけ。
gem install gosu
> gem install gosu Fetching: gosu-0.10.8-x86-mingw32.gem (100%) Successfully installed gosu-0.10.8-x86-mingw32 Parsing documentation for gosu-0.10.8-x86-mingw32 Installing ri documentation for gosu-0.10.8-x86-mingw32 Done installing documentation for gosu after 1 seconds 1 gem installedインストールできた。
◎ Hello World. :
gosuを使って、まずはウインドウを表示してみる。以下のソースを書いた。
_helloworld.rb
実行してみる。
ウインドウが表示された。
これだけではさすがに何もできないので、せめて最低限、画像とテキストだけでも表示してみる。以下のソースを書いた。
_tmp_bg.png
_tmp_ufo.png
実行。
画像とテキストが表示された。
_helloworld.rb
require 'gosu' class MyWindow < Gosu::Window # コンストラクタ def initialize super 640, 480, false self.caption = 'Hello World!' end # 更新処理 def update end # 描画処理 def draw end end window = MyWindow.new window.show
実行してみる。
ruby helloworld.rb
ウインドウが表示された。
これだけではさすがに何もできないので、せめて最低限、画像とテキストだけでも表示してみる。以下のソースを書いた。
require 'gosu' class MyWindow < Gosu::Window # コンストラクタ def initialize super 640, 480, false self.caption = 'Hello World!' @font = Gosu::Font.new(32) # フォントを用意 @bg_img = Gosu::Image.new("tmp_bg.png", :tileable => true) # BG画像 @spr_img = Gosu::Image.new("tmp_ufo.png", :tileable => true) # スプライト画像 end # 更新処理 def update end # 描画処理 def draw @bg_img.draw(0, 0, 100) # BG描画 @spr_img.draw(320, 240, 200) # スプライト描画 @font.draw("Hello World", 10, 10, 300) # テキスト描画 end end window = MyWindow.new window.show使用した画像は以下。
_tmp_bg.png
_tmp_ufo.png
実行。
ruby helloworld2.rb
画像とテキストが表示された。
◎ 各行を解説。 :
Gosuのウインドウは、Gosu::Window というクラスを使えば作れるらしい。
ソースの最後のほうで、
Gosu::Window は、3つのメソッドを持つ。
毎フレーム、と書いてしまったけど、どのくらいの頻度で更新処理・描画処理がされるのか。Gosuは、デフォルト設定なら60FPSで処理するよ、ということになってるらしい。
ちなみに、FPSってのは、Frame Per Second の略。フレーム/秒。1秒間に何フレーム表示するか、という単位。60FPSってことは、1秒間に60回画面が書き換わるよ、ということ。
さて。画像の読み込みは、Gosu::Image.new() を使う。
扱える画像ファイルのフォーマットは、 _ドキュメント を眺めた感じだと、png画像とbmp画像は使えるようで。
画像の描画は、以下のように書く。
テキスト描画は、Gosu::Font.new() と draw() を使う。
_ドキュメント によると、フォントファイル(.ttf)を別途用意して、ソレを読み込んで使うこともできるらしい。
余談。Gosuを使うということは、クロスプラットフォームを意識してライブラリを選んだということだろうから…。もし、デフォルトフォントではなく、少し変わった見た目のオシャレなフォントを使いたいなら、OSインストール済みのフォントをあてにせず、別途、ttfファイルも同梱して配布したほうがいいでしょうな…。一応、Windows、Mac、Linuxで共通して使えるフォント種類を少し調べてみたのですけど、どのOSでも共通して使えるフォントって、ほとんど無いようで…。
とりあえず、画像を表示するところまではできたから、これで色々とやれるはず。
長くなってきたので、以降は別記事で。
class MyWindow < Gosu::Window (中略) endこれで、Gosu::Window を継承したクラスを作ってる。この中がメイン処理(?)になる。
ソースの最後のほうで、
window = MyWindow.new window.showとあるけれど。それぞれ、以下を指示している。
window = MyWindow.new # MyWindowクラスを生成してる window.show # 「ウインドウを表示しろ」と命令してる
Gosu::Window は、3つのメソッドを持つ。
- 初期化を担当する initialize()。(コンストラクタ)
- 毎フレームの更新処理を担当する update()。
- 毎フレームの描画処理を担当する draw()。
毎フレーム、と書いてしまったけど、どのくらいの頻度で更新処理・描画処理がされるのか。Gosuは、デフォルト設定なら60FPSで処理するよ、ということになってるらしい。
ちなみに、FPSってのは、Frame Per Second の略。フレーム/秒。1秒間に何フレーム表示するか、という単位。60FPSってことは、1秒間に60回画面が書き換わるよ、ということ。
さて。画像の読み込みは、Gosu::Image.new() を使う。
@img = Gosu::Image.new("画像ファイル名", :tileable => true):tileable って何じゃ? …画像の端をクッキリスパッとさせるなら true、隙間が入ってもいいなら false を指定するようで。例えば、BG(背景、Background)をタイルマップで描画したい時は、画像の端がクッキリしてないと隙間が入ってしまって見苦しいので、そんな時は true を指定すべし、とのこと。
扱える画像ファイルのフォーマットは、 _ドキュメント を眺めた感じだと、png画像とbmp画像は使えるようで。
- png画像はアルファチャンネルも反映してくれる。
- bmp画像の場合は、マゼンタ色(0xff00ff)を透明色として扱うぜ、と書いてあるように見えた。
画像の描画は、以下のように書く。
@img.draw(x, y, z)x, y は分かるとして、z は何だろう? …描画の優先順位らしい。z値が大きければ手前に描画されて、z値が小さければ奥に描画される。のかな。たぶん。
テキスト描画は、Gosu::Font.new() と draw() を使う。
# フォントを用意 @font = Gosu::Font.new(フォントサイズ)
# テキスト描画 @font.draw("描画したい文字列", x, y, z, x拡大率, y拡大率, 色指定)描画時の、拡大率と色指定は省略することもできるらしい。
_ドキュメント によると、フォントファイル(.ttf)を別途用意して、ソレを読み込んで使うこともできるらしい。
class MyWindow < Gosu::Window def initialize @font = Gosu::Font.new(self, "./LiberationMono-Bold.ttf", 22) end end
- フォント名の指定文字列内に「/」があったら、ttf読み込みを要求されてるものとして扱う。
- 「/」が無かったら、OSにインストール済みのフォント名を指定しているものとして扱う。
余談。Gosuを使うということは、クロスプラットフォームを意識してライブラリを選んだということだろうから…。もし、デフォルトフォントではなく、少し変わった見た目のオシャレなフォントを使いたいなら、OSインストール済みのフォントをあてにせず、別途、ttfファイルも同梱して配布したほうがいいでしょうな…。一応、Windows、Mac、Linuxで共通して使えるフォント種類を少し調べてみたのですけど、どのOSでも共通して使えるフォントって、ほとんど無いようで…。
とりあえず、画像を表示するところまではできたから、これで色々とやれるはず。
長くなってきたので、以降は別記事で。
◎ Gosuのサンプルスクリプトのインストールについて。 :
念のためにメモしとく。
Gosuのサンプルスクリプトが、gosu-examples にまとまってるらしい。以下を打てばインストールできる。
以下の場所にインストールされた。
サンプルスクリプトによっては、実行時に必要になるライブラリがあるようで。とりあえず、手元の環境では以下をインストールして、サンプルスクリプトを動かすことができた。
_WindowsにRubyをインストールする(初心者向け) - Qiita
Gosuのサンプルスクリプトが、gosu-examples にまとまってるらしい。以下を打てばインストールできる。
gem install gosu-examples
以下の場所にインストールされた。
Rubyインストールフォルダ\lib\ruby\gems\2.2.0\gems\gosu-examples-1.0.3examplesフォルダの中にサンプルがいくつか入ってるので、例えば ruby tutorial.rb、てな感じで実行できる。
サンプルスクリプトによっては、実行時に必要になるライブラリがあるようで。とりあえず、手元の環境では以下をインストールして、サンプルスクリプトを動かすことができた。
gem install chipmunk gem install openglchipmunk のインストールに関しては、Ruby の DevKit が必要になるようで。そのあたりは以下を参考にしてインストールしてくださいなと。
_WindowsにRubyをインストールする(初心者向け) - Qiita
[ ツッコむ ]
#2 [ruby][gosu] Windows + Ruby + Gosu を使ってもうちょっと色々試す
もうちょっと色々試してみる。
◎ タイルマップでBGを描画してみる。 :
タイルマップでBGを描画してみよう。
とりあえず、2枚描画してみる。メガドライブがBG2枚だったから、Gosuも2枚描けたら、メガドラ程度のゲーム画面は実現できる、はず。
_tilemap_bg_test.rb
_tmp_bg1.png
_tmp_bg2.png
ruby tilemap_bg_test.rb と打って実行してみる。
描画できてる。メガドラ程度にはなりそう。
少し解説。
タイルマップ用の画像は、えてして、たくさんのチップ画像が一枚の画像にまとめてあったりするので、画像を分割して読み込む必要が出てくる。
Gosu も、画像を分割して読み込む機能が用意されてる。以下のように書けばOK。結果は、Gosu::Image の配列で返ってくる。
タイルマップ用の画像なので、画像の端がクッキリスパッとしていてくれないと困る。敷き詰めた時に隙間が入ったら見苦しい。故に、:tileable => true を指定してる。
描画については…。例えば DXRuby なら、タイルマップBGを描画するための機能があらかじめ用意されてるけど、どうやら Gosu には無いらしい。仕方ないので、Rubyスクリプト内でループを回して描画してる。
とりあえず、2枚描画してみる。メガドライブがBG2枚だったから、Gosuも2枚描けたら、メガドラ程度のゲーム画面は実現できる、はず。
_tilemap_bg_test.rb
require 'gosu' # 背景描画用クラス class Map # コンストラクタ # @param wdw_w [Integer] ウインドウ横幅 # @param wdw_h [Integer] ウインドウ縦幅 def initialize(wdw_w, wdw_h) @wdw_w = wdw_w @wdw_h = wdw_h # 画像の読み込み @imgs = [] ["tmp_bg1.png", "tmp_bg2.png"].each do |fn| # Gosu::Image.load_tiles()を使えば画像を分割して読み込める。 # ここでは 512x512の画像を、1チップ32x32として読み込んでるので # 16x16個 = 256個の画像に分割されているはず imgs = Gosu::Image.load_tiles(fn, 32, 32, :tileable => true) @imgs.push(imgs) end # タイルマップ用の配列を作成 @bgarr = [] c = 0 16.times do |by| @bgarr[by] = [] 16.times do |bx| @bgarr[by][bx] = c c = (c + 1) % 256 end end end # 背景描画処理 # @param bx [Integer] BG座標x # @param by [Integer] BG座標y # @param n [Integer] BG番号(0 or 1) def draw(bx, by, n) cw, ch = 32, 32 # セル1つ分のサイズ bx = bx.to_i by = by.to_i imgs = @imgs[n] lenx = @bgarr[0].length leny = @bgarr.length cx = (bx / cw) % lenx cy = (by / ch) % leny sx = (bx % cw) sy = (by % ch) wcnt = @wdw_w / cw + 1 hcnt = @wdw_h / ch + 1 hcnt.times do |y| wcnt.times do |x| k = @bgarr[(cy + y) % leny][(cx + x) % lenx] imgs[k].draw(x * cw - sx, y * ch - sy, 0) end end end end class MyWindow < Gosu::Window # コンストラクタ def initialize super 640, 480, false self.caption = "Tilemap BG Test" @maps = Map.new(self.width, self.height) # マップ表示用 # self.width、self.height はウインドウの横幅、縦幅になってる @bgx = [0, 0] @bgy = [0, 0] @frame = 0 end # 更新処理 def update # BGスクロール位置を更新 ang = Math::cos(@frame * Math::PI / 180.0) @bgx[0] = -64 + (64.0 * ang) + 640 @bgx[1] = -128 + (128.0 * ang) + 640 @bgy[0] = (@bgy[0] + 2) @bgy[1] = (@bgy[1] + 6) @frame += 1 end # 描画処理 def draw 2.times do |i| @maps.draw(@bgx[i], @bgy[i], i) end end # キーボードチェック def button_down(id) if id == Gosu::KbEscape # ESCキーが押されたらウインドウを閉じて終了する close end end end window = MyWindow.new window.show使用画像は以下。
_tmp_bg1.png
_tmp_bg2.png
ruby tilemap_bg_test.rb と打って実行してみる。
描画できてる。メガドラ程度にはなりそう。
少し解説。
タイルマップ用の画像は、えてして、たくさんのチップ画像が一枚の画像にまとめてあったりするので、画像を分割して読み込む必要が出てくる。
Gosu も、画像を分割して読み込む機能が用意されてる。以下のように書けばOK。結果は、Gosu::Image の配列で返ってくる。
# 画像を分割して読み込む @imgs = Gosu::Image.load_tiles("画像ファイル名", 32, 32, :tileable => true)「32, 32」のあたりは、1チップが何x何ドットなのか、の指定。例えばこれが DXRuby だったら、「画像を何分割するか」で指定するけど、Gosuの場合は「チップの大きさ」を指定するので少し注意。
タイルマップ用の画像なので、画像の端がクッキリスパッとしていてくれないと困る。敷き詰めた時に隙間が入ったら見苦しい。故に、:tileable => true を指定してる。
描画については…。例えば DXRuby なら、タイルマップBGを描画するための機能があらかじめ用意されてるけど、どうやら Gosu には無いらしい。仕方ないので、Rubyスクリプト内でループを回して描画してる。
◎ ESCキーを押したら終了するようにしたい。 :
前述のスクリプトは、ESCキーを押すと終了することができる。処理してるのは以下の部分。
今気づいたけど、上の部分、Ruby なら以下のように書けますな…。1行で済む…。
キー種類は、 _Module: Gosu - Documentation for gosu/gosu (master) を眺めてもらえば予想できるかなと。KbXXXXX てのがキー種類、だと思われます。
# キーボードチェック def button_down(id) if id == Gosu::KbEscape # ESCキーが押されたらウインドウを閉じて終了する close end endbutton_down(id) というメソッドを書くと、何かキーが押された時に、このメソッドを呼んでくれるらしい。id にはキーの種類が入ってるので、Gosu::KbEscape (ESCキー)だったら、close を呼んでウインドウを閉じている。
今気づいたけど、上の部分、Ruby なら以下のように書けますな…。1行で済む…。
def button_down(id) close if id == Gosu::KbEscape end
キー種類は、 _Module: Gosu - Documentation for gosu/gosu (master) を眺めてもらえば予想できるかなと。KbXXXXX てのがキー種類、だと思われます。
◎ スプライト相当を描画してみる。 :
スプライト相当を描画してみる。64x64ドットの画像を、512枚描画してみよう。
_sprite_test.rb
_tmp_ufo.png
ruby sprite_test.rb で実行してみる。
動きました。
DXRuby には、Sprite というクラスが用意されてたりするけど、Gosu には無いみたい。なので、スプライト相当のクラスを自前で作って、描画処理等もその中で書いている。
_sprite_test.rb
require 'gosu' # スプライト相当のクラス class MySpr # コンストラクタ def initialize(x, y, vx, vy, img, scrw, scrh) @fpx = x @fpy = y @fpvx = vx @fpvy = vy @scrw = scrw @scrh = scrh @w = img.width @h = img.height @whf = @w / 2 @hhf = @h / 2 @image = img @x = (@fpx - @whf).to_i @y = (@fpy - @hhf).to_i end # 更新処理 def update @fpx += @fpvx @fpy += @fpvy @x = (@fpx - @whf).to_i @y = (@fpy - @hhf).to_i @fpvx *= -1 if @x + @w >= @scrw or @x <= 0 @fpvy *= -1 if @y + @h >= @scrh or @y <= 0 end # 描画処理 def draw @image.draw(@x, @y, 0) end end class MyWindow < Gosu::Window # コンストラクタ def initialize super 640, 480, false self.caption = "Sprite Test" scrw = self.width scrh = self.height # スプライト発生 pmax = 512 img = Gosu::Image.new("tmp_ufo.png", :tileable => true) x, y = 320, 240 @sprgroup = [] pmax.times do |i| rad = (i * 360 / pmax) * Math::PI / 180 dx = 3.0 * Math::cos(rad) dy = 3.0 * Math::sin(rad) @sprgroup.push(MySpr.new(x, y, dx, dy, img, scrw, scrh)) end @frame = 0 end # 更新処理 def update @sprgroup.each do |spr| spr.update end @frame += 1 end # 描画処理 def draw @sprgroup.each do |spr| spr.draw end end # キーボードチェック def button_down(id) if id == Gosu::KbEscape # ESCキーが押されたらウインドウを閉じて終了する # Gosu::Window.close() を呼ぶとウインドウが閉じる close end end end window = MyWindow.new window.show使用画像は以下。
_tmp_ufo.png
ruby sprite_test.rb で実行してみる。
動きました。
DXRuby には、Sprite というクラスが用意されてたりするけど、Gosu には無いみたい。なので、スプライト相当のクラスを自前で作って、描画処理等もその中で書いている。
◎ FPS(フレームレート)を測定する。 :
ところで、自分の手元の環境で Gosu を動かすと、なんだか動きがガクガクするんだよな…。Gosuって、本当に60FPS出てるのかな?
不安になってきたので、 _フレームレートの計測 を参考にして、FPSを測定する処理を書いてみたり。
_framerate_test.rb
ruby framerate_test.rb で実行。
計測できてるみたい。しかし、どうも微妙に60FPSに足りてない感じが。なんでだろ。
不安になってきたので、 _フレームレートの計測 を参考にして、FPSを測定する処理を書いてみたり。
_framerate_test.rb
require 'gosu' # フレームレートを測定するクラス class FrameRate attr_reader :framerate def initialize @cnt = 0 @framerate = 0 @start_time = Time.now end # 毎フレーム呼ぶ def update @cnt += 1 n = Time.now nd = n - @start_time return if nd < 1.0 @framerate = @cnt / nd @start_time = n @cnt = 0 end end # メインウインドウ class MyWindow < Gosu::Window # コンストラクタ def initialize super 640, 480, false self.caption = 'Sprite Test' @font = Gosu::Font.new(20) @frate = FrameRate.new end # 更新処理 # def update # end # 描画処理 def draw @frate.update f = @frate.framerate.to_s @font.draw("FPS #{f}", 10, 10, 0) end # キーボードチェック def button_down(id) # ESCキーが押されたらウインドウを閉じて終了する # Gosu::Window.close() を呼ぶとウインドウが閉じる close if id == Gosu::KbEscape end end window = MyWindow.new window.show
ruby framerate_test.rb で実行。
計測できてるみたい。しかし、どうも微妙に60FPSに足りてない感じが。なんでだろ。
◎ 合体させる。 :
今まで書いてきたソレを全部合体させてみる。ソースが長くなってきたので貼らないけど。
やってることは、スプライト相当 512枚 + タイルマップBG x 2枚の描画。その程度の描画ができれば、一般的というか、若干レトロ風なリアルタイム2Dゲームも書けるだろう…。
_gosu_fps_test.rb
使用画像。
_tmp_bg1.png
_tmp_bg2.png
_tmp_ufo.png
ruby gosu_fps_test.rb で実行。
何故か微妙に60FPSに足りてなくて、そのせいかガクガクしてる感じもするけど、このくらいの速度で動けば、まあ、ゲームになるんじゃないかな、と。
やってることは、スプライト相当 512枚 + タイルマップBG x 2枚の描画。その程度の描画ができれば、一般的というか、若干レトロ風なリアルタイム2Dゲームも書けるだろう…。
_gosu_fps_test.rb
使用画像。
_tmp_bg1.png
_tmp_bg2.png
_tmp_ufo.png
ruby gosu_fps_test.rb で実行。
何故か微妙に60FPSに足りてなくて、そのせいかガクガクしてる感じもするけど、このくらいの速度で動けば、まあ、ゲームになるんじゃないかな、と。
◎ 別のWindows機で動かしてみる。 :
このスクリプトを他の環境に持っていっても動くのかどうか。気になる…。
ちなみに、今まで動かしてた環境(ハードウェアスペック)は以下。
前述の gosu_fps_test.rb を、他のWindows機でも動かせるように、ocra で exe化。ocra を使うと Rubyスクリプトを exe化してくれる。使い方は、DXRuby の解説記事が参考になるかと。
_ocraによるexe化
少し古い別PCに持っていって動かしてみた。
AMD/ATI製とは言え所詮はオンボードGPUなので、どうかなーと思ったけど。60FPS前後で動いてくれた。
一昔前の省電力性を重視したCPU + 一昔前のオンボードGPUでもこの程度動くなら、Gosuを使ってゲームを作っても動かせる環境は比較的多いのではあるまいか、と。
もっとも、Atom CPU あたりが載った環境で動かすとどうなるか、気になるところではあるけど…。もちろん初期のAtomでは話にならないはずだけど、今時のAtomならどうなのだろうと。60FPSが出ちゃうのか、ガクガクしちゃうのか、ちょっと気になるなと。
ちなみに、今まで動かしてた環境(ハードウェアスペック)は以下。
- CPU : Intel Core i5-2500 (4コア, 3.3GHz)
- GPU : NVIDIA GeForce GTX 750 Ti (RAM 2GB)
- RAM : 8GB (DDR3-1333/PC-10600 SDRAM, 4GB x 2)
- OS : Windows10 x64
前述の gosu_fps_test.rb を、他のWindows機でも動かせるように、ocra で exe化。ocra を使うと Rubyスクリプトを exe化してくれる。使い方は、DXRuby の解説記事が参考になるかと。
_ocraによるexe化
少し古い別PCに持っていって動かしてみた。
- CPU : AMD AthlonII X4 605e (4コア, 2.3GHz, TDP 45W) …当時としては処理能力より省電力性を重視したCPU。
- M/B : ASRock M3A785GMH/128M (MicroATX, Socket AM3, AMD 785G)
- GPU : オンボードビデオ Radeon HD 4200 (RS800, VRAM 624MB) AMD785Gチップセットと統合されてる。
- RAM : 8GB (DDR3-1333/PC3-10600, 4GB x 2)
- OS : Windows7 Home x64
AMD/ATI製とは言え所詮はオンボードGPUなので、どうかなーと思ったけど。60FPS前後で動いてくれた。
一昔前の省電力性を重視したCPU + 一昔前のオンボードGPUでもこの程度動くなら、Gosuを使ってゲームを作っても動かせる環境は比較的多いのではあるまいか、と。
もっとも、Atom CPU あたりが載った環境で動かすとどうなるか、気になるところではあるけど…。もちろん初期のAtomでは話にならないはずだけど、今時のAtomならどうなのだろうと。60FPSが出ちゃうのか、ガクガクしちゃうのか、ちょっと気になるなと。
[ ツッコむ ]
#3 [ruby][gosu][ubuntu] Ubuntu 16.04 LTS上で Ruby + Gosu を動かしてみる
Gosuはクロスプラットフォーム対応ライブラリなので、せっかくだから Ubuntu Linux 16.04 LTS上でも動かしてみる。
環境は以下。
Linux上での Gosu のインストール手順は、以下のページにまとまってた。ありがたや。
_Getting Started on Linux - gosu/gosu Wiki
Gosu の動作に必要なパッケージを、apt-get を使ってインストールする。端末を開いて、以下を打ち込む。
準備が出来たら Gosu をインストール。
Windows上で動かしていたスクリプトを、Ubuntu上にコピーして実行してみた。
画像表示しかしてないスクリプト群ではあるけど、あっさり動いてしまった。
仮想PC上で動かすからガクガクしちゃうかなと想像していたけど、見た目それほど悪くない感じ。結構滑らかに動いてくれた。
環境は以下。
- Windows10 x64
- + VMware Workstation 12 Player 12.5.2 build-463824
- + Ubuntu 16.04 LTS
Linux上での Gosu のインストール手順は、以下のページにまとまってた。ありがたや。
_Getting Started on Linux - gosu/gosu Wiki
Gosu の動作に必要なパッケージを、apt-get を使ってインストールする。端末を開いて、以下を打ち込む。
sudo apt-get install build-essential libsdl2-dev libsdl2-ttf-dev libpango1.0-dev libgl1-mesa-dev libopenal-dev libsndfile-dev sudo apt-get install ruby-dev
準備が出来たら Gosu をインストール。
$ sudo gem install gosu Fetching: gosu-0.10.8.gem (100%) Building native extensions. This could take a while... Successfully installed gosu-0.10.8 Parsing documentation for gosu-0.10.8 Installing ri documentation for gosu-0.10.8 Done installing documentation for gosu after 7 seconds 1 gem installedビルドされて、インストールができた模様。
Windows上で動かしていたスクリプトを、Ubuntu上にコピーして実行してみた。
画像表示しかしてないスクリプト群ではあるけど、あっさり動いてしまった。
仮想PC上で動かすからガクガクしちゃうかなと想像していたけど、見た目それほど悪くない感じ。結構滑らかに動いてくれた。
◎ Ubuntuを入れた実機上でも動かしてみる。 :
足元で埃を被ってる、Ubuntu 16.04 LTS を入れてある実機でも動かしてみる。スペックは以下。
フツーに60FPS前後が出た。
ていうか、メインPC(Windows10機)で動かした時より、ガクガクしてないのですけど…。となると、どうやらメインPCが、何かしらおかしい可能性が…。
- CPU : AMD Athlon II X2 250 (2コア,3GHz, TDP 65W)
- GPU : オンボードGPU AMD 785G (Radeon HD 4200)
- OS : Ubuntu 16.04 LTS
フツーに60FPS前後が出た。
ていうか、メインPC(Windows10機)で動かした時より、ガクガクしてないのですけど…。となると、どうやらメインPCが、何かしらおかしい可能性が…。
◎ Ubuntu 14.04 の実機でも動かしてみる。 :
更に、部屋の隅で埃を被ってた Lubuntu 14.04 LTS が入れてある実機でも動かしてみた。スペックは以下。
動くことは動くけど、2〜3 FPSだった。60FPSには程遠い。全く話にならない。さすがにハードウェアが古過ぎた。
改善する方法は無いのかなと少しググってみたけど、チップセット VIA K8M800 に統合されてるオンボードビデオ S3 UniChrome Pro はVIAが資料を見せてくれないからLinux用のドライバ開発がなかなか進まなくてパフォーマンスが出ないのじゃよ、と嘆いてる記事が2012年頃に書かれてた。このPC上では、別途ビデオカードを追加しないとダメっぽいな…。
さておき。Ubuntu 16.04 なら Gosu の動作に必要なパッケージがすんなりインストールできるのだけど。Ubuntu(Lubuntu) 14.04 上に Gosu をインストールしようとしたらちょっとハマったので、そのあたりは別記事にしてメモ。
- CPU : AMD Sempron 3100+ (シングルコア, 1.8GHz, Socket754)
- M/B : MSI K8MM-V (VIA K8M800チップセット)
- GPU : オンボードGPU (K8M800に統合, UniChrome Pro)
- RAM : 1.5GB (PC3200/DDR400, SDRAM, 1GB + 512MB, シングルチャネル)
- OS : Lubuntu 14.04 LTS (LXDEで構成された比較的軽量な Ubuntu)
動くことは動くけど、2〜3 FPSだった。60FPSには程遠い。全く話にならない。さすがにハードウェアが古過ぎた。
改善する方法は無いのかなと少しググってみたけど、チップセット VIA K8M800 に統合されてるオンボードビデオ S3 UniChrome Pro はVIAが資料を見せてくれないからLinux用のドライバ開発がなかなか進まなくてパフォーマンスが出ないのじゃよ、と嘆いてる記事が2012年頃に書かれてた。このPC上では、別途ビデオカードを追加しないとダメっぽいな…。
さておき。Ubuntu 16.04 なら Gosu の動作に必要なパッケージがすんなりインストールできるのだけど。Ubuntu(Lubuntu) 14.04 上に Gosu をインストールしようとしたらちょっとハマったので、そのあたりは別記事にしてメモ。
[ ツッコむ ]
#4 [ruby][gosu][ubuntu] Lubuntu 14.04 LTSに Ruby 2.3 + Gosu をインストール
Lubuntu 14.04 LTS 上で、Ruby 2.3 + Gosu をインストールした際の手順をメモ。
以下の、Ubuntu 14.04版のインストール手引書を参考にして打ち込んでみたけれど…。
_Getting Started on Linux - gosu/gosu Wiki
そもそも libsdl2-dev がインストールできないという。
以下を参考にして、もう少し作業。
_Raspberry Pi 2にUbuntu 14.04を入れてみた - Qiita
_Raspberry Pi - View topic - Ubuntu 14.04 (trusty) Raspberry Pi 2 image
ここまでやってから、以下を実行。
続けて Ruby自体をインストール。Ubuntu 14.04 LTS は、公式では Ruby 1.9 までしかパッケージが用意されてないので、リポジトリ?を追加して Ruby 2.3 をインストールすることにする。
_Ubuntu 14.04 に apt-get で Ruby 2.1 をインストールする方法 - Rails 雑感 - Ruby on Rails with OIAX
_PPAパッケージを利用してRuby 2.2をUbuntu 14.04にインストールする | hrendoh's memo
ちなみに、Rubyのバージョンを切り替えたい時は以下を打って設定する。
これで必要なアレコレは入ったはずなので、Gosuをインストールしてみた。
ここまでやって、ようやく Lubuntu (Ubuntu) 14.04 LTS 上でも Gosu が動くようになった。
以下の、Ubuntu 14.04版のインストール手引書を参考にして打ち込んでみたけれど…。
_Getting Started on Linux - gosu/gosu Wiki
$ sudo apt-get install build-essential libsdl2-dev libsdl2-ttf-dev libpango1.0-dev libgl1-mesa-dev libfreeimage-dev libopenal-dev libsndfile-dev パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 注意、'libsndfile-dev' の代わりに 'libsndfile1-dev' を選択します build-essential はすでに最新版です。 インストールすることができないパッケージがありました。おそらく、あり得 ない状況を要求したか、(不安定版ディストリビューションを使用しているの であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移 動されていないことが考えられます。 以下の情報がこの問題を解決するために役立つかもしれません: 以下のパッケージには満たせない依存関係があります: libsdl2-dev : 依存: libgles2-mesa-dev E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
そもそも libsdl2-dev がインストールできないという。
以下を参考にして、もう少し作業。
_Raspberry Pi 2にUbuntu 14.04を入れてみた - Qiita
_Raspberry Pi - View topic - Ubuntu 14.04 (trusty) Raspberry Pi 2 image
$ sudo apt-get download libegl1-mesa-dev $ sudo apt-get download libgles2-mesa-dev $ sudo dpkg -i --force-overwrite libegl1-mesa-dev_*.deb # => エラーになる $ sudo dpkg -i --force-overwrite libgles2-mesa-dev_*.deb # => エラーになる $ sudo apt-get install -f
ここまでやってから、以下を実行。
$ sudo apt-get install libsdl2-devインストールできた、かな。続けて以下を実行。
$ sudo apt-get install build-essential libsdl2-dev libsdl2-ttf-dev libpango1.0-dev libgl1-mesa-dev libfreeimage-dev libopenal-dev libsndfile-devインストールできた。が、コレでいいのかどうか…。
続けて Ruby自体をインストール。Ubuntu 14.04 LTS は、公式では Ruby 1.9 までしかパッケージが用意されてないので、リポジトリ?を追加して Ruby 2.3 をインストールすることにする。
_Ubuntu 14.04 に apt-get で Ruby 2.1 をインストールする方法 - Rails 雑感 - Ruby on Rails with OIAX
_PPAパッケージを利用してRuby 2.2をUbuntu 14.04にインストールする | hrendoh's memo
$ sudo add-apt-repository -y ppa:brightbox/ruby-ng $ sudo apt-get update $ sudo apt-get install ruby2.3 ruby2.3-dev $ ruby --version ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux-gnu]インストールできた、かな。
ちなみに、Rubyのバージョンを切り替えたい時は以下を打って設定する。
$ sudo update-alternatives --list ruby $ sudo update-alternatives --config ruby
これで必要なアレコレは入ったはずなので、Gosuをインストールしてみた。
$ gem install gosuインストールできた。
ここまでやって、ようやく Lubuntu (Ubuntu) 14.04 LTS 上でも Gosu が動くようになった。
◎ apt-get関係でもう少し作業。 :
libsdl2-dev をインストールする際、
_apt - Cannot install libgles2-mesa-dev - Ask Ubuntu
に従って、以下も実行してみた。
sudo apt-get clean sudo apt-get autoclean sudo apt-get -f install sudo dpkg --configure -a sudo apt-get -f install sudo apt-get -u dist-upgrade sudo apt-get -o Debug::pkgProblemResolver=yes dist-upgrade関係してくるのかどうかは分からないけど一応メモ。
[ ツッコむ ]
以上、1 日分です。