You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于随机数切换背景时屏幕闪烁问题求助

解决背景频繁闪烁的问题

嘿,我完全懂你现在的困扰——每帧都随机切换背景,屏幕不闪才怪呢!咱们来拆解问题,然后一步步修复它:

问题根源

你的render()方法是游戏每帧都会执行的(通常每秒60次甚至更多),现在你每次进入render都:

  1. 新建一个Random实例
  2. 立刻生成随机数切换背景,还重新创建Texture对象
    这就相当于每帧都在随机换图,视觉上就是疯狂闪烁,而且频繁创建Texture还会造成内存资源浪费,搞不好还会触发频繁GC拖慢游戏。

修复方案

我们需要做两个核心调整:提前加载资源+控制切换频率,而不是每帧都乱切换。

1. 提前加载所有背景纹理

把需要用到的背景图在游戏初始化阶段(create())就加载好,存在成员变量里,不要每次render都重新创建。

2. 控制背景切换的时机

比如设置一个固定间隔(比如5秒切换一次),或者只在特定事件触发时切换(比如玩家点击、关卡完成),而不是每帧都随机选。

修改后的完整代码示例

// 定义成员变量,存储所有背景和当前显示的背景
public Texture background1;
public Texture background2;
public Texture currentBackground;
private Random random;
private float switchTimer; // 记录距离下次切换的时间
private float switchInterval = 5f; // 每隔5秒切换一次,可根据需求调整

@Override
public void create() {
    // 初始化阶段加载所有背景纹理
    background1 = new Texture("background1.png");
    background2 = new Texture("background2.png");
    
    // 只创建一次Random实例,避免重复初始化
    random = new Random();
    
    // 初始随机选一个背景显示
    currentBackground = random.nextInt(2) == 0 ? background1 : background2;
    
    // 初始化计时器
    switchTimer = 0f;
}

@Override
public void render(float delta) {
    // 累加计时器(delta是上一帧到当前帧的时间差,单位秒)
    switchTimer += delta;
    
    // 当计时器达到设定间隔,切换背景并重置计时器
    if (switchTimer >= switchInterval) {
        currentBackground = random.nextInt(2) == 0 ? background1 : background2;
        switchTimer = 0f;
    }
    
    // 统一绘制当前背景,不用在switch里重复写batch代码
    batch.begin();
    batch.draw(currentBackground, 0, 0);
    batch.end();
}

// 记得在游戏销毁时释放纹理资源,避免内存泄漏
@Override
public void dispose() {
    background1.dispose();
    background2.dispose();
    batch.dispose();
}

额外提示

  • 如果不想定时切换,而是需要其他触发逻辑(比如玩家点击屏幕切换),只需要把currentBackground = ...这段切换代码放到对应的事件处理方法里(比如touchDown())就行,完全不用在render里处理。
  • 永远不要在render()里频繁创建对象(比如原代码里的new Random()new Texture()),这会严重影响游戏性能。

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

火山引擎 最新活动