Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449

Каким способом лучше всего и быстрее выводить анимацию?

13.10.2016, 11:27. Показов 1675. Ответов 9

Студворк — интернет-сервис помощи студентам
обычно делаю таким вот способом
C++
1
2
3
Graphics::TBitmap
Transparent = 1
Canvas->Draw
при том что и вот это есть
C++
1
#include "PngImage.hpp"
и с джпег как то пробовал но выводить на канву проще оказалось битмапом(как мне показалось)
но хотелось бы вот это всё сделать как то подругому вообще в корне. потому что анимаций разных много и друг на друга их каждый раз накладывать слишком затратно для ресурсов компа... подскажите ведь должен быть другой способ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2016, 11:27
Ответы с готовыми решениями:

Каким способом лучше визуализировать задачу?
Задача: Из центра матрицы выходит луч под известным углом. Сколько и каких клеток он пересечёт? Т.е. найти координаты точек и вытащить...

Каким способом лучше решать линейные уравнения?
В школе нас учили только трём способам 1)перестановка 2)перебор 3)графический Я как понимаю перебор, и графический способ лучше...

Каким способом лучше нарисовать подобную стрелу на QGraphicsScene
Ну собственно сабж и скрин :declare: Хотелось бы, чтоб эта ломанная линия с текстурой была бы одним QGraphicsItem-ом ... Есть идеи? ...

9
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
13.10.2016, 13:54
Компоненты TBitmap/TJPEGImage/TGIFImage/TPngImage - они предназначены для загрузки, хранения и конвертации разных форматов. А выводят они одинаково, на имеющемся API системы, под виндою всё будет через битмап.

Добавлено через 19 секунд
А где у вас тут "анимация"-то?
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
13.10.2016, 16:18  [ТС]
Ну раскадрованая анимация... Выводится на канву через таймер. Я хотел узнать как правильно делать это по стандартам потому что если много анимаций все лагает а ФПС как в играх не имеет никакого значения в таком случае. Я думаю что должно быть как то так:
Сначало на масив инт задний фон (рисунок)накладываются цифры с других спрайтов. В бмп там же вроде на 1 пиксель 3 байта и потом приведение типа из инт в битмап и на канву полное изображение т.к. накладывать по 100 раз друг на друга дольше будет а так он в уме посчитает... Ну по крайней мере обработчиков меньше будет задействовано. Но может быть это велосипед и уже все придумано проще. Ну библиотека например какая-то... Желательно с примером пож
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
13.10.2016, 17:57
Варианта два:
  • Либо в сторону OpenGL/DirectX - тогда картинки будут в видеопамяти и обрабатываться только там.
  • Либо системные средства интерфейса ОС - тогда надо оперировать тем что даёт система, а TBitmap/TJPEGImage/TGIFImage/TPngImage как раз уже удобная обёртка над системным.
Для простых плоских вещей прекрасно сойдут оба варианта.
Сколько у вас одновременно элементов/картинок/фрагментов на экране?

Добавлено через 2 минуты
Общая рекомендация

Добавлено через 5 минут
Версия Builder?
C++
1
2
3
void __fastcall TForm1::FormCreate(TObject * Sender) {
        DoubleBuffered = true;
}
Но можно и в инспекторе задать.

