You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SFML开发国际象棋时窗口缩放导致RenderTexture出现异常白边

问题根因

sf::RenderTexture的所有绘制操作(包括clear、draw)都是离屏渲染,必须调用display()方法才能将绘制结果同步到对应的纹理中。你当前代码在createBoard方法中完成棋盘绘制后没有执行该操作,缩放窗口时新生成的RenderTexture内容没有提交到纹理,getTexture()返回的还是旧尺寸的纹理数据,无法铺满整个窗口,就会漏出主循环中window.clear设置的白色背景,也就是你看到的白边。

修复方法

修改Board.cpp中的createBoard方法,在绘制完所有棋盘方块后添加board.display()调用即可:

#include <SFML/Graphics.hpp>
#include "Board.h"

void Board::createBoard(sf::Vector2u windowSize)
{
    const float xOffset = static_cast<float>(windowSize.x - windowSize.y) / 2.f;
    const float squareSize = static_cast<float>(windowSize.y) / 8.f;

    board.create(windowSize.x, windowSize.y);
    board.clear(backColor);

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            sf::RectangleShape currSquare({ squareSize, squareSize });
            currSquare.setFillColor((i + j) % 2 ? lightColor : darkColor);
            currSquare.setPosition(xOffset + static_cast<float>(i) * squareSize, (static_cast<float>(j) * squareSize));
            board.draw(currSquare);
        }
    }
    // 新增此行,同步离屏渲染结果到纹理
    board.display();
}

可选优化

你当前的实现每次窗口缩放都会重新创建RenderTexture并重绘所有方块,性能开销更高。可以改为调整窗口视图的视口保持1:1的棋盘比例,不需要每次重绘整个棋盘,只需要调整绘制位置即可。

内容的提问来源于stack exchange,提问作者Cxmu03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 04:15:02