Форум: "Media";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
ВнизВывод мультипликации (спрайтов) в DrawGrid Найти похожие ветки
← →
ruzzz (2006-09-15 19:16) [0]Бодрое время суток, товарищи!
Хочу проконсультироваться на счет одной проблемы. Пишу одно приложение, которое представлет из себя что-то вроде расписания движения поездов (Направление поезда - Время). Информация о движении выводится в такое табло, которое раньше можно было наблюдать на железнодорожных вокзалах и аэропортах: каждая буква и цифра в отдельной ячейке на табло. При изменении информации (меняется только Время) цифры начинают перелистываться на подобие того, как это имело бы место при перелистывании страниц книги. Вид этого табло можно посмотреть здесь: http://podonok-studio.jino-net.ru/screen.jpg
Для реализации этого табло я использовал класс TDrawGrid, в ячейки объекта класса TDrawGrid выводил буквы и цифры. Объект DrawGrid1 занимает весь экран. Все цифры и все промежуточные состояния при их перелистывании (при изменении времени движения поездов) прорисовал в CorelDraw, получил кучу *.bmp файлов и засунул их в ImageList1, из которого потом методом ImageList1.Draw(DrawGrid.Canvas,R.Left,R.Top,i) по событию
Timer1Timer выводил информацию на табло (т.е. вся эта мультипликация реализована в виде спрайтов). Так вот, изображения из ImageList1 в DrawGrid1 должны выводиться достаточно быстро, чтобы создавалась иллюзия перелистывания цифр. Максимальное число полей, которое может одновременно меняться (перелистываться) 30. При этом меня бы устроило,
если бы следующее движение (изображение) выводилось через 30 ms. Однако по моим замерам при изменении изображений в 30 полях время составляет 90 ms (и это на моем достаточно новом ноутбуке: WinXP, Pentium 1.7 GHz mobile, RAM 512 MB, 256 MB video NVIDIA GeForce Go 6200, 798 MHz шина).
В связи с этим вопрос: как ускорить вывод изображений в табло? Создается впечатление, что это можно сделать только, используя DirectX или OpenGL, с которыми я не знаком. В частности, я не могу найти статей, которые бы описывали работу с DirectX при выводе спрайтов на какую либо форму (т.е. работу НЕ в полноэкранном режиме). Буду рад любым идеям по поводу создания данного приложения и ссылкам на статьи по работе с DirectX НЕ в полноэкранном режиме.
Заранее благодарен
Никита
← →
Vovan#1 (2006-09-15 21:56) [1]А попробуй измерить, сколько по времени занимает вывод всей картинки, которую ты выложил, только в BMP, просто через BitBlt. ИМХО будет меньше, чем 30.
На всякий случай вот примеры по DirectX из книги Краснова. Здесь только первые две главы, посвящённые Direct3D, именно в оконном режиме и даже автор предлагает свой простенький спрайтовый движок. Автор работает, кажется, с DirectX 8-ой версии. В 9-ой, насколько я знаю, появились какие-то классы для работы со спрайтами. Но уже более на будущее, если будешь занимать DirectX вообще.
http://storeandserve.com/download/425660/directx.rar.html (7 Мб)
Ещё могут посоветовать DirectDraw, но ты их не слушай. Устарело оно.
← →
homm © (2006-09-15 22:37) [2]
> Ещё могут посоветовать DirectDraw, но ты их не слушай. Устарело
> оно.
Что значит устарело? Не будет реалезовано в новых версиях DirectX или новые видеокарты не будут с ним справлятся? По моему в данном случае он как раз с достоинством справится со всеми возложенными функциями.
← →
ruzzz (2006-09-19 21:26) [3]Спасибо за примеры по DirectX из книги Краснова. Но мне бы статью по DirectX по работе НЕ в полноэкранном режиме, так как разобраться по исходникам, в которых практически отсутствуют комментарии весьма проблематично.
Никита
← →
ruzzz (2006-09-23 08:40) [4]Если кому еще интересно, проблема была решена путем простой оптимизации, следующим образом:
procedure TForm2.Timer2Timer(Sender: TObject);
var
i, j: integer;
Source, Dest, R: TRect;
MainBm, Template: TBitmap;
begin
inc(Frame);
if Frame > 79 then Frame := 0;
MainBm := TBitmap.Create;
MainBm.Width := 3*49+22;
MainBm.Height := 11*61+22;
Template := TBitmap.Create;
Template.LoadFromFile("numbers.bmp");
Source.Left := Frame*49;
Source.Top := 0;
Source.Right := Source.Left+49;
Source.Bottom := 61;
for i := 0 to 2 do
for j := 0 to 10 do
begin
Dest.Left := i*49+i*2;
Dest.Top :=j*61+j*2;
Dest.Right := Dest.Left+49;
Dest.Bottom := Dest.Top+61;
MainBm.Canvas.CopyRect(Dest, Template.Canvas, Source);
end;
Template.Free;
r:=DrawGrid1.CellRect(22,0);
with r.TopLeft do DrawGrid1.Canvas.Draw(x,y,MainBm);
MainBm.Free;
end;
В numbers.bmp находятся все кадры перелистывающихся чисел.
Все работает шустро.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2007.06.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.047 c