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

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

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

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

23.06.2013, 09:07. Просмотров 862. Ответов 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++
Значит имеется следующий код: #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
5417 / 4813 / 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
5417 / 4813 / 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
2788 / 1602 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
23.06.2013, 10:47 #5
Попробовать-то можно, но чем это принципиально отличается от исходного варианта?
alsav22
5417 / 4813 / 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
5417 / 4813 / 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
1483 / 1059 / 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
1483 / 1059 / 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
5417 / 4813 / 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);
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2013, 12:05
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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