gpt4 book ai didi

rust - 如果我在调用 present 之前更改 Canvas 的 vew_port,为什么会有旧图像闪烁?

转载 作者:行者123 更新时间:2023-12-03 11:43:45 25 4
gpt4 key购买 nike

我用 Rust/SDL 写了一个小演示,它可以淡入和淡出图像,以及一些偶尔的随机规范。它 super 流畅而且很好,最高可达 250 fps。
我决定将更改添加到 canvas.set_viewport在具有随机尺寸的每一帧上。基本上,相同的流纹理(在每一帧上都填充了新的色调或噪声)是在随机位置以随机大小绘制的。
我发现已经渲染的矩形有一个(无法解释的)闪烁。
我试过截屏,但在视频上没有闪烁。我使用的是普通相机(60fps),没有闪烁。我在手机中使用了高速模式并记录了闪烁,但它看起来与我看到的非常不同。
它是什么?
代码:https://github.com/amarao/sdl_random/tree/c4757190712f0a996c2aba88b105462942d4ca27/src
非闪烁屏幕截图:https://www.youtube.com/watch?v=Zud9Hjwltxk
闪烁视频(高速):https://youtu.be/rVZki9COuZ0
第二个问题:如果这是我的 GPU(nvidia)的某种“欠精细行为”,为什么会这样?是否支持即时更改视口(viewport)?
编辑:我将调用更改为 set_viewport变成 rect canvas.copy 的参数:

canvas.copy(
&texture, None,
sdl2::rect::Rect::new(
new_x as i32,
new_y as i32,
new_width,
new_height
)
).unwrap();
但结果是完全一样的。

最佳答案

这是由于双缓冲 (wikipedia)。渲染系统同时使用两个缓冲区:一个正在呈现,另一个正在写入。您可以通过检查 video_system.gl_attrs().double_buffer() 来验证是否在 SDL2 中启用了此功能。 .
您在相同的缓冲区上迭代绘制而不清除或重绘它们。因此,一个缓冲区将包含从偶数帧绘制的所有内容,而另一个缓冲区将包含奇数帧。因此,闪烁是由它们之间的交换引起的,因为它们的内容非常不同。

关于rust - 如果我在调用 present 之前更改 Canvas 的 vew_port,为什么会有旧图像闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66617330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com