#sdl2 #midi #music #learning #piano

sdl2_timing

读取MIDI文件并创建钢琴音符瀑布

2个不稳定版本

0.2.0 2020年3月29日
0.1.0 2020年3月7日

#990 in 音频


用于 rusthesia

MIT 许可证

13KB
236

这是rusthesia的子包


lib.rs:

Sdl2Timing

目的

此包支持为sdl2应用程序获取正确的时序。时序对于避免延迟(速度过慢)或高CPU负载(速度过快)非常重要。sdl2提供了启用vsync同步的可能性,这是在最低CPU负载下响应速度最好的解决方案。

使用CanvasBuilder启用vsync的示例

   let mut canvas = sdl2::render::CanvasBuilder::new(window)
       .accelerated()
       .present_vsync()
       .build()?;

那么为什么需要这个包呢?

至少在macbook air没有外接显示器的情况下,vsync根本不被使用。因此,依赖于vsync以获得适当的速率会导致主循环以最大速率旋转,并创建过高的负载。连接外接显示器后,vsync工作正常。因此,需要一种解决方案,既可以依赖于vsync,也可以使用延迟作为后备方案。

查询window.displayMode()以获取当前帧率并不可靠。至少在一台Linux机器上,报告了60Hz,而以41Hz的速率运行4K显示器。

即使是依赖于vsync也很棘手。首先,canvas.clear()和canvas.present()可以等待vsync发生。其次,对于移动元素的计算,知道下一个帧的时间对于正确的显示位置很重要。

解决方案

此包提供了一个名为Sdl2Timing的单个结构,它提供以下功能:

  • 调用canvas present和canvas clear
  • 主循环中的时序测量
  • 输出时序数据以进行开发
  • 有关实际帧率的详细信息...
  • 下一个帧剩余时间

依赖项

~16MB
~347K SLoC