Я добавляю код в качестве ссылки, но вам, вероятно, не нужно разбираться в mandlerbot, чтобы помочь мне с этим странным многопоточным побочным эффектом.
Я создаю простой Мандельброт, используя этот код:
void compute_mandelbrot(double left, double right, double top, double bottom, double start, double end)
{
int r = 0x00, g = 0x00, b = 0x00;
for (int y = start; y < end; ++y)
{
for (int x = 0; x < WIDTH; ++x)
{
// Work out the point in the complex plane that
// corresponds to this pixel in the output image.
complex<double> c(left + (x * (right - left) / WIDTH),
top + (y * (bottom - top) / HIGHT));
// Start off z at (0, 0).
complex<double> z(0.0, 0.0);
// Iterate z = z^2 + c until z moves more than 2 units
// away from (0, 0), or we've iterated too many times.
int iterations = 0;
while (abs(z) < 2.0 && iterations < MAX_ITERATIONS)
{
z = (z * z) + c;
++iterations;
}
if (r <= MAX_ITERATIONS)
r = iterations;
unsigned int colour = r | (r << 8) | (r << 16);
vertex.color = sf::Color(r, g, b, 255);
//vertex.color = sf::Color(6525, 1111, 222, 255);
vertex.position = sf::Vector2f(x, y);
mutex.lock();
varray.append(vertex);
mutex.unlock();
}
}
}
, который работает просто отлично. Но когда я пытаюсь использовать потоки для ускорения процесса, я получаю необычный результат
void slicer(double left, double right, double top, double bottom, int slices)
{
int sliceSize = 800 / slices;
double start = 0, end = 0;
for (int i = 0; i < slices; i++)
{
start = i * sliceSize;
end = ((1 + i) * sliceSize);
thrd.push_back(thread(compute_mandelbrot, left, right, top, bottom, start, end));
}
for (int i = 0; i < slices; i++)
{
thrd[i].join();
}
thrd.clear();
}
Результат:
Теперь странная часть, которая болит мне в голову, если я отправлю один кусочек, как это
compute_mandelbrot (слева, справа, сверху, снизу, 400, 480);
без потоков, тогда он работает нормально, поэтому мне так трудно понять, почему, когда у меня есть потоки, рендеринг каждого среза отдельно, кажется, что везде много неокрашенных битов.
Еще более странным является то, что неотрисованные части являются случайными каждый раз, за исключением одного среза в середине (см. Рисунок), который никогда не имеет пропущенного цвета, если срезы = 4