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

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

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

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

23.06.2013, 09:07. Просмотров 865. Ответов 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
       }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2013, 09:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление переменной, уменьшение нагрузки процессора (C++):

Работа с консолью. Уменьшение нагрузки на ЦП - C++
Значит имеется следующий код: #include &lt;conio.h&gt; #include &lt;iostream&gt; int main() { bool bExit = false; while (!bExit) { ...

Удаление динамической переменной - C++
дайте пример создания и удаления динамической переменной класса (например массива char) или посмотрите, что тут не так ...

Удаление переменной структуры - C++
Здравствуйте! Можете пожалуйста объяснить как удалить переменную структуры study1? Смотрел похожие темы и по существу ничего не нашел. ...

Удаление переменной типа класса - C++
Как удалить переменную типа класса который я сам создал?

a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b - C++
даны произвольные числа a,b и c.Присвоить максимальное из них переменной a,минимальное-переменной c,среднее переменной b.

Присвоить значение наименьшего элемента массива переменной М1, номер строки, где находится этот элемент, - переменной Т, номер столбца - переменной С - C++
Массив С действительных чисел имеет 5 строк и 11 столбцов. Присвоить значение наименьшего элемента массива переменной М1, номер строки, где...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 12:09 #16
Реализацию draw() покажите.
0
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
0
DU
1483 / 1059 / 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]; - вот это тоже. если текстуры были загружены, то в какой-то момент (например в деструкторе) их нужно выгружать. дефолтный для этого не годится. в нем нужно специальный код для этого писать.

а еще вы говорили что при хранении в векторе своих спрайтов проблема остается. для того, чтобы все было хорошо, помимо правильных деструкторов придется еще написать оператор и конструктор копирования. или запретить их. или еще что-то сделать. просто так такие спрайты в векторе держать не получится. будут глюки.
1
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 пустой.
//
Вы не подсказали бы, как выгружать элементы из вектора и массива?
0
DU
1483 / 1059 / 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; // удаление для каждого элемента.
  }
}
в вашем случае вместо делете могут быть вызовы, выгружающие текстуры или еще что-то другое. сами по себе они не выгрузятся.
1
integerBrain
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:35  [ТС] #21
А если я вызову delete для Sprite то это вызовет деструктор ~Sprite() ?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 12:38 #22
вам бы основы почитать.
у локальных переменных его звать не надо.
вам уже написали что проблема не в том, что деструктор Sprite не вызывается (он как раз таки вызывается), а в том, что этот деструктор внутри себя не делает отчистку правильно. и нужно его правильно написать.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 12:38
Привет! Вот еще темы с ответами:

Работа скрипта - уменьшение нагрузки на сервер - PHP
ситуация: есть скрипт который проверяет список ссылок, посылает запрос, получает код ответа, ссылок ~1000, используется класс http_request....

Уменьшение нагрузки на сервер, путем хеширования изображений в базу данных - HTML, CSS
Добрый вечер. У меня есть проект (в разработке), он основан на одном едином сервисе (ASP.NET MVC API), и он имеет одну лишь HTML страницу,...

Предел для нагрузки процессора. - Visual Basic
Вот у меня вопрос. У меня в программе продолжительное время идут вычисления, и процессор загружен на 100% (я естественно пользуюсь...

Какова нормальная температура процессора без нагрузки? - Процессоры
Хотелось бы узнать, сколько должна быть температура процессора без нагрузки? А то у меня на одном пк 35-40 а на другом 60-65


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.06.2013, 12:38
Ответ Создать тему
Опции темы

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