記録

まあ、今回はスクリプト側をいじっての記録だから反則だが。
Ruby1.9.1+DXRuby1.0.3+DXRubyExtension0.0.5にて。

同じことをするのに極限まで処理を削ったらどこまで速くなるのか、ということで試してみた。
ここまでやっても10000到達できないのが悲しい。
数字そのものは環境によって大きく変わるからあまり意味は無いのだが、気分的なものだ。
DXRubyの基礎部分をこれ以上速くするのはいまのところ難しく、このレベルのシンプルなスクリプトの実行速度を改善する周辺ライブラリのアイデアも無く。
どうやらここらへんがRubyでの限界速度と考えてよさそうだ。


出し惜しみしてもしょうがないからスクリプトも置いておこう。
こんな感じ。

# DXRubyサンプル。元ネタはRubyゲーム開発のハブサイトさま。
require "dxruby"
require "dxrubyex"

class Array
  include ArrayExtension
end

# Imageオブジェクトを作成
IMAGE = Image.load("ruby.png")

class Sprite
  MAX_X = 640 - 32 - 1
  MAX_Y = 480 - 32 - 1

  def initialize
    @x = rand(MAX_X + 1)
    @y = rand(MAX_Y + 1)
    @vx = rand(2) * 2 - 1
    @vy = rand(2) * 2 - 1
  end

  def update
    @x += @vx
    @y += @vy
    if @x <= 0 or MAX_X <= @x
      @vx = -@vx
    end
    if @y <= 0 or MAX_Y <= @y
      @vy = -@vy
    end
    # 画像を画面に対して描画する。
    Window.draw(@x, @y, IMAGE)
  end
end

# Sprite オブジェクトの配列を生成する。
sprites = Array.new(8000){ Sprite.new }

font = Font.new(32)

# ウィンドウのキャプションを設定する。 
Window.caption = "Sprites"

# fpsを設定する。
Window.fps = 60
Window.frameskip = false

# メインループ。
# ウィンドウが閉じられた場合は自動的に終了する。
# 画面は毎フレームリセットされる。
Window.loop do
  # sprites配列の増減
  if Input.keyDown?(K_RIGHT) then
    10.times do
      sprites.push(Sprite.new)
    end
  end
  if Input.keyDown?(K_LEFT) then
    10.times do
      sprites.pop
    end
  end

  # ESC キーが押された場合終了する。
  break if Input.keyPush?(K_ESCAPE)

  # Sprite オブジェクトそれぞれについて処理する。
  sprites.hs_each(:update)

  Window.drawFont(0,0,Window.fps.to_s+" fps", font)
  Window.drawFont(0,40,sprites.size.to_s+" objects", font)
end