Я ищу очень быстрый способ рендеринга динамических изображений из маленьких плиток, размещенных на некотором фоне (представьте, что вы динамически визуализируете игру в шахматы и отправляете изображения после того, как каждый игрок сделал ход).Таким образом, процедура выглядит довольно простой: 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
ВОПРОСЫ
- Есть идеи по снижению скорости до 10000 раз?
- Есть идеи о том, какЯ мог бы решить эту задачу любым другим способом (с другой функцией GM или IM?) Или методом (попробовать сейчас chunky_PNG (с добавлением oily_png)?
- Старые 2d игры эпохи DOS могли рендерить еще больше пикселей при60 кадров в секунду, так что я думаю, что это должно быть в состоянии сделать это на 2 ГГц процессоре (200 мс будет в порядке, я думаю)?