Использование потоков приводит к странной ошибке, когда некоторые точки не окрашиваются. - PullRequest
0 голосов
/ 01 мая 2018

Я добавляю код в качестве ссылки, но вам, вероятно, не нужно разбираться в 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();

}
Результат: enter image description here

Теперь странная часть, которая болит мне в голову, если я отправлю один кусочек, как это

compute_mandelbrot (слева, справа, сверху, снизу, 400, 480);

без потоков, тогда он работает нормально, поэтому мне так трудно понять, почему, когда у меня есть потоки, рендеринг каждого среза отдельно, кажется, что везде много неокрашенных битов.

Еще более странным является то, что неотрисованные части являются случайными каждый раз, за ​​исключением одного среза в середине (см. Рисунок), который никогда не имеет пропущенного цвета, если срезы = 4

1 Ответ

0 голосов
/ 01 мая 2018

Я переехал

			unsigned int colour = r | (r << 8) | (r << 16);

			vertex.color = sf::Color(r, g, b, 255);
			vertex.position = sf::Vector2f(x, y);

в мьютекс вместе с varray.append (вершина); и работает как задумано

...