rmagickのimport_pixelsはarrayも送れるみたい。
前回の奴にrmagickを組み合わせると更にフレームレートが上がった。
前回の奴でも使い物になると思っているので、まあ、この辺はrmagickが使えるか使えないかで決めるのかな?
pixelsとインデックスのnarray(r,g,b)の作り方を前回と変えてみた。
x,yについては思考中。

<追記>
プログラムを書き直しました。

require "tk"
require "narray"
require "rmagick"

width = 300
height = 300
canvas = TkCanvas.new(:width=>width, :height=>height).pack
img =TkPhotoImage.new
TkcImage.new(canvas, width/2, height/2, :image =>img)
magick = Magick::Image.new(width, height)
magick.format = "PPM"

pixels = NArray.byte(width*height*3)

x = NArray.to_na(height.times.map{width.times.to_a}.flatten).to_f/width
y = NArray.to_na(height.times.map{|i| [i]*width}.flatten).to_f/height

r = NArray.int(width*height).indgen(0, 3)
g = NArray.int(width*height).indgen(1, 3)
b = NArray.int(width*height).indgen(2, 3)

pixels[r] = x*255
pixels[g] = y*255

theta = 0
TkAfter.start(1000/60, -1, proc{
  pixels[b] = Math.sin(theta)*128+127
  theta += 0.1
  magick.import_pixels(0,0, width, height, 'RGB', pixels.to_a)
  img.data = magick.to_blob
})

Tk.mainloop