我必须从 CD/DVDrom 读取一个包含许多动画帧的大文件,并将其作为动画显示到屏幕上。从硬盘读取时,将一帧读入内存,处理,显示然后读取下一帧的策略效果很好,但是当我从光学设备读取时,访问时间会杀死动画。
我使用 C 和 winapi OpenFile/ReadFile 方法。
我应该如何读取存储在光学设备上的文件的内容以实现动画的实时速度(我见过一个即使以双倍速度执行的程序,确保它不会在动画开始之前缓冲整个文件)?
我必须从 CD/DVDrom 读取一个包含许多动画帧的大文件,并将其作为动画显示到屏幕上。从硬盘读取时,将一帧读入内存,处理,显示然后读取下一帧的策略效果很好,但是当我从光学设备读取时,访问时间会杀死动画。
我使用 C 和 winapi OpenFile/ReadFile 方法。
我应该如何读取存储在光学设备上的文件的内容以实现动画的实时速度(我见过一个即使以双倍速度执行的程序,确保它不会在动画开始之前缓冲整个文件)?
两种技术:
LARGE 缓冲区或缓存,如多个 MB。CD/DVD 具有合理的顺序 I/O,但查找/访问速度非常慢(如您所述),因此重新填充缓冲区很快。你只需要足够大的缓冲区来覆盖几秒钟,以允许磁盘在需要时启动,如果已经启动,则进行查找。
多线程:保持一个线程连续读取和一个单独的线程解码动画。如果阅读器线程在解码之前太早,它应该阻塞。
这些技术适用于任何编程语言,并且可以组合以获得最佳效果。一个读取缓冲区和一个解码帧缓冲区可以双重保护您免受解码时间和访问时间的影响。
编辑: 这些是 MPlayer 使用的技术。此外,如果可以的话,你应该考虑你的编码格式——不同的格式可以在解码时牺牲 CPU 时间来减少从磁盘读取的数据。用于估计应该压缩多少视频的几条信息。
编辑2:附加信息
要尝试的一件事是压缩。例如,从驱动器加载一个 zip 文件将花费更少的时间,但需要更多的 CPU 时间来处理。如果无损压缩是可能的,那么这可能值得检查。了解 CD 驱动器也很有用。驱动器以固定的旋转速度旋转。这意味着磁盘外部的数据加载速度比内部数据快。但是,刻录机会从内向外刻录数据,因此您可能最终不得不在“动画”之前刻录大量数据以获得最大读取速度。
使用带有 OPEN_ALWAYS 和 FILE_FLAG_SEQUENTIAL_SCAN 的CreateFile