openGL ES双缓冲描画导致闪屏
- 其实双缓冲,就是用来解决闪屏问题的。但存在这么一种情况,使得采用双缓冲描画会导致闪屏问题:一个进程(由于某些限制只能申请一个On- screen Surface)中,需要在两个不同的位置,同时显示不同的内容。
- 这种情况,会导致如下问题(A、B表示需要在不同位置显示的Buffer。A0,表示A Buffer的第0帧)
时间\screen | on(上屏Buffer) | off(离屏Buffer) |
---|---|---|
T1 | A0 B0 | A1 B0 |
T2(上屏swap) | A1 B0 | A0 B0 |
T3 | A1 B0 | A0 B1 |
T4(上屏swap) | A0 B1 | A1 B0 |
- 从T3到T4,这一时间段,会导致闪屏。因为,双缓冲通过swap上屏,将on和off的数据对换(其实就是指针指向的内容换了一下)。所以,在T4上屏的时候,A位置,对应的离屏Buffer是旧的。
解决方案
- 这种提供一种解决方案:在swap后,更新一下离屏(off)Buffer。具体情况如下:
时间\screen | on | off |
---|---|---|
T1 | A0 B0 | A1 B0 |
T2(上屏) | A1 B0 | A0 B0 |
T2(更新) | A1 B0 | A1 B0 |
T3 | A1 B0 | A1 B1 |
T4(上屏) | A1 B1 | A1 B0 |
T4(更新) | A1 B1 | A1 B1 |
- 如上所示,每次swap后,更新一下离屏数据。这样再次上屏时,就不会导致闪屏发生。