SDL2文本渲染速度

问题描述 投票:0回答:1

我仅使用模拟器就使用SDL2创建了具有空气阻力的弹丸运动模拟,并且计算机上没有文本以大约7000-8000 fps的速度运行。一旦我添加了9个不同的文本,即高度,范围,速度...以及它们在屏幕上飞行的对象中的值(由数组和索引值确定),整个对象就会降至90 fps。没关系,我对此没有任何问题,但这仅是因为即时通讯在我的PC上,当我使用笔记本电脑时,它的运行速度会大大降低。我说的是i77700k和gtx 1080ti以90 fps的速度运行,英特尔高清显卡将以1 fps的速度运行。我通过使用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()。我不知道该如何优化了。

c++ sdl-2
1个回答
0
投票

最简单的优化方法是将9 sprintf,9xsetup渲染器和9 drawText减少到一个。

您绝对可以使用“一个缓冲区”将文本拖到其中。

然后,我建议在用CFLAGS = -pg编译的二进制文件前面使用gprof来更深入地研究。如果使用“ -pg”构建gprof文件,gprof将能够跟踪每个文件。因此,如果要查看瓶颈所在,则需要重新编译所有SDL,但我怀疑,这可能是perf问题ttf库在这里。

© www.soinside.com 2019 - 2024. All rights reserved.