Rmagick,GraphicsMagick似乎在服务器上超级慢(为什么在本地可以)

Hou*_*eMD 5 ruby performance rmagick imagemagick graphicsmagick

我正在寻找一种非常快速的方法来渲染放置在某些背景上的小瓷砖的动态图像(想象一下动态渲染国际象棋游戏并在每个玩家移动后发送图像).所以程序似乎很简单:1.采取一些背景2.使用图像偏移从上到下放置国际象棋图像的透明图像(以获得正确的视角)3.将整个图像保存为gif

尝试使用imagemagick:

使用类似的东西:

convert -page 176x220 -gravity SouthWest 1.png   -page +35+30 -gravity SouthWest 1.png     -page +62+50       1.png   -page +10+55 1.png -background none  -compose DstOver  -flatten      result.gif
Run Code Online (Sandbox Code Playgroud)

和图形magick以类似的方式:gm转换... -page + 35 + -30 -flatten ..

但是没有留下深刻的印象,GraphicsMagick提供了更好的结果,但是:

服务器:

             user     system      total        real
all:     0.000000   0.000000  47.650000 ( 70.991829)
small:   0.000000   0.000000   6.600000 (  8.110900)
medium:  0.000000   0.000000   6.820000 (  8.494131)
large:   0.000000   0.000000  10.890000 ( 15.818351)
extreme:  0.000000   0.000000  11.160000 ( 19.873541)
biggest:  0.000000   0.000000  11.640000 ( 14.327450)
Run Code Online (Sandbox Code Playgroud)

在本地Phenom II x6:

             user     system      total        real
all:     0.000000   0.000000   1.980000 (  0.757320)
small:   0.000000   0.000000   0.330000 (  0.082142)
medium:  0.000000   0.000000   0.380000 (  0.127744)
large:   0.000000   0.000000   0.410000 (  0.147252)
extreme:  0.000000   0.000000   0.440000 (  0.180338)
biggest:  0.000000   0.000000   0.470000 (  0.210802)
Run Code Online (Sandbox Code Playgroud)

想到可能文件加载是问题,试过Rmagick(脚本来自:http://www.imagemagick.org/RMagick/doc/ilist.html#mosaic):

    require "benchmark"
    require 'RMagick'

    #Demonstrate the mosaic method

    a = Magick::ImageList.new

    26.times do
      a.read("csii/some_asset.miff")
    end


    b = Magick::ImageList.new
    page = Magick::Rectangle.new(0,0,0,0)
    a.scene = 0
    2.times do |i|
        2.times do |j|
            b << a.scale(1)
            page.x = j * b.columns
            page.y = i * b.rows
            b.page = page
            (a.scene += 1) rescue a.scene = 0
        end
    end

    # Make a 5x5 mosaic
    #mosaic = b.flatten_images
    #mosaic.write("mosaic.gif")

    # mosaic.display
    Benchmark.bm(7) do |ben|
      ben.report("tiny:")   {mosaic = b.mosaic}
    end

    exit
Run Code Online (Sandbox Code Playgroud)

结果更加奇怪: 这是一个小的2*2瓷砖图像

服务器:

         user     system      total        real
tiny:   16.210000   0.000000  16.210000 ( 16.982007)
Run Code Online (Sandbox Code Playgroud)

飞鸿:

             user     system      total        real
tiny:    0.000000   0.010000   0.010000 (  0.001637)
Run Code Online (Sandbox Code Playgroud)

附加信息:

输入文件格式:尝试过png和miff

输出:必须是gif

服务器:VPS上的1个XEON核心~2.2Ghz

PHENOM:6*3.2Ghz

版本差异:

Phenom
Version: ImageMagick 6.5.7-8 2010-12-02 Q16 http://www.imagemagick.org

Server 
Version: ImageMagick 6.5.1-0 2010-12-02 Q16 OpenMP http://www.imagemagick.org
Run Code Online (Sandbox Code Playgroud)

质询

  1. 对于速度降低10000倍的想法?
  2. 关于如何以任何其他方式(其他GM或IM函数?)或方法(现在尝试chunky_PNG(使用oily_png ext.))的任何想法?
  3. DOS时代的旧2D游戏可以以60fps渲染更多的像素,所以我想它应该能够在2Ghz CPU上实现这一点(我估计200ms就可以了)?

Hou*_*eMD 2

似乎每次我问一个关于 SO 的问题时,答案都会立即出现。

这次看来性能问题是因为 IM 和 GM 中的 OpenVz VPS 和 OpenMP。在没有 OpenMP 功能的情况下重新编译后,服务器上的性能非常好。