Скорость рендеринга текста SDL2 - PullRequest
0 голосов
/ 21 марта 2020

Я создал симуляцию движения снаряда с сопротивлением воздуха, используя SDL2, используя только симулятор, и на моем компьютере не было текста с частотой около 7000-8000 кадров в секунду. Как только я добавляю 9 различных текстов, ie, высоту, диапазон, скорость ... и их значения в полете объектов на экране, который определяется массивом и значением индекса, все это падает до 90 кадров в секунду. , Это нормально, я sh, и у меня нет проблем с этим, однако это только потому, что я на моем P C, когда я использую свой ноутбук, он будет работать значительно меньше. Я говорю о i77700k и gtx 1080ti, которые будут работать на скорости 90 кадров в секунду, графика Intel HD будет работать со скоростью 1 кадр в секунду. Я получаю текст с помощью sprintf (), а затем рисую его на экране, например так:

void FlightValues::changeAll(SDL_Renderer *renderer, int indexValue)
{
sprintf(heightAtTimeText, "%s %lf%", "Height:" , round(heightValues[indexValue]));
sprintf(rangeAtTimeText, "%s %lf%", "Range:" , rangeValues[indexValue]);
sprintf(verticalVelocityAtTimeText, "%s %lf%", "Vertical velocity:" , 
verticalVelocityValues[indexValue]);
sprintf(horizontalVelocityAtTimeText, "%s %lf%", "Horizontal velocity:" , 
horizontalVelocityValues[indexValue]);
sprintf(resultantVelocityAtTimeText, "%s %lf%", "Resultant velocity:" , 
resultantVelocityValues[indexValue]);
sprintf(velocityAngleAtTimeText, "%s %lf%", "Velocity angle:" , velocityAngleValues[indexValue]);
sprintf(displacementAtTimeText, "%s %lf%", "Displacement:" , displacementValues[indexValue]);
sprintf(resultantAccelerationAtTimeText, "%s %lf%", "Resultant acceleration:" , 
resultantAccelerationValues[indexValue]);
sprintf(timeInFlightAtTimeText, "%s %lf%", "Time in flight:" , timeValues[indexValue]);

freeAll();

heightAtTime.setup(renderer, heightAtTimeText, 700, 100, 20, BLACK);
rangeAtTime.setup(renderer, rangeAtTimeText, 700, 140, 20, BLACK);
verticalVelocityAtTime.setup(renderer, verticalVelocityAtTimeText, 700, 180, 20, BLACK);
horizontalVelocityAtTime.setup(renderer, horizontalVelocityAtTimeText, 700, 220, 20, BLACK);
resultantVelocityAtTime.setup(renderer, resultantVelocityAtTimeText, 700, 260, 20, BLACK);
velocityAngleAtTime.setup(renderer, velocityAngleAtTimeText, 700, 300, 20, BLACK);
displacementAtTime.setup(renderer, displacementAtTimeText, 700, 340, 20, BLACK);
resultantAccelerationAtTime.setup(renderer, resultantAccelerationAtTimeText, 700, 380, 20, BLACK);
timeInFlightAtTime.setup(renderer, timeInFlightAtTimeText, 700, 420, 20, BLACK);


}


void FlightValues::drawAll(SDL_Renderer *renderer)
{
heightAtTime.drawText(renderer);
rangeAtTime.drawText(renderer);
verticalVelocityAtTime.drawText(renderer);
horizontalVelocityAtTime.drawText(renderer);
resultantVelocityAtTime.drawText(renderer);
velocityAngleAtTime.drawText(renderer);
displacementAtTime.drawText(renderer);
resultantAccelerationAtTime.drawText(renderer);
timeInFlightAtTime.drawText(renderer);
}

функция "freeAll ()" освобождает поверхности / текстуры каждого текстового объекта, который должен чтобы изменить это. установка функции просто создает для нее текстуру, чтобы ее можно было нарисовать. А функция drawText использует SDL_RenderCopy (). Я не знаю, как это оптимизировать.

1 Ответ

0 голосов
/ 21 марта 2020

Наивный способ оптимизировать это состоит в том, чтобы уменьшить: 9 sprintf, 9xsetup renderer, 9 drawText только до одного.

Вы определенно можете использовать «один буфер» для переноса текста в него.

Тогда я бы посоветовал взглянуть немного глубже, используя gprof перед вашим двоичным файлом, скомпилированным с CFLAGS = -pg. gprof сможет отслеживать каждый файл ".o", если он собран с "-pg", поэтому вам нужно перекомпилировать все SDL, если вы хотите увидеть, где находится узкое место, но я подозреваю, что это может быть проблемой на ТТФ lib здесь.

...