PHP ImagickDraw 线程化
PHP ImagickDraw threaded
我正在尝试在 PHP 上使用 ImagickDraw,使用大量(~100,000)个 circle() rectangle() 等调用来绘制图像。这些在 4 个 cmyk 通道之间分配,因此每个通道大约有 30k 个调用。
实际的 circle()
和 rectangle()
调用本身非常快,程序的整个部分 运行 不到一秒;然后我点击了我在 4 个单独的 ImagickDraw
对象中的每一个上使用 drawImage
的部分,每层需要 >15 秒才能 运行... 我知道这是一个非常复杂的图像,但是有什么办法可以加快速度吗?
我考虑过使用 pthreads,为 4 个 ImagickDraw
对象中的每一个都有一个单独的 pthread,这只会导致程序挂起:
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";
}
谢谢!
我很惊讶 i) 有效 ii) 这么快。
我建议尝试的是忘记对 Imagick 进行这么多次单独调用。
改为使用适当的 svg 圆形和矩形标签手动生成 SVG XML 文档。然后使用 Imagick 将该图像 composite/convert 转换为您想要的输出图像格式。
I've considered using pthreads, having a separate pthread
for each of the 4 ImagickDraw objects, and this just caused
the program to hang:
是的,那是行不通的。底层 C 库与 pthreads 不兼容。
我正在尝试在 PHP 上使用 ImagickDraw,使用大量(~100,000)个 circle() rectangle() 等调用来绘制图像。这些在 4 个 cmyk 通道之间分配,因此每个通道大约有 30k 个调用。
实际的 circle()
和 rectangle()
调用本身非常快,程序的整个部分 运行 不到一秒;然后我点击了我在 4 个单独的 ImagickDraw
对象中的每一个上使用 drawImage
的部分,每层需要 >15 秒才能 运行... 我知道这是一个非常复杂的图像,但是有什么办法可以加快速度吗?
我考虑过使用 pthreads,为 4 个 ImagickDraw
对象中的每一个都有一个单独的 pthread,这只会导致程序挂起:
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";
}
谢谢!
我很惊讶 i) 有效 ii) 这么快。
我建议尝试的是忘记对 Imagick 进行这么多次单独调用。
改为使用适当的 svg 圆形和矩形标签手动生成 SVG XML 文档。然后使用 Imagick 将该图像 composite/convert 转换为您想要的输出图像格式。
I've considered using pthreads, having a separate pthread for each of the 4 ImagickDraw objects, and this just caused the program to hang:
是的,那是行不通的。底层 C 库与 pthreads 不兼容。