Добавлено через 6 минут
У каждого потомка TWinControl есть DoubleBuffered. А если версия Builder старая (у формы нету свойства ParentDoubleBuffered) - можно задать всем в цикле:
C++
1
2
3
4
5
6
void __fastcall TForm1::FormCreate(TObject * Sender) {
        DoubleBuffered = true;
        for (int i = 0; i < ComponentCount; i++)
                if (TWinControl * ctrl = dynamic_cast<TWinControl*>(Components[i]))
                        ctrl->DoubleBuffered = true;
}
Добавлено через 4 минуты
Не поможет - тогда показывайте полностью как сейчас делаете.
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
13.10.2016, 20:28  [ТС]
Двойной буфер использую. Но возможно не понимаю что он даёт именно. Как я понимал для того чтобы изображение не "мерцало" . задавал в инспекторе да. Рад студия 10 у меня привык к ней.
Важный вопрос: мой вариант при выводе изображения на экран использует видеопамять?
То что изображение хранится-обрабатывается не в видео памяти сильно сказывается на производительности?
У меня к примеру листья шевелятся, но поверх ещё может другая анимация быть и почему то мне кажется что на этом можно как то секаномить.
У меня сначало рисуется задний фон. А другие объекты которые по нему проходят на имэйдже другой канвы. И выходит что у меня куча имейджей друг на друге чтобы не отрисовывать каждый раз весь экран целиком. я стираю предыдущую анимацию и рисую новую координатами. А стираю анимацию прозрачным цветом.
У меня есть заставка в которой 120 полноэкранных кадров. Так вот она жутко тормозит. Может быть дело в видеопамяти...

Добавлено через 11 минут
Можно пример пожалуйста как загрузить и вывести на экран изображение с опенжл или директор?

Добавлено через 6 минут
Ну у меня нетбук просто бомжовский. Но всеравно не должно быть такого я считаю. А вот что именно почему я могу только догадываться
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
13.10.2016, 21:08
VCL на GDI, то есть в обычной оперативке, на ЦП.
На нетбуке скорее всего с видеопамятью будет не лучше.

Я ж не вижу "какого". Ну дак если такую заготовку использовать - как что будет?:
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
34
35
36
37
38
39
void __fastcall TForm1::FormCreate(TObject * Sender) {
        DoubleBuffered = true;
        for (int i = 0; i < ComponentCount; i++)
                if (TWinControl * ctrl = dynamic_cast<TWinControl*>(Components[i]))
                        ctrl->DoubleBuffered = true;
        jpg = new TJPEGImage;
        jpg->LoadFromFile(Path + "fMwhZes3djE.jpg");
}
 
void __fastcall TForm1::FormDestroy(TObject * Sender) {
        jpg->Free();
}
 
void __fastcall TForm1::FormResize(TObject * Sender) {
        Repaint();
}
 
void __fastcall TForm1::FormPaint(TObject * Sender) {
        TCanvas * C = Canvas;
        C->Lock();
        C->Brush->Color = clBlack;
        C->FillRect(C->ClipRect);
        C->Draw(0, 0, jpg);
        C->Draw(0, frameID % ClientHeight, jpg);
        C->Draw(frameID % ClientWidth, 0, jpg);
        C->Draw(frameID % ClientWidth, frameID % ClientHeight, jpg);
        C->Brush->Style = bsClear;
        C->Font->Color = clLime;
        C->Font->Size = 26;
        C->Font->Name = "Arial";
        C->Font->Style << fsBold;
        C->TextOutA(15, 15, IntToStr(frameID));
        C->Unlock();
}
 
void __fastcall TForm1::Timer1Timer(TObject *Sender) {
        frameID+=5;
        Repaint();
}
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
14.10.2016, 09:47  [ТС]
BOGG ART, ну я в ваш код попробовал... вот мой
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
#include <jpeg.hpp>
TJPEGImage *jpg = new TJPEGImage;
TJPEGImage *jpg2 = new TJPEGImage;
int i = 0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
        DoubleBuffered = true;
        jpg->LoadFromFile("xZ556JCtol0.jpg");
        jpg2->LoadFromFile("W2_NT3U7x_M.jpg");
 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)  //interval (1)
{
        Canvas->Draw(0, 0, jpg);
        i++;   
}
void __fastcall TForm1::Timer2Timer(TObject *Sender) //interval (1)
{
        Canvas->Draw(0, 0, jpg2);
        i++;    
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer3Timer(TObject *Sender) //interval(1000)
{
        Form1->Caption = i;   
        i = 0;
}
//---------------------------------------------------------------------------
таким вот способом фпс показывает максимум ~400(полный экран) на нормальном ноуте, а если добавлять имейджи то фпс резко падает.
и ещё я у вас заметил что есть вот это:
C++
1
2
C->Lock();
C->Unlock();
оно выполняется как то автоматически же... нет разве?
дабл буфер кстати тоже не влияет на фпс...
но этот лок унлок мне вот напомнил одну вещь... что как раз таки куча имейджей плохая идея... и лучше весь экран каждый раз перерисовывать поновой чем что то стирать на других эмейджах..
я просто писал очень давно игру и хотелось бы исключить косяки с которыми я могу столкнуться в новой игре (тут я планирую намного больше анимации)

Добавлено через 3 минуты
хотя впринципе если как то этим лок унлоком подстаканить с другими имейджами то может быть не будет такого снижения фпс... но вот он только автоматически выполняется и вообще никак не реагирует программа на его присутствие у меня...
к примеру я ставлю и ничего не происходит
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Canvas->Unlock();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Canvas->Lock();
}
//---------------------------------------------------------------------------
Добавлено через 2 минуты
спасибо. это меня натолкнуло на пару мыслей хороших которые решили мой вопрос... но было бы идеально если бы ещё попробовать тоже самое с директом\опенжл

