Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Вниз

Мигание Image м   Найти похожие ветки 

 
xn0bys   (2003-01-30 13:49) [0]

Господа, не подскажет ли кто, как сделать так, чтобы два имажа сменяли друг друга с частотой экрана...
Я сделал по таймеру (Таймер взят из библиотеки OpenGL он заточен на Thread"е).

procedure Form1.TimerOnTimer;
begin
if Image1.Visible then
begin
Image2.Visible:=True;
Image1.Visible:=False;
end else
begin
Image1.Visible:=True;
Image2.Visible:=False;
end;
Wait; // Это процедурка написанная на ассемблере она ждёт прихода луча...
end;

Это дело работает, но ей нужен комп не менее 450 MHz и хорошая видуха, а мне-бы хотелось, как-нибудь, чтобы и на других компах работало.
Особенно если сделать

MagnifyFactor:=2...10;

Image1.Stretch:=True;
Image1.Width:=Image1.Picture.Bitmap.Width*MagnifyFactor;
Image1.Height:=Image1.Picture.Bitmap.Height*MagnifyFactor;

Image2.Stretch:=True;
Image2.Width:=Image2.Width;
Image2.Height:=Image2.Height;

То на моём рабочем компе (Cell 333+Savage 4) жутко тормозит (If MagnifyFactor=1 then мигает нормально), хотя на моём домашнем (Cell 666@830+GF2MX400) всё рулит.

Если у кого есть какие-нибудь мысли, буду очень благодарен...


 
Ketmar   (2003-01-30 14:28) [1]

директфиг и молитвы.

Satanas Nobiscum! 30-Jan-XXXVIII A.S.


 
ZeroDivide   (2003-01-30 14:38) [2]

Будет тормозить :(
Stretch вообще тормоз.
Через image не очень то все быстро. Я вообще то не очень большой специалист в скоростной графике, но я бы написал так.

procedure Form1.MyThread;
begin
Image3.Graphic.Assign(Image1.Graphic);
Image3.Paint;
Wait;
Image3.Graphic.Assign(Image2.Graphic);
Image3.Paint;
Wait;
end;




 
Mihey   (2003-01-30 15:15) [3]

Я бы отказался от TImage вообще. Нужно использовать FastLib. Я же говорю - это классная библиотека, скоростная, есть эффекты. Это полная замена TBitMap и так далее. Надо только привыкнуть!


 
Axis_of_Evil   (2003-01-30 15:21) [4]

2Mihey
а чем она bitmap хуже?
поворот/растяжение и там есть(SetWorldTransform)
я посмотрел- красиво, но разбираться - время нужно ...


 
xn0bys   (2003-01-30 15:21) [5]

Mihey (30.01.03 15:15)
Попробуем...


 
pasha676   (2003-01-30 16:27) [6]

Я менял через DelphiX. Преимущества - быстро, аппаратку вроде цепляет. Имаджи были нанесены на поверхности (Surface) и менялись. Никакого торможения не заметил.


> Wait; // Это процедурка написанная на ассемблере она ждёт
> прихода луча...

А вот об этом можно подробнее. И если можно с кодом и коментариями. А то извращаюсь. Устройство специальное включаю между монитором и видеокартой.

Так же обязательно этот wait надо включать в паралельный поток. Он же у тебя все вешает нафиг по таймеру. Как он приходит - то надо обновлять имадж.

ЗЫ Ты не по стерео случайно работаешь.


 
Mihey   (2003-01-30 22:06) [7]

2 Axis_of_Evil:

Здесь фактор - скорость. FastLib - она потому и Fast. Конечно, BMP можно отобразить при помощи BitBlt - и будет очень быстро, но при помощи BitBlt не повернёшь и не растянешь (используя Resample) изображение.

2 pasha676:

DelphiX - это можно, будет быстро и красиво.


 
xn0bys   (2003-01-31 08:43) [8]

Mihey (30.01.03 22:06)
Пробовал FastLib
FastDib.StretchDraw...
Та же история, видимо чего-то с моим рабочим компом не то?
Хотя игры вроде нормально идут...


 
xn0bys   (2003-01-31 08:54) [9]

pasha676 (30.01.03 16:27)

> Я менял через DelphiX.

Не подскажешь как ты сделал?

Я пробовал так:

if not DXDraw1.CanDraw then exit;
DXDraw1.Surface.Fill(0);

If Scr then
DXImageList.Items[0].StretchDraw(
DXDraw1.Surface,DXDraw1.Surface.ClientRect,0) else
DXImageList.Items[0].StretchDraw(
DXDraw1.Surface,DXDraw1.Surface.ClientRect,0);
DXDraw1.Flip;

Так тормозит (Увеличение в 2 раза), а
Если использовать DXImageList.Items[0].Draw, то всё нормально
(увеличение 1)
Пробовал DXDraw1.Options:=DXDraw1.Options+doStretch;
но чего-то у меня не получилось?


> . И если можно с кодом и коментариями.

вот код процеДУРКИ wait;

procedure Wait;assembler;
label w1,w2;
asm
mov dx,03dah
w1:
in al,dx
test al,08h
jne w1
w2:
in al,dx
test al,08h
je w2
end;

Я где-то его выдрал, правда не помню где?


> Так же обязательно этот wait надо включать в паралельный
> поток.

Насчёт потока, ты прав, чего-то я об этом не подумал?


> ЗЫ Ты не по стерео случайно работаешь.

Нет, я делаю редактор FLI для ZXSpectrum, у него есть 2 экрана, они мигать должны...


 
xn0bys   (2003-01-31 08:57) [10]

pasha676 (30.01.03 16:27)
Млин!!! Я сам торможу, я же написал AsynchTimer заточен на Thread - А это-ж и есть паралельный поток.


 
pasha676   (2003-01-31 10:53) [11]


> Млин!!! Я сам торможу, я же написал AsynchTimer заточен
> на Thread - А это-ж и есть паралельный поток.

Лучше сделать честный API-шный поток. Фиг знает как этот таймер работает. Я ему не доверяю.
Вспомнил как я делал. Паралельный поток. Ждет эвента (для простоты можно wait твой там оставить). Два изображения грузяться из TListimage в Tsurface в начале работы программы.
По смене луча, то один то другой surface кидается изображеться. Никаких стречей не делал. Работало это все на 120 Гц монитора без видимых замедлений. Можно было еще что-нибудь вполне запускать.
Конкретный код у меня сейчас на другом винте. Попробую к концу дня выложить.



 
Mihey   (2003-01-31 14:45) [12]

2 xn0bys:

Очевидно, тормозня идёт при выводе изображения.

По поводу DelphiX. Для ускорения поставь SystemMemory в True, а во вторых, раз уж используешь DelphiX, то используй и TDXTimer, он ведь тоже как-то на потоках заделан.


 
xn0bys   (2003-02-03 08:19) [13]

2 pasha676
У меня есть сорцы на асинктаймер, там точно через треад.

> Два изображения грузяться из TListimage в Tsurface в начале
> работы программы

Аналогично!
у меня без стретча тоже всё летает, но в том и дело что стретч нужон!

2 Mihey

> По поводу DelphiX. Для ускорения поставь SystemMemory в
> True

Ставил.


> раз уж используешь DelphiX, то используй и TDXTimer, он
> ведь тоже как-то на потоках заделан

Использовал и его тоже.


 
pasha676   (2003-02-03 10:54) [14]


> Аналогично!
> у меня без стретча тоже всё летает, но в том и дело что
> стретч нужон!

Может его как-нибудь заранее делать или двойная буферизация, получаемый буфер кладем в другой буфер попутно стречируя. Помоему такая функция была и не DXImageList.Items[0].StretchDraw, а что то менее накрученное (и применять можно именно с ТSurface).


 
pasha676   (2003-02-03 14:23) [15]

Что то типа использовал.
if EyeFlag then
DXDraw.Surface.BltFast(0,0,Rect(0,0,400,300),0,OneSurface)
else
DXDraw.Surface.BltFast(0,0,Rect(0,0,400,300),0,TwoSurface);

Процедура стоит и ждет мессагу от параллельного потока, где определяется собственно, что отрисовывать (EyeFlag).


 
xn0bys   (2003-02-04 08:22) [16]

pasha676 (03.02.03 14:23)
Попробуем...



Страницы: 1 вся ветка

Форум: "Media";
Текущий архив: 2003.05.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
3-46662
Анна
2003-04-24 21:22
2003.05.15
Ссылочная целостность


14-46907
Шоломицкий
2003-04-26 21:50
2003.05.15
Прикол!


3-46562
Endi
2003-04-21 19:42
2003.05.15
Неправильная печать русских символов


6-46876
chum
2003-03-15 16:49
2003.05.15
Опять про PROXY


1-46757
Xeon
2003-04-30 21:22
2003.05.15
Drag&Drop





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский