Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
sereja322
3 / 3 / 3
Регистрация: 10.03.2015
Сообщений: 65
1

Слишком долгая прорисовка большого количества прямоугольников

20.06.2015, 01:12. Просмотров 873. Ответов 11
Метки нет (Все метки)

Делаю арканоид на winapi. Раньше у меня была отрисовка каждого объекта при его передвижении, но я всё-таки решил сделать по человечески, с фпэсами, и снова не могу справиться с мерцанием при прорисовке всех блоков.
Цикл отрисовки:
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
int i = 1, q = 1;
            while (game.play) {     // прорисовка всего
                if (MainBall.start != 1) MainBall.SetBall(MainBoard.Get_x(), MainBoard.Get_y() - MainBall.h);       // крепим к доске шар
                SelectObject(Draw.hDC, Draw.OrPen);     // рисуем полоски слева и справа
                MoveToEx(Draw.hDC, 10, 0, NULL);
                LineTo(Draw.hDC, 10, 350);
                SelectObject(Draw.hDC, Draw.BlPen);
                MoveToEx(Draw.hDC, 550, 0, NULL);
                LineTo(Draw.hDC, 550, 350);
                for (int i = 0; i <= game.num_block_y; i++) for (int q = 0; q <= game.num_block_x; q++)
                if (block[i][q].Get_state() == 1) {
                    block[i][q].Display('w');
                }
                MainBall.Display('w');
                MainBoard.Display('w');
 
                for (int y = 0; y <= game.num_block_y; y++) for (int x = 0; x <= game.num_block_x; x++) if (bonus[y][x].Get_visible()) bonus[y][x].Display();
                Sleep(1000/FPS);
                FillRect(Draw.hDC, &Draw.rect, Draw.BBrush);
                //i++; q++;
                //(i >= game.num_block_y) ? i = 1 : i++;
                //(q >= game.num_block_x) ? q = 1 : q++;
 
            }
Посоветуйте что-нибудь.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2015, 01:12
Ответы с готовыми решениями:

Чтения большого количества мелких файлов
Здравствуйте, есть какой либо способ ускорить чтение мелких файлов с диска? ...

Как правильно реализовать двухбуферную отрисовку большого количества полигонов?
Всем привет! Пытался найти способы устранения мерцания при отрисовки большого...

Медленная прорисовка большого количества кнопок на форме
Help! в форме много кнопок. при запуске приложения, кнопки появляются очень...

Долгая прорисовка TabPage или как загрузить сонтрол в память и отобразить когда нужно
Добрый день, товарищи! Я до сих пор не силен в теории и т.д., так что могу что...

Слишком долгая ajax загрузка изображений на сервер
Делал загрузку картинок через объект FileReader, после чего передавал его...

11
jonson
236 / 209 / 84
Регистрация: 18.03.2010
Сообщений: 750
20.06.2015, 11:17 2
Цитата Сообщение от sereja322 Посмотреть сообщение
Посоветуйте что-нибудь.
убери это
Цитата Сообщение от sereja322 Посмотреть сообщение
Sleep(1000/FPS);
0
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 13:57 3
Цитата Сообщение от sereja322 Посмотреть сообщение
Слишком долгая прорисовка большого количества прямоугольников
Цитата Сообщение от sereja322 Посмотреть сообщение
и снова не могу справиться с мерцанием
А вопрос то в чём?
0
sereja322
3 / 3 / 3
Регистрация: 10.03.2015
Сообщений: 65
20.06.2015, 16:17  [ТС] 4
Цитата Сообщение от jonson Посмотреть сообщение
убери это
Sleep(1000/FPS);
стало только хуже.
Цитата Сообщение от castaway Посмотреть сообщение
А вопрос то в чём?
Проблема в том, что блоки слишком долго прорисовываются(а их 42). Может есть какой-нибудь способ решить эту проблему? Может можно как-то в другом потоке формировать картинку всех блоков и выводить её?
Вот этот кусок кода долго выполняется
C++
1
2
3
4
for (int i = 0; i <= game.num_block_y; i++) for (int q = 0; q <= game.num_block_x; q++)
                if (block[i][q].Get_state() == 1) {
                    block[i][q].Display('w');
                }
