作者:储兰兰快乐 | 来源:互联网 | 2023-05-25 17:15
如果我无法正确解释自己,你将不得不原谅我,我正在尝试使用c ++ sfml字符串数组创建一个高分表.我试着用它们分别绘制它们window.draw(array[1],array[2]
等等.
但是如果我将数组放在for循环中并使用int变量,它只会绘制数组1,3和5.
for(cnt = 0;cnt <5;cnt++)
{
thiswindow.draw(topscores[cnt]);
thiswindow.draw(topnames[cnt]);
thiswindow.display();
}
Conduit..
7
如Rosme所述,RenderWindow::display
不应在循环内调用.实际上,RenderWindow::display
每帧渲染内容只应调用一次... SFML使用双缓冲,并且RenderWindow::display
是切换后缓冲区的命令.我们花点时间讨论一下这是如何工作的:
当您在双缓冲系统中绘制内容时,实际上绘制到两个单独的表面("缓冲区") - 在任何给定时间,一个被隐藏(发生绘图的缓冲区),并且一个显示在屏幕上.当前用于绘图的隐藏缓冲区称为"后台缓冲区".当RenderWindow::display
调用(或其在其他双缓冲系统中的等效物)时,屏幕上当前显示的缓冲区将成为新的后台缓冲区,并且屏幕上会显示旧的后台缓冲区.这使您可以进行大量更改,同时降低弹出,撕裂或闪烁的风险 - 您永远不会绘制到正在显示的缓冲区.
有了这些知识,您应该了解循环中显示调用的结果:
instruction | back buffer | front buffer (shown)
----------------------------------------------------
| (empty) | (empty)
draw A | A | (empty)
display | (empty) | A
draw B | B | A
display | A | B
draw C | A, C | B
display | B | A, C
draw D | B, D | A, C
display | A, C | B, D
draw E | A, C, E | B, D
display | B, D | A, C, E
因此,在循环完成后,您将看到绘制的第一个,第三个和第五个项目.其他的也被绘制,但存在于后台缓冲区中,在那里它们无法看到.
1> Conduit..:
如Rosme所述,RenderWindow::display
不应在循环内调用.实际上,RenderWindow::display
每帧渲染内容只应调用一次... SFML使用双缓冲,并且RenderWindow::display
是切换后缓冲区的命令.我们花点时间讨论一下这是如何工作的:
当您在双缓冲系统中绘制内容时,实际上绘制到两个单独的表面("缓冲区") - 在任何给定时间,一个被隐藏(发生绘图的缓冲区),并且一个显示在屏幕上.当前用于绘图的隐藏缓冲区称为"后台缓冲区".当RenderWindow::display
调用(或其在其他双缓冲系统中的等效物)时,屏幕上当前显示的缓冲区将成为新的后台缓冲区,并且屏幕上会显示旧的后台缓冲区.这使您可以进行大量更改,同时降低弹出,撕裂或闪烁的风险 - 您永远不会绘制到正在显示的缓冲区.
有了这些知识,您应该了解循环中显示调用的结果:
instruction | back buffer | front buffer (shown)
----------------------------------------------------
| (empty) | (empty)
draw A | A | (empty)
display | (empty) | A
draw B | B | A
display | A | B
draw C | A, C | B
display | B | A, C
draw D | B, D | A, C
display | A, C | B, D
draw E | A, C, E | B, D
display | B, D | A, C, E
因此,在循环完成后,您将看到绘制的第一个,第三个和第五个项目.其他的也被绘制,但存在于后台缓冲区中,在那里它们无法看到.