|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|
Как ускорить вывод изображения?03.07.2012, 19:28. Показов 3555. Ответов 15
Метки нет (Все метки)
Здравствуйте уважаемые программисты! Вот я пишу игровой 2D движок на C++ directx9 и то, что у меня получилось сравниваю с американским 2D движком, который тоже написан на C++ directx9. Я просто загружаю из файла png картинку размером 32 на 32 пикселя и много раз вывожу ее на экране. С помощью методов интерфейса ID3DXSprite уменьшаю ее в два раза и каждый кадр вращаю на определенный угол. Также измеряю время вывода картинок на экран. В игре смена кадров происходит 60 раз в секунду. Вся беда в том, что в американском двиге спокойно можно вращать и выводить на экран более 4000 спрайтов, а в моем - только 200, при выводе 300 спрайтов количество смены кадров в секунду падает до 45. Подскажите как мне ускорить вывод изображения и добиться соответствующего результата. Может кто-то уже писал 2D движок и занимался подобным вопросом? Может есть какие-то статьи или книги по этому вопросу?
0
|
|
| 03.07.2012, 19:28 | |
|
Ответы с готовыми решениями:
15
Ускорить вывод изображения в JLabel Как ускорить прорисовку изображения? Как ускорить отрисовку изображения? |
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|
| 04.07.2012, 21:18 [ТС] | |
|
Вот начал потихоньку разбираться в чем дело. Вывожу определенное количество спрайтов на экран и смотрю сколько это занимает времени. 1 спрайт рисуется за 33 мкс. 10 спрайтов рисуется за 70 мкс. 48 спрайтов рисуется за 220 мкс. Такая скорость меня вполне устраивает, но если я добавляю еще один спрайт и рисую 49, то это уже занимает 2500 мкс. 200 спрайтов выводится за 7200 мкс. Возникает вопрос, почему процедура рисования 49 спрайтов занимает по времени в 10 раз больше, чем прорисовка 48?
0
|
|
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 07.07.2012, 18:27 | |
|
Как выводите картинки?
Весь секрет в частоте вызова функций рисования и оптимизации изображения. Если можете сформировать кадр вне функций рисования собрав всё в буфер и за один вызов DrawIndexedPrimitives или хотя бы DrawPrimitives, вот вам и будет максимальная производительность. А массивы для буфера можно в нескольких потоках формировать, думаю будет летать круче чем у оригинала. Используйте не особо расточительный формат вершин. Если хотите спрайтами выводить, собирайте всё в один спрайт и выводите.
1
|
|
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|||||||||||||
| 08.07.2012, 00:23 [ТС] | |||||||||||||
0
|
|||||||||||||
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
||||||
| 08.07.2012, 09:29 | ||||||
|
Ваш вывод тормозят вызовы begin end, уберите их в отдельные функции
В общем порядок такой, открыл рендер --- запихнул всё в память --- нарисовал. Если хочешь ещё быстрее, создай условия в которых между бегин и енд нет цикла, как варриант это объединение спрайтов и использование многопоточной обработки, пока один поток рисует, второй уже готовит очередной кадр и т.д. или компоновку одного спрайта из нескольких сделать в несколько потоков, в общем поле деятельности большое.
1
|
||||||
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
||
| 08.07.2012, 22:17 [ТС] | ||
|
0
|
||
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
||
| 09.07.2012, 18:16 | ||
|
Кстати есть настройки по выводу, можно рисовать чаще чем обновляется экран, только незачем, у тебя затык был потому что по дефаулту между вызовами begin 60 миллисек.
1
|
||
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|
| 09.07.2012, 22:27 [ТС] | |
|
0
|
|
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 10.07.2012, 07:38 | |
|
Точно, перепутал, 60 кадров в секунду.
1
|
|
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|
| 10.07.2012, 13:39 [ТС] | |
|
60 кадров в секунду - 16.7 миллисекунд. А как изменить время обновления экрана?
0
|
|
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 10.07.2012, 19:08 | |
|
Это имеет смысл только если обновление моника выше, скажем 100 герц.
А сама настройка PresentParameters.PresentInterval.
1
|
|
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|
| 11.07.2012, 15:02 [ТС] | |
|
Вот отх...л (отработал) 12 часов на смене, пришел домой уставший, начал искать и ничего найти не могу. Подскажите что нужно написать и куда вставить, чтоб установить частоту обновления экрана, например, 20, 100, 387, 1015 кадров в секунду. Можно ли? Не спрашивайте зачем, просто надо и все.
0
|
|
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 11.07.2012, 18:06 | |
|
При заполнении структуры D3DPRESENT_PARAMETERS укажи параметр PresentationInterval.
Знаю default - 60 кадров в секунду и immediate - максимально возможное количество кадров(зависит от нагрузки, то есть максимальная производительность). Добавлено через 19 минут Ты можешь варировать между максимумом и 1 кадром через таймер, других вариантов нет.
1
|
|
|
13 / 13 / 0
Регистрация: 09.03.2012
Сообщений: 112
|
|
| 11.07.2012, 18:26 [ТС] | |
|
Спасибо, с этим вопросом я полностью разобрался.
0
|
|
|
117 / 75 / 5
Регистрация: 15.03.2012
Сообщений: 259
|
|
| 12.07.2012, 16:22 | |
|
Хочу напомнить, что система Windows 7 (как впрочем все виндусы серии Windows 1...2....3...3.11...95...98...и тд), в отличии от Windows CE, QNX и пр, не является операционной системой реального времени. Что это это значит? А то, что в данной операционной системе таймер не может работать чаще 50..60 МИЛИСЕКУНД, тоесть практический точнее одной двадцатой секунды Вам замерить не удастся. Откуда цифры? Оттуда, что в своё время занимался программированием серво контроллеров в робототехнике, там всё управлялось TTL сигналами с длинной импульса 5 МИКРОСЕКУНД и управлялось всё при помощи ШИМ (широтно импульсной модуляции). Так вот, пытался сварганить на Windows управляемый генератор импульсов, варганил варганил и долго не мог понять, почему роботы дёргаются не понятно и всё время по разному, хотя в функции SetTimer я вводил интервал в 5 микросекунд....Ну что я могу сказать, оценил ситуацию на осциллографе и вот как раз оттуда после не хитрых измерений и вышли эти пределы точности Windows в 50...60 миллисекунд. Так что ребята, все ваши измерения FPS в 4000 на Windows 7 - это всё бутафория, а точнее не более чем набор примерно случайных чисел. Думаю, что в зависимости от таймеров в самих чипах на материнской плате цифра может варьироваться в пределах 10 миллисекунд но не более. Лично мне пришлось покупать в комп доп плату широтно импульсной модуляции со счётчиками таймерами и уже оперировать ими. Ладно....долго рассказывать......вот так.
0
|
|
|
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
|
|
| 12.07.2012, 18:56 | |
|
1
|
|
| 12.07.2012, 18:56 | |
|
Помогаю со студенческими работами здесь
16
Как ускорить отрисовку изображения на PictureBox Построение иерарх. дерева на основе существующей БД. Как ускорить вывод данных. Преобразование изображения: ускорить работу кода
Ускорить вывод в RichEdit Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|