DrawText Psychtoolbox вызывает так много пропущенных сальто (Matlab) - PullRequest
0 голосов
/ 21 мая 2018

У меня проблемы с синхронизацией в моем эксперименте, я пытаюсь реализовать SSVEP-орфографию с мигающими окнами.В каждом кадре я реализую следующий код, который создает прямоугольник с указанным цветом, и я использую «DrawText», чтобы указать текст букв.Тем не менее, когда я это делаю, количество пропущенных сальто очень велико (выше 90%), когда я удаляю весь текстовый рисунок, производительность нормальная и очень хорошая (около 1%).

Я использую 64-битное окно 7 с Matlab 2017b, Psychtoolbox-3, я установил Gstreamer.

Мой вопрос: как правильно отобразить текст без проблем с производительностью?Я пробовал DrawText и DrawFormattedText, но без изменений.Я пытался сохранить буквы в текстуре и загрузить текстуру, но я не уверен, как отобразить текст и нарисовать над ним прямоугольники, при этом оба они появляются.

Большое спасибо.

function all_rects = create_rects(char_struct,window,drawing_colors,drawing_color_index,black,cue,text_texture)
penWidthPixels = 2;

Screen('TextFont', window, 'Courier New');
Screen('TextSize', window, 15);


num_targets = length(char_struct);
all_rects = nan(4,num_targets);
for i=1:num_targets
    baseRect = [0 0 char_struct(i).size(1) char_struct(i).size(2)];
    all_rects(:,i) = CenterRectOnPointd(baseRect, char_struct(i).x_location, char_struct(i).y_location);      
    Screen('FillRect',window,reshape(drawing_colors(drawing_color_index(i)+1,:),[1,3]),all_rects(:,i));
    if length(char_struct(i).text) > 1 && ~strcmp(char_struct(i).text,'SPACE')
         Screen('DrawText',window, char_struct(i).text,char_struct(i).x_location-15, char_struct(i).y_location+3,0, 100)
    elseif strcmp(char_struct(i).text,'SPACE')
         Screen('DrawText',window,char_struct(i).text,char_struct(i).x_location-40,char_struct(i).y_location+3,0,100);
    else
        Screen('DrawText',window, char_struct(i).text,char_struct(i).x_location-5, char_struct(i).y_location+3,0, 100);
    end
end

Screen('FrameRect', window, black, all_rects,penWidthPixels);
if cue ~=0
    Screen('FrameRect', window, [255 0 0], all_rects(:,cue),penWidthPixels);
end

Screen('DrawingFinished', window);

В основном цикле реализовано переключение с помощью:

vbl = Screen('Flip', window,vbl + 0.5 * ifi);

1 Ответ

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

Как вы заметили, предварительное вычисление текста (либо самого текста, либо всего окна) в качестве текстуры сэкономит ресурсы во время цикла представления.Вы можете рисовать прямоугольники поверх текстуры так же, как и другие функции рисования в Psychtoolbox, просто накладывая их на два перед тем, как перевернуть экран:

Screen('DrawTexture', window, text_texture);
Screen('FrameRect', window, black, all_rects, penWidthPixels);
Screen('Flip', window);
...