SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Как освободить память от объектов/текстур
В этой теме 7 ответов, 3 участника, последнее обновление indarium 7 года/лет, 4 мес. назад.
-
АвторСообщения
-
Есть класс некого объекта, который я буду рисовать:
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354class Object{private:float radius;char color;sf::CircleShape shape;sf::String File; // Файл с расширениемsf::Image image; // SFML изображениеsf::Sprite sprite; // SFML спрайтpublic:sf::Texture texture; // SFML текстураstd::map< std::string, sf::Image > images_;Object(sf::String _f, float radius, int red, int green, int blue, float x, float y);void Set(float radius, int red, int green, int blue);void SetP(float x, float y);void draw(sf::RenderWindow &window);~Object();///////////////////////////////////////////////////////////////////////////////////////////////////////////Object::Object(sf::String _f, float radius, int red, int green, int blue, float x, float y){shape.setRadius(radius);// shape.setFillColor(sf::Color(red, green, blue));shape.setPosition(x, y);File = _f;image.loadFromFile("resources/" + File);texture.loadFromImage(image);shape.setTexture(&texture);shape.setTextureRect(sf::IntRect(0, 0, radius, radius));}void Object::Set(float radius, int red, int green, int blue){shape.setRadius(radius);shape.setFillColor(sf::Color(red, green, blue));}void Object::draw(sf::RenderWindow &window){window.draw(shape);}void Object::SetP(float x, float y){shape.setPosition(x,y);}Object::~Object(){}};Рисую так:
C++1234567891011121314151617181920212223242526272829303132333435363738394041std::vector<Object*> a2;for (int i = 0; i < 1000; i++){a2.push_back (new Object("texture.png", 10, 100, 250, 50, i + 20, 50));}while (window.isOpen()){Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Escape))window.close();if (Keyboard::isKeyPressed(Keyboard::A)) // тут удаляю{for (int i = 0; i < 100; i++) {a2.erase(a2.begin());}}}window.pushGLStates();window.draw(text);for (int i = 0; i < 1000; i++){// a1[i]->draw(window);a2[i]->draw(window);}window.popGLStates();window.display();Картинка удаляется, тут никаких вопросов вроде нет. Но я не пойму, как при этом еще и память освободить. Что интересно, FPS при удалении все-таки повышается.
Тебя не смущает то, что ты вызываешь 1000 раз загрузку файла текстуры?
C++12image.loadFromFile("resources/" + File);texture.loadFromImage(image);Уже сделал однократную загрузку,но память все равно не освобождается.
Попробуй после удаления обрезать выделенную память под вектор
a2.shrink_to_fit();Советую почитать ЭТУ статью.
объект автоматом удаляется при выходе из области видимости. то есть если ф-ция
func() {
int a;
}
закончит свое действие – объект “a” удалится.
Попробуй после удаления обрезать выделенную память под вектор
a2.shrink_to_fit();Немного оптимизировал код и обрезал. После capacity и size пишут, что 0, а если верить VS и диспетчеру задач, то память не освобождается.
Если a2 объявлять не как указатель, то все чистится. Попробую разобраться с указателями.
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.