Добавлено через 2 часа 49 минут
сейчас чот смотрю директ обучение какие то треугольники нарисованы 4000 фпс
но какой именно сдк и как его в рад студию я ещё пока непонял, и какой код там должен быть незнаю
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
14.10.2016, 15:06
Рисовать надо в FormPaint. Timer нужен только один, а interval можно ставить не меньше 50.

И как просто вопрос - какие ещё "4000 фпс", когда мониторы стока физически не способны выводить? Особенно на старом нетбуке. А глаза человеческие тоже "снимают кадры" намного реже.
0
6 / 6 / 3
Регистрация: 03.01.2012
Сообщений: 449
14.10.2016, 16:24  [ТС]
не ну выполнять функцию вывода ему от этого ничего не мешает
понятное дело что ограничение есть у вышестоящих функций и они определяют когда показывается картинка а когда ждёт своей очереди.... но дело в производительности...
я вот на нет буке столкнулся в прошлой игре с проблемой того что у меня оперативная память просто закончилась и всё... а там была и локальная сеть и огромная карта с искуственным интелектом. а хочется чтобы мои игры запускались на всем даже на доисторическом нетбуке. вот я сейчас ещё скачиваю что то, но похоже на вижуал студию придется переходить если я разберусь с директиксом. на ней как то попроще с инфой по этому поводу
0
 Аватар для BOGG ART
592 / 459 / 147
Регистрация: 09.12.2013
Сообщений: 2,385
Записей в блоге: 2
14.10.2016, 19:39
Лучший ответ Сообщение было отмечено lips как решение

Решение

Любая операция тратит как минимум время. Поэтому не надо гоняться за мифическим ФПС, а выводить только тогда когда это реально надо. "На экране ничего не изменилось, но мы всё равно обновим неменявшийся кадр 146 раз" - нафига?
В современных играх потипу "Марио" этот ФПС не выше 12 - и никто не жаловался, всё нормально анимируется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2016, 19:39
Помогаю со студенческими работами здесь

Каким способом лучше подключать внешние скрипты/библиотеки?
Лучше скачать скрипт/библиотеку на сервер и оттуда брать, или постоянно подгружать с веб-источника? То есть лучше так: &lt;script...

Каким способом лучше разить строку: через регулярки или сплитом?
Здравствуйте. Подскажите пожалуйста в следующем вопросе. Имеется строка такого вида: 199.72.81.55 - - &quot;GET /history/apollo/...

Как лучше всего выводить инфу из бд?
я умею выводить информацию из бд в цикле while-do с помощью printf и echo. Но мне нужно использовать php код, чего я в printf сделать не...

Каким лучше всего делать сайт?
Ребят, подскажите каким делать свой сайт ? Тоисть его делать динамическим или статическим ? Сайт будет на подобии вывода новостей....

Каким сервис лучше всего воспользоватся для прогон
Каким сервис лучше всего воспользоватся для прогонки сайта по каталогам? И вообще какой результат после этого?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru