Почему моя игра отстает, когда я играю в этот файл .wav? - PullRequest
1 голос
/ 02 мая 2020

Итак, я делаю игру, и я заметил, что когда я пытался проигрывать звук, когда игрок повышается, он отстает от игры на целую секунду. publi c void tick() вызывается 60 раз в секунду.

И я уже проверил это, и единственное, что отстает в моей игре, это аудио часть этого класса

public void tick() {
    if (Game.startPressed == true) {
        if (HUD.HEALTH != 0) {
            if (Game.gamePaused == false) {
                playerScoreKeep++;
                playerScoreKeepShield++;
                if (playerScoreKeepShield >= 3000) {
                    playerScoreKeepShield = 0;
                    handler.addObject(new BasicShield(r.nextInt(Game.WIDTH - 17), r.nextInt(Game.HEIGHT - 17), ID.BasicShield, handler));
                }
                if (playerScoreKeep >= 1000) {
                    try { //This is the part that's causing the game to lag spike really bad
                        AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(this.getClass().getResource("/lvl_up.wav"));
                        Clip clip = AudioSystem.getClip();
                        clip.open(audioInputStream);
                        clip.start();
                    } catch(Exception ex) {
                        System.out.println("Error with playing sound.");
                        ex.printStackTrace();
                    }
                    playerScoreKeep = 0;
                    HUD.playerLevel++;
                    handler.addObject(new BasicHP(r.nextInt(Game.WIDTH - 17), r.nextInt(Game.HEIGHT - 17), ID.BasicHP, handler));
                    for (int g = 0; g < 2; g++) handler.addObject(new BasicEnemy(r.nextInt(Game.WIDTH - 17), r.nextInt(Game.HEIGHT - 17), ID.BasicEnemy, handler));
                    if (HUD.playerLevel >= 5) {
                        advRandomDir = r.nextInt(3);
                        if (advRandomDir == 1) { 
                            handler.addObject(new AdvancedEnemy(10, r.nextInt(Game.HEIGHT), ID.AdvancedEnemy, handler));
                        }
                        else if (advRandomDir == 2) {
                            handler.addObject(new AdvancedEnemy(r.nextInt(Game.WIDTH), 32, ID.Advancedenemy, handler));
                        } else {
                            handler.addObject(new AdvancedEnemy(r.nextInt(Game.WIDTH), 32, ID.AdvancedEnemy, handler));
                        }
                        handler.addObject(new BasicEnemy(r.nextInt(Game.WIDTH - 17), r.nextInt(Game.HEIGHT - 17), ID.BasicEnemy, handler));
                        if (HUD.playerLevel == 8) {
                            handler.addObject(new ChaoticEnemy(Game.WIDTH/2, Game.HEIGHT/2, ID.ChaoticEnemy, handler));
                        } else if (HUD.playerLevel == 9) {
                            ChaoticEnemy.ChaoticEnemy_Bullet_Speed = 25;
                            for (int i = 0; i < handler.object.size(); i++) {
                                GameObject tempObject = handler.object.get(i);
                                if (tempObject.getID() == ID.ChaoticEnemy) if (HUD.HEALTH != 0) {
                                    tempObject.velX = 2;
                                    tempObject.velY = 2;
                                }
                            }
                        } else if (HUD.playerLevel == 15) {
                            ChaoticEnemy.ChaoticEnemy_Bullet_Speed = 20;
                            for (int i = 0; i < handler.object.size(); i++) {
                                GameObject tempObject = handler.object.get(i);
                                if (tempObject.getID() == ID.ChaoticEnemy) if (HUD.HEALTH != 0) {
                                    tempObject.velX = 3;
                                    tempObject.velY = 3;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

1 Ответ

4 голосов
/ 02 мая 2020

Это связано с тем, что диск читается в потоке каждый раз, когда вы заходите в этот раздел. Игровому потоку необходимо l oop 60 раз в секунду (каждые 16 мс), чтобы получить плавное отображение, а чтение этого звука с диска занимает более 16 мс. В результате ваша игра отстает.

Я думаю, что для небольших звуковых эффектов, таких как этот, лучше всего определенно предварительно загрузить звук в память и воспроизводить его по мере необходимости. Возможно, вам придется использовать другой подход для более тяжелых ресурсов, таких как background musi c.

В качестве альтернативы, если вы должны читать его с диска в каждой игре, вы захотите сделать это одновременно (то есть в другом потоке), чтобы ваш игровой поток не блокировал ожидание чтения данных с диска. Недостатком этого подхода является то, что звук, вероятно, будет звучать немного позже, чем хотелось бы (но, по крайней мере, игра не заикается в ожидании загрузки).

В общем, вы хотите убедиться, что ваша игра l oop выполняет только очень легкие транзакции в потоке. Вы должны постоянно искать способы делать тяжелые транзакции раньше времени или вне потока.

...