Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
#1

Удаление переменной, уменьшение нагрузки процессора - C++

23.06.2013, 09:07. Просмотров 835. Ответов 21
Метки нет (Все метки)

Доброго времени суток. У меня есть цикл который находится в таймере (openGl), в этом цикле при каждой итерации создается спрайт и сразу рисуется. Но так память очень засоряется и нагрузка ЦП растет в арифметической прогрессии. Как бы можно было удалять эту переменную-спрайт, чтоб нагрузка не росла? (пробовал memset (с 0), delete, но не помогает).
Вот примерный код моего цикла
C++
1
2
3
4
5
6
7
8
9
void render () // функция таймера
{
       for(int i=0;i<n;i++)//цикл
       {
             Sprite a = Sprite();//создаем спрайт
             a.draw();//рисуем
             //здесь хотелось бы удалить переменную a
       }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 09:07     Удаление переменной, уменьшение нагрузки процессора
Посмотрите здесь:

C++ Уменьшение зависимостей скомпилированной программы
C++ Уменьшение времени выполнения цикла
C++ Уменьшение числа(динамика)
C++ Удаление переменной типа класса
Уменьшение времени работы программы C++
C++ a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b
Уменьшение количества циклов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 10:31     Удаление переменной, уменьшение нагрузки процессора #2
Не совсем понятно, почему растёт нагрузка. Сам Sprite как создаётся? В динамической памяти?
Issues
430 / 365 / 37
Регистрация: 06.08.2012
Сообщений: 961
23.06.2013, 10:35     Удаление переменной, уменьшение нагрузки процессора #3
@integerBrain, а если создать тот спрайт вне цикла? А в цикле, присваивать ему просто новые значения.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 10:39     Удаление переменной, уменьшение нагрузки процессора #4
Деструктор, с освобождением памяти, у Sprite есть?

Добавлено через 1 минуту
Если есть, то можно так попробовать:
C++
1
2
3
4
5
6
7
8
9
10
void render () // функция таймера
{
       for(int i=0;i<n;i++)//цикл
       {
            { Sprite a = Sprite();//создаем спрайт
             a.draw(); } //рисуем
 
             //здесь хотелось бы удалить переменную a
       }
}
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
23.06.2013, 10:47     Удаление переменной, уменьшение нагрузки процессора #5
Попробовать-то можно, но чем это принципиально отличается от исходного варианта?
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 10:56     Удаление переменной, уменьшение нагрузки процессора #6
Цитата Сообщение от Somebody Посмотреть сообщение
Попробовать-то можно, но чем это принципиально отличается от исходного варианта?
Как это чем? При выходе из созданной локальной области, сработает деструктор и память освосбодится под a.

Добавлено через 4 минуты
Если она, конечно, выделяется в конструкторе.
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:32  [ТС]     Удаление переменной, уменьшение нагрузки процессора #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Не совсем понятно, почему растёт нагрузка. Сам Sprite как создаётся? В динамической памяти?
На сколько я знаю чтоб создать Sprite в динамической памяти нужно new Sprite();. А что дальше?
/////////////////////////////////////////////////////////////////////////////////////
Цитата Сообщение от alsav22 Посмотреть сообщение
Как это чем? При выходе из созданной локальной области, сработает деструктор и память освосбодится под a.

Добавлено через 4 минуты
Если она, конечно, выделяется в конструкторе.
А как мне выделить память в конструкторе и, что потом делать в деструкторе?
/////////////////////////////////////////////////////////////////////////////////////
Цитата Сообщение от SeregaC++ Посмотреть сообщение
@integerBrain, а если создать тот спрайт вне цикла? А в цикле, присваивать ему просто новые значения.
Я делаю текстовое поле на OpenGl, каждый символ это спрайт, а спрайт загружает в себя картинку. Текст может в любой момент изменится и потому нужно заново рисовать все символы.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 11:41     Удаление переменной, уменьшение нагрузки процессора #8
Вы попробовали, как я предложил в 4 посте?

Добавлено через 1 минуту
Sprite это ваш класс или библиотечный?
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:41  [ТС]     Удаление переменной, уменьшение нагрузки процессора #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы попробовали, как я предложил?
Конкретно с своим примером нет, но я создавал переменную с каким-то значением и потом пробовал delete её, но при этом количество байт использоваемое программой не изменилось.
//////
Мой, вообще он называется Sprite2D.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 11:45     Удаление переменной, уменьшение нагрузки процессора #10
грузить картинки в функции отрисовки - это бред вообще. спрайты должны быть готовы для отрисовки к моменту этой отрисовки, иначе, при таком подходе рендеринг будет жутко тормозной.
и прежде чем бороться за меньшее потребление памяти - убедитесь что это действительно проблема. убеждаться нужно правильными тулзами, а не каким-нибудь таскменеджером.
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:49  [ТС]     Удаление переменной, уменьшение нагрузки процессора #11
Цитата Сообщение от DU Посмотреть сообщение
грузить картинки в функции отрисовки - это бред вообще. спрайты должны быть готовы для отрисовки к моменту этой отрисовки, иначе, при таком подходе рендеринг будет жутко тормозной.
Да не в этом же проблема. Я могу создавать спрайты в момент введения текста и забивать их в вектор, а в функии отрисовки рисовать, проблема в том, что "старые" спрайты "старого" текста (которые уже не нужны) остаются в памяти и грузят её. Каждый символ прибавляет к загрузке ЦП n-ое количество байт. И это плохо.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 11:56     Удаление переменной, уменьшение нагрузки процессора #12
что-то я не понимаю. вы утверждаете, что если я выделю скажем килобайт и буду его просто держать в памяти , ничего с ним не делая, то загрузка процессора будет скажем на n очков. а если мегабайт - то проц нагрузится на 1024*n очков. так чтоли?
Если что-то висит в памяти, то значит ее не зачистили. И это не за счет того, что локальные переменные какие-то плохие. Просто чей-то деструктор неверно отрабатывает. Конкретно в приведенном коде утечек никаких нет. Нужно смотреть деструкторы спрайтов.
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:59  [ТС]     Удаление переменной, уменьшение нагрузки процессора #13
Цитата Сообщение от DU Посмотреть сообщение
что-то я не понимаю. вы утверждаете, что если я выделю скажем килобайт и буду его просто держать в памяти , ничего с ним не делая, то загрузка процессора будет скажем на n очков. а если мегабайт - то проц нагрузится на 1024*n очков. так чтоли?
Если что-то висит в памяти, то значит ее не зачистили. И это не за счет того, что локальные переменные какие-то плохие. Просто чей-то деструктор неверно отрабатывает. Конкретно в приведенном коде утечек никаких нет. Нужно смотреть деструкторы спрайтов.
Мне конечно ужасно стыдно это говорить, но все деструкторы моих классов пусты. Я, к сожалению, с памятью не умею работать.
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 12:02     Удаление переменной, уменьшение нагрузки процессора #14
Цитата Сообщение от integerBrain Посмотреть сообщение
Мой, вообще он называется Sprite2D.
Покажите конструктор вашего класса.
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:05  [ТС]     Удаление переменной, уменьшение нагрузки процессора #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Покажите конструктор вашего класса.
C++
1
2
3
4
5
6
Sprite2D::Sprite2D(void)
{
    parent = NULL;
    texturesInfo.push_back(NULL);
    texturesInfo.push_back(NULL);
}
Вот, на всякий случай заголовочный файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma once
#include <iostream>
#include "Graphics2D.h"
#include <gl\glut.h>
#include <gl\GLAux.h>
#include "Object2D.h"
using namespace std;
class Sprite2D : public Object2D
{
private:
    unsigned int textures[2];
    void drawTextures(void);
public:
    char* pathToTexture;
    char* pathToMask;
    vector<AUX_RGBImageRec *> texturesInfo;
    vector<Sprite2D *> childs;
    Graphics2D graphics;
    Sprite2D(void);
    Object2D *parent;
    Vector2D globalPos;
    void loadBmpTexture(char *url);
    void loadBmpMask(char *url);
    void addChild(Sprite2D* child);
    void drawTexture(int i);
    //object 2D
    virtual bool hitTestObject(Object2D object);
    virtual bool hitTestPoint(Vector2D point);
    virtual void draw(void);
    virtual void render(void);
    //
    ~Sprite2D(void);
};
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 12:09     Удаление переменной, уменьшение нагрузки процессора #16
Реализацию draw() покажите.
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:11  [ТС]     Удаление переменной, уменьшение нагрузки процессора #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Реализацию draw() покажите.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void Sprite2D::draw(void)
{
    if(visible)
    {
        glPushMatrix();
        glTranslated(x, y, 0);
        glRotated(rotation, 0, 0, 1);
        glScaled(scaleX, scaleY, 1);
        //draw texture рисую текстуру
        drawTextures();
                //рисую детей
        for(int i=0;i<childs.size();i++)
        {
            childs[i]->draw();
        }
        //
        glPopMatrix();
    }
}
 
void Sprite2D::drawTextures(void)
{
    glEnable(GL_BLEND);
    //draw mask
    glBlendFunc(GL_DST_COLOR,GL_ZERO);
    drawTexture(1);
    //draw texture
    glBlendFunc(GL_ONE, GL_ONE);
    drawTexture(0);
    //
    glDisable(GL_BLEND);
}
В функции drawTexture ничего интересного, только рисование самой текстуры на уровне OpenGl
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 12:17     Удаление переменной, уменьшение нагрузки процессора #18
C++
1
2
   vector<AUX_RGBImageRec *> texturesInfo;
   vector<Sprite2D *> childs;
вот это это что? если это что-то динамически выделенное - то оно будет занимать память и после смерти вашего спрайта. дефолтный деструктор не удалит то, на что указывают элементы этих векторов.

unsigned int textures[2]; - вот это тоже. если текстуры были загружены, то в какой-то момент (например в деструкторе) их нужно выгружать. дефолтный для этого не годится. в нем нужно специальный код для этого писать.

а еще вы говорили что при хранении в векторе своих спрайтов проблема остается. для того, чтобы все было хорошо, помимо правильных деструкторов придется еще написать оператор и конструктор копирования. или запретить их. или еще что-то сделать. просто так такие спрайты в векторе держать не получится. будут глюки.
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:20  [ТС]     Удаление переменной, уменьшение нагрузки процессора #19
Цитата Сообщение от DU Посмотреть сообщение
C++
1
2
   vector<AUX_RGBImageRec *> texturesInfo;
   vector<Sprite2D *> childs;
вот это это что? если это что-то динамически выделенное - то оно будет занимать память и после смерти вашего спрайта. дефолтный деструктор не удалит то, на что указывают элементы этих векторов.

unsigned int textures[2]; - вот это тоже. если текстуры были загружены, то в какой-то момент (например в деструкторе) их нужно выгружать. дефолтный для этого не годится. в нем нужно специальный код для этого писать.
В первом векторе хранится информация о текстуре, в втором другие спрайты который добавлены в данный спрайт. В данном случай childs пустой.
//
Вы не подсказали бы, как выгружать элементы из вектора и массива?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 12:27     Удаление переменной, уменьшение нагрузки процессора
Еще ссылки по теме:

C++ Уменьшение размера программы
Удаление переменной структуры C++
Работа с консолью. Уменьшение нагрузки на ЦП C++
Удаление динамической переменной C++
C++ Увеличение и уменьшение квадрата С++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 12:27     Удаление переменной, уменьшение нагрузки процессора #20
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  vector<int*> v;
  v.push_back(new int(0))
 
} // вот в этом месте деструктор вектора удалит всю память на те
// элементы, которые в нем хранятся. в нашем случае это один указатель на инт.
// но то, на что это указатель указывал - не удалится. это утечка. тут нужно
// явно удалять элементы:
 
{
  vector<int*> v;
  v.push_back(new int(0))
 
  for (auto it = v.begin(), end = v.end(); it != end; ++it)
  {
     delete *it; // удаление для каждого элемента.
  }
}
в вашем случае вместо делете могут быть вызовы, выгружающие текстуры или еще что-то другое. сами по себе они не выгрузятся.
Yandex
Объявления
23.06.2013, 12:27     Удаление переменной, уменьшение нагрузки процессора
Ответ Создать тему
Опции темы

Текущее время: 03:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru