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