Я делаю короткую игру в обработке, хотя у меня проблема с аварийным завершением программы, если я оставляю ее запущенной слишком долго. Когда я открываю программу, память медленно увеличивается до 800 МБ, затем, когда она приближается к 900 МБ, она умирает и медленно возвращается обратно. Всякий раз, когда он достигает около 500 МБ, программа вылетает. Я довольно новичок в использовании Processing, поэтому я, вероятно, просто что-то забыл, и счетчик выходит из-под контроля, но мне кажется, что я не могу найти проблему. Спасибо за прочтение.
(Все изображения в файле являются заполнителями)
Мне не удалось разобраться в проблеме, я уже исследовал "System.gc ();" но я не уверен, является ли это частью проблемы и как ее реализовать, как я уже пытался.
//Imports
import processing.sound.*;
//Global variables
int gameState = 0; //Using an integer value just in case I want to add more maps in future updates
int backX = 1800; //Current background x value
float theta = 0.0; //Used to control sin wave for oscillation
int menuCounter = 0; //Main menu space bar counter
int menuSpaceSize = 25; //Space text size
int menuSpaceX = 90; //Space text menu
float menuSpaceModifier = 1.0; //Allows for space text movement
int mainMenuX = 50; //Main menu x position
color spaceColor = color(255); //Color the space text is (used for color changes on space press)
boolean[] keys = new boolean[4]; //WASD keys
PImage backImage; //Images
SoundFile select, bg, menubg; //Sound files
boolean bgPlay, menuPlay = false; //Music Playing boolean
//Setup function (Runs once)
void setup() {
//Set frame name
surface.setTitle("Game");
//Size
size(600, 600, P3D);
//Load images
backImage = loadImage("https://github.com/Attaxika/stuff/blob/master/BackgroundImage.png?raw=true");
//Load sound files
select = new SoundFile(this, "https://raw.githubusercontent.com/Attaxika/stuff/master/select.wav?raw=true");
bg = new SoundFile(this, "https://raw.githubusercontent.com/Attaxika/stuff/master/bg.mp3?raw=true");
menubg = new SoundFile(this, "https://raw.githubusercontent.com/Attaxika/stuff/master/menu.wav?raw=true");
}
//Draw function (Runs 60 times a second)
void draw() {
//Reset opacity
tint(255, 255);
//Reset color
fill(0);
//Make smooth
smooth();
//Background
background(0, 0, 0);
//Framerate set
frameRate(60);
//If the game isn't running
if(gameState == 0) {
//Stop background music
bg.stop();
bgPlay = false;
//Start menu music
if(!menuPlay) {
menuPlay = true;
menubg.amp(1);
menubg.loop();
}
//Main menu
textSize(50);
//y value for main menu text oscillation
float y = (sin(theta) + 1 ) * 20;
//Increment theta
theta += 0.05;
//Primary game menu
fill(255, 0, 0);
text("Game Menu", width/2 - 150, y + 75);
//4th fill value represents alpha
fill(255, 255, 255, 25);
//Shadow Text
text("Game Menu", width/2 - 155, y + 74);
//Space to start text
fill(spaceColor);
textSize(menuSpaceSize);
text("Space to Start", (width/2 - menuSpaceX) + menuSpaceModifier, 200);
//Check for space pressed
if(menuCounter > 0 && menuCounter < 30) {
menuCounter += 1;
menuSpaceSize = 30;
menuSpaceX = 140;
menuSpaceModifier += 20;
}
//Check for space timer
if(menuCounter == 29) {
gameState = 1;
}
}
//If the game is running
else if(gameState == 1) {
//Music start
if(!bgPlay) {
//Stop menu music
menuPlay = false;
menubg.stop();
bgPlay = true;
bg.amp(.40);
bg.loop();
}
//Background image
imageMode(CENTER);
image(backImage, backX, backImage.height / 2, backImage.width, backImage.height);
backX -= 1;
//Reset background x if it gets to the end
if(backX <= 0) {
backX = 1800;
}
}
//Unknown gameState
else {
exit();
}
}
//Key pressing (Keyboard input)
void keyPressed() {
//Pressed space & is on menu
if(key == ' ' && gameState == 0 && menuCounter == 0) {
spaceColor = color(0, 255, 0);
menuCounter += 1;
select.play();
bgPlay = true;
}
}
Ожидаемый результат: он будет работать в течение длительного периода времени, не занимая память до точки, в которой происходит сбой.
EDIT:
Кто-то ответил, но удалил свой ответ, но я следовал некоторым инструкциям, но безрезультатно. Я добавил следующий код в свою программу, теперь экран меню работает неопределенно долго с низким использованием памяти, но при входе в настоящую игру (gameState = 1) происходит сбой, утверждая, что у него есть NullPointerException at image (backImage, backX, backImage .height / 2, backImage.width, backImage.height); "
Вот что я добавил сразу после моего "void draw () {"
clear();
if(backImage!=null) {
image(backImage, backX, backImage.height / 2, backImage.width, backImage.height);
}
if(millis() > 20000 && backImage!=null) {
g.removeCache(backImage);
backImage = null;
}
System.gc();