Rmagick, GraphicsMagick, кажется, очень медленно на сервере (почему хорошо на локальном) - PullRequest
5 голосов
/ 24 ноября 2011

Я ищу очень быстрый способ рендеринга динамических изображений из маленьких плиток, размещенных на некотором фоне (представьте, что вы динамически визуализируете игру в шахматы и отправляете изображения после того, как каждый игрок сделал ход).Таким образом, процедура выглядит довольно простой: 1. Возьмите некоторый фон 2. Поместите прозрачные изображения шахматных фигур сверху вниз, используя смещения изображения (чтобы иметь правильную перспективу) 3. Сохраните всю картинку как gif

Triedиспользуя 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

И графическую магию аналогично: gm convert ... -page + 35 + -30 -flatten ..

Но это не впечатлило, GraphicsMagick обеспечил лучшие результаты, но:

SERVER:

             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)

На локальном 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)

Возможно, загрузка файлаэто проблема, пробовал 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

Результат еще более странный: ЭТО НА КРОЧНОЕ 2 * 2 плитки image

СЕРВЕР:

         user     system      total        real
tiny:   16.210000   0.000000  16.210000 ( 16.982007)

ФЕНОМ:

             user     system      total        real
tiny:    0.000000   0.010000   0.010000 (  0.001637)

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

ФОРМАТЫ ВХОДНОГО ФАЙЛА: пробовал png иmiff

ВЫХОД: должен быть gif

СЕРВЕР: 1 ядро ​​XEON на VPS ~ 2,2 ГГц

ФЕНОМ: 6 * 3,2 ГГц

Versионные различия:

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

ВОПРОСЫ

  1. Есть идеи по снижению скорости до 10000 раз?
  2. Есть идеи о том, какЯ мог бы решить эту задачу любым другим способом (с другой функцией GM или IM?) Или методом (попробовать сейчас chunky_PNG (с добавлением oily_png)?
  3. Старые 2d игры эпохи DOS могли рендерить еще больше пикселей при60 кадров в секунду, так что я думаю, что это должно быть в состоянии сделать это на 2 ГГц процессоре (200 мс будет в порядке, я думаю)?

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011

Кажется, каждый раз, когда я задаю вопрос по SO, ответ приходит ко мне немедленно.

На этот раз кажется, что проблема в производительности из-за OpenVz VPS и OpenMP в IM и GM. После перекомпиляции без возможности OpenMP на сервере получается отличная производительность.

0 голосов
/ 24 ноября 2011

Известно, что RMagick вызывает всевозможные проблемы в работе (в основном связанные с утечками памяти).Я не знаю деталей, но я знаю, что использование mini_magick устраняет большинство проблем с производительностью.Может, тебе стоит попробовать?

...