Я не уверен, что это решит все проблемы, но в качестве первого шага я бы предложил вывести все вычисления из цикла, который используется для рисования. Вот предложение, как это сделать:
ускаю симуляцию в MATLAB, в которой у меня большой 3D-набор данных, который меняется каждый раз. Я пытаюсь визуализировать данные, используя трехмерную диаграмму рассеяния с точками, которые принимают различные местоположения, размеры, цвета и уровни прозрачности в процессе симуляции. Размер и цвет информации избыточны.
Рендеринг и вращение фигуры в MATLAB медленный и прерывистый. Мой компьютер имеет 4 ГГц процессор i7-4790 и графическую карту NVIDIA GeForce GTX 750 Ti. Я использую Matlab R2016a в Windows 7. Я проверил настройки MATLAB OpenGL, и уровень поддержки оборудования заполнен. (Аппаратное обеспечение OpenGL необходимо для прозрачности.) Более того, я отслеживаю использование своего графического процессора, используяGPU-Zи во время черчения и поворота загрузка графического процессора достигает максимума только на 25-30%.
Вот мой пример кода:
load sample_data2
channels_matrix = cat(1, channels{:});
num_channels = length(channels);
channel_lengths = cellfun(@(x) size(x, 1), channels);
figure(1);
for i = 1:num_channels
g = plot3(channels{i}(:, 1), channels{i}(:, 2), channels{i}(:, 3), 'k');
set(g, 'LineWidth', 1.5)
hold on;
text(channels{i}(1, 1), channels{i}(1, 2), channels{i}(1, 3), num2str(i))
end
caxis([0 1])
colorbar
drawnow
numDivisions = 8;
ptsPerDivision = numel(grid_x)/numDivisions;
T = 1000;
numplotpts = 2E4;
for t = 1:T
plot_signal = nan(size(grid_x));
plot_signal(sort(randsample(numel(grid_x), numplotpts))) =...
sort(rand(numplotpts, 1));
tic
for i = 1:numDivisions
temp = plot_signal(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
yplot = grid_y(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
xplot = grid_x(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
zplot = grid_z(dists_idx((i-1)*ptsPerDivision+1:i*ptsPerDivision));
if t == 1
h(i) = scatter3(yplot(~isnan(temp)), xplot(~isnan(temp)),...
zplot(~isnan(temp)), 50*temp(~isnan(temp)), temp(~isnan(temp)), ...
'filled', 'MarkerFaceAlpha', exp(-i)^0.25);
else
h(i).XData = yplot(~isnan(temp));
h(i).YData = xplot(~isnan(temp));
h(i).ZData = zplot(~isnan(temp));
h(i).SizeData = 50*temp(~isnan(temp));
h(i).CData = temp(~isnan(temp));
end
end
drawnow
toc
end
и вот ссылка наданные, Есть ли способ ускорить рендеринг и сделать вращение более плавным? Я заметил, что привязка размера всех точек данных к одному скаляру значительно ускоряет рендеринг и вращение. Можно ли сохранить размер, как он есть в коде, и при этом по-прежнему быстро отображать и вращать фигуру?
редактировать: Aсвязанный вопрос Я отправил.