SFML绘制两个矩形异常:仅显示黑屏且显卡满载问题求助
解决SFML中仅显示黑屏且显卡满载的问题
嘿,我来帮你搞定这个问题!你遇到的黑屏和显卡满载问题其实有两个核心原因,咱们一步步拆解解决:
一、黑屏问题的根源
你设置的两个矩形颜色透明度(alpha值)太低了:
background的alpha是3,water的alpha是1,这两个值几乎接近完全透明,而window.clear()默认会把窗口清成黑色,所以画出来的矩形根本看不见,看起来就是黑屏。- 另外你绘制顺序搞反了:如果想做出淡蓝色背景,应该先画底层的蓝色
water,再画上层的淡白色background,这样叠加出来才是自然的淡蓝色效果。
二、显卡满载的原因
你的主循环没有限制帧率,SFML会让显卡全速渲染每一帧,自然会导致显卡满载。另外窗口 resize 时没有更新视图和矩形尺寸,也可能加重不必要的渲染负担。
修改后的完整代码
#include <SFML/Graphics.hpp> #include <ctime> int main() { srand(time(NULL)); sf::RenderWindow window(sf::VideoMode(500, 500), "Fish!", sf::Style::Close|sf::Style::Resize); // 限制帧率,解决显卡满载问题 window.setFramerateLimit(60); sf::RectangleShape water(sf::Vector2f(500,500)); sf::RectangleShape background(sf::Vector2f(500,500)); // 调整颜色透明度,这里改成半透明淡白色,和蓝色叠加出淡蓝色背景 background.setFillColor(sf::Color(255,255,255,100)); water.setFillColor(sf::Color(5,45,255,255)); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { switch (event.type) { case sf::Event::Resized: { // 更新视图,适配窗口大小变化 sf::FloatRect visibleArea(0, 0, event.size.width, event.size.height); window.setView(sf::View(visibleArea)); // 调整矩形尺寸,适配窗口resize water.setSize(sf::Vector2f(event.size.width, event.size.height)); background.setSize(sf::Vector2f(event.size.width, event.size.height)); break; } case sf::Event::Closed: window.close(); break; } } window.clear(); // 先画底层蓝色water,再画上层淡白色background window.draw(water); window.draw(background); window.display(); } return 0; }
关键修改点总结
- 调高了颜色的alpha值,让矩形可见,同时调整绘制顺序实现淡蓝色背景
- 添加
window.setFramerateLimit(60)限制帧率,避免显卡满载 - 处理
Resized事件时更新视图和矩形尺寸,适配窗口大小变化,同时优化渲染效率
内容的提问来源于stack exchange,提问作者sashat
相关产品推荐
相关产品推荐

