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

ускаю симуляцию в 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связанный вопрос Я отправил.

Ответы на вопрос(0)

Ваш ответ на вопрос