0
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 16:21 5
Цитата Сообщение от sereja322 Посмотреть сообщение
Проблема в том, что блоки слишком долго прорисовываются(а их 42). Может есть какой-нибудь способ решить эту проблему?
Цитата Сообщение от sereja322 Посмотреть сообщение
убери это
Sleep(1000/FPS);
Цитата Сообщение от sereja322 Посмотреть сообщение
стало только хуже
Это не ответ.
0
sereja322
3 / 3 / 3
Регистрация: 10.03.2015
Сообщений: 65
20.06.2015, 16:27  [ТС] 6
Цитата Сообщение от castaway Посмотреть сообщение
Это не ответ.
Потому что это вопрос) Мы кажется друг друга не поняли. У меня в игре есть массив блоков и он долго прорисовывается (http://code.d3d.info/cpp/games/?progr=2 вот так выглядит). Могу весь код игры скинуть, если надо

Добавлено через 2 минуты
Может есть какой-то магический способ сформировать всё изображение и только потом вывести его на экран?
0
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
20.06.2015, 16:29 7
Лучший ответ Сообщение было отмечено sereja322 как решение

Решение

Создаёшь совместимый контекст устройства, рисуешь на нём, потом блиттишь на контекст устройства окна. В памяти рисование быстрее происходит. Гугли "двойная буферизация".
1
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 16:54 8
Цитата Сообщение от sereja322 Посмотреть сообщение
стало только хуже.
Я об этом. Это не ответ. Что значит стало только хуже? Ты убрал задержку и стало работать медленнее? Так не бывает.
0
sereja322
3 / 3 / 3
Регистрация: 10.03.2015
Сообщений: 65
20.06.2015, 16:58  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
Ты убрал задержку и стало работать медленнее
Мерцание ещё сильнее. Сейчас читаю про двойную буферизацию, если получится, напишу
0
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 17:05 10
Цитата Сообщение от sereja322 Посмотреть сообщение
Мерцание ещё сильнее.
Ты уж определись с проблемой, и сформулируй вопрос так, чтобы всем была понятна твоя проблема.
0
sereja322
3 / 3 / 3
Регистрация: 10.03.2015
Сообщений: 65
20.06.2015, 17:25  [ТС] 11
Цитата Сообщение от castaway Посмотреть сообщение
Ты уж определись с проблемой, и сформулируй вопрос так, чтобы всем была понятна твоя проблема.
Юзеру с ником Enno всё было понятно.
Цитата Сообщение от Enno Посмотреть сообщение
Создаёшь совместимый контекст устройства, рисуешь на нём, потом блиттишь на контекст устройства окна. В памяти рисование быстрее происходит. Гугли "двойная буферизация".
Спасибо, так и сделал, мерцание вообще исчезло.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
while (game.play) {     // прорисовка всего
                FillRect(Draw.MemDC, &Draw.rect, Draw.BBrush);
                if (MainBall.start != 1) MainBall.SetBall(MainBoard.Get_x(), MainBoard.Get_y() - MainBall.h);       // крепим к доске шар
                SelectObject(Draw.MemDC, Draw.OrPen);       // рисуем полоски слева и справа
                MoveToEx(Draw.MemDC, 10, 0, NULL);
                LineTo(Draw.MemDC, 10, 350);
                SelectObject(Draw.MemDC, Draw.BlPen);
                MoveToEx(Draw.MemDC, 550, 0, NULL);
                LineTo(Draw.MemDC, 550, 350);
                for (int i = 0; i <= game.num_block_y; i++) for (int q = 0; q <= game.num_block_x; q++)
                    if (block[i][q].Get_state() == 1) {
                        block[i][q].Display('w');
                    }
                MainBall.Display('w');
                MainBoard.Display('w');
 
                for (int y = 0; y <= game.num_block_y; y++) for (int x = 0; x <= game.num_block_x; x++) if (bonus[y][x].Get_visible()) bonus[y][x].Display();
                
                BitBlt(Draw.hDC, 0, 0, Draw.rect.right, Draw.rect.bottom, Draw.MemDC, 0, 0, SRCCOPY);       // копируем изображение из памяти на экран
                //Sleep(1000 / FPS);
                
            }
Sleep я так понял теперь не нужен? И есть ли смысл сделать список (или ещё какой-нибудь тип данных) для того, чтоб он отображал только те бонусы, что в данный момент летят и не делал лишних проверок в цикле отрисовки?

Добавлено через 7 минут
Если кому нужно сделать подобное, то в начале нужно прописать
C++
1
2
3
4
5
6
7
8
9
10
11
Draw.hWnd = GetConsoleWindow();
Draw.hDC = GetDC(Draw.hWnd);
 
GetClientRect(Draw.hWnd, &Draw.rect);
 
Draw.MemDC = CreateCompatibleDC(Draw.hDC);
Draw.HBitmap = CreateCompatibleBitmap(Draw.hDC, Draw.rect.right, Draw.rect.bottom);
 
SelectObject(Draw.MemDC, Draw.HBitmap);
 
PatBlt(Draw.MemDC, 0, 0, Draw.rect.right, Draw.rect.left, BLACKNESS);
и в конце нужно удалить этот временный дескриптор
C++
1
2
ReleaseDC(Draw.hWnd, Draw.hDC);     // освобождаем дескриптор окна консоли
DeleteObject(Draw.MemDC);
0
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
20.06.2015, 17:33 12
Цитата Сообщение от sereja322 Посмотреть сообщение
Юзеру с ником Enno всё было понятно.
Просто он немного поднапрягся изучая твой код и вникая в суть неоднозначного вопроса, поэтому догадался интуитивно.
Я специально уточняю вопрос, мотивируя новичков задавать вопросы правильно. Просто не люблю когда вопросы так формулируют.
0
20.06.2015, 17:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2015, 17:33

Производительность ASP.NET: слишком долгая загрузка страниц
Всем добрый день. Вкратце расскажу о своем проекте. Есть у меня небольшая...

Подскажите что делать, если слишком долгая загрузка WIN 8.1 X64
Ну очень долгая загрузка наблюдается после переустановки ШINDOWS, я...

Открытие слишком большого файла
Добрый день, пишу программку в которой необходимо открывать различные бинарные...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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