Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.043 c
4-1167412167
MasteroK
2006-12-29 20:09
2007.06.03
Отловить событие изменения разрешения экрана, и узнать размеры


2-1177523688
красотка (С)
2007-04-25 21:54
2007.06.03
Чем открыть файлы *.ADI, *.ADT


2-1179226884
Provodnick
2007-05-15 15:01
2007.06.03
Строку с #0 в XML


15-1175858722
TIF
2007-04-06 15:25
2007.06.03
Про создание сайтов


15-1178796898
Gero
2007-05-10 15:34
2007.06.03
Персональная ветка ArtemESC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский