Я пытаюсь использовать ImagickDraw на PHP, чтобы нарисовать изображение с помощью очень большого числа (~ 100 000) вызовов circle () rectangle () и т. Д. Они разделены между 4 каналами CMYK, поэтому каждый канал получает около 30 тысяч вызовов.
Настоящий circle()
а также rectangle()
сами вызовы выполняются очень быстро, и вся эта часть программы выполняется менее чем за секунду; тогда я попал в ту часть, где я использую drawImage
на каждом из 4 отдельных ImagickDraw
объекты и это занимает> 15 секунд для каждого слоя для запуска … понял, что это очень сложное изображение, но есть ли способ ускорить это?
Я рассмотрел использование pthreads, имея отдельный pthread для каждого из 4 ImagickDraw
объекты, и это просто вызвало зависание программы:
class Render extends Thread
{
public $im;
private $svg;
public function __construct($width, $height, $bg, $svg)
{
$this->im = new Imagick();
$this->svg = $svg;
$this->im->newImage($width, $height, $bg);
}
public function run()
{
$id = new ImagickDraw();
$id->setVectorGraphics($this->svg);
$this->im->drawImage($id);
}
}
$threads = [];
$imarray = [];
foreach($drawar as $c=>$s){
$threads[$c] = new Render($finalsize['width'], $finalsize['height'], 'white', $s);
$threads[$c]->start();
}
foreach($threads as $c=>$p){
$p->join();
$imarray[$c] = $p->im;
echo "Got {$c} data\n";
}
Спасибо!
Я удивлен, что я) работает II) это так быстро.
Я бы посоветовал попытаться забыть сделать так много индивидуальных звонков в Имаджик.
Вместо этого создайте документ SVG XML вручную, используя соответствующие теги svg circle и rectangle. Затем используйте Imagick для компоновки / преобразования этого изображения в нужный формат выходного изображения.
Я подумал об использовании pthreads, имея отдельный pthread
для каждого из 4 объектов ImagickDraw, и это просто вызвало
программа для зависания:
Да, это не сработает. Базовая библиотека C не совместима с pthreads.
Других решений пока нет …