Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Мерцание и Двойная Буферизация   Найти похожие ветки 

 
Паша555   (2005-01-11 01:53) [0]

Помогите решить проблему.
На форме по таймеру происходит перемещение TLabel.
Без Двойной Буферизации - мерцание
При включении - недостаточная скорость перемещения метки....
При добавлении графики (TImage)на форму - еще более уменьшается скорость передвижения слова.....

Какими путями можно избежать всех вышеописанных минусов ?
(OpenGL или DirectX?????)
Заранее спасибо !


 
Поручик ©   (2005-01-11 02:53) [1]

Если нужна надпись, рисуй ее с помощью canvas.TextOut(), если картинка, то с помощью canvas.draw() смотри про них в справке.Ни в коем случае не двигай image это ТОРМОЗА, а про OGL и DX пока забудь.
Удачи.


 
Паша555   (2005-01-11 20:13) [2]

Спасибо большое за ответ, но возник еще один вопрос
при использовании canvas.TextOut как можно изменять размер, цвет, шрифт и т.д. ???
Спасибо !


 
Jel ©   (2005-01-11 20:26) [3]

Canvas.Font


 
Паша555   (2005-01-11 23:04) [4]

И снова спасибо, хотя я балбес должен был сам мозгами пошевелить :)
НО вот уже час мучаюсь с проблемой:
ПРи попытке двигать текст по канвасу с помощью координат canvas.TextOut старый текст остается и смазывается к новым.
Думаю надо перед выводом текста с новыми координатами убирать старый путем заливки канваса прозрачным фоном - но как - не доходит......


 
megabyte-ceercop ©   (2005-01-12 07:27) [5]

Canvas.FillRect()
заливка прямоугольника. (название процедуры возможно не совсем точное). Пользуйся toolip`ами.


 
Паша555   (2005-01-12 11:25) [6]

Понимаете, если я заливаю прямоугольник кистью с прозрачнм фоноом, это не нпомогает - предыдущее слово остается.....


 
Поручик ©   (2005-01-12 11:37) [7]

PatBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, WHITENESS);


 
Паша555   (2005-01-12 11:49) [8]

Спасибо, поручик, но это не совсем то..... или я не допираю....
Надо чтобы текст с прозрачным фоном двигался по картинке....
А эта функция заливает все белым....


 
Поручик ©   (2005-01-12 11:56) [9]

Тогда надо сохранять часть картинки с надписью в буфур (заведи еще один TBitmap)
Действия такие:
Скопировал участок, где надпись должна быть
Нарисовал надпись
Восстановил участок
Скопировал новый участок
Нарисовал новую надпись
...

Если с этим возиться неохото, то просто перерисовывай заново картинку, а на нее надпись клади


 
Паша555   (2005-01-12 11:59) [10]

Извините за назойливость,
но как будет быстрее к точки зрения прорисовки ? (см назв. темы)
И если можно - поподробнее....


 
Поручик ©   (2005-01-12 12:02) [11]

Из этих двух способов быстрее с буфером, но если картинка у тебя меньше 500х500, то разницы не заметно.
И еще маленький совет: Рисуй сначало все на TBitmap, и только потом выводи на экран, так быстрее.


 
Паша555   (2005-01-12 12:10) [12]

С буфером - это 1 способ ?
И можно ли обеспечить  скорость движения слова (примерно прохождение 1000 пикселей за 2 секунды с однопиксельной итерацией)?
Кстати, спасибо огромное !


 
Паша555   (2005-01-13 00:32) [13]

Неужели никто не может посоветовать как правильно сделать ?


 
bulkas   (2005-01-13 00:36) [14]

вобще-то для несложных задач, советую испльзовать DelphiX, очень удобно и просто, описаний и хелпа - навалом.
ну а если хочешь морочиться стандартными средствами щас напишу.


 
bulkas   (2005-01-13 00:37) [15]

а вобще мыло напиши сброшу, посмотришь по человечески.


 
Cobalt ©   (2005-01-13 01:04) [16]

На мой взгляд - для такого случая проще использовать окно класса STATIC


 
bulkas   (2005-01-13 01:10) [17]


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls;

type

 TForm1 = class(TForm)
   Panel1: TPanel;
   StaticText1: TStaticText;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 TRunStringThread = class(TThread)
   procedure Execute; override;
   procedure MotionRunString;
 end;

var
 Form1: TForm1;
 RunStringThread:TRunStringThread;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
 RunStringThread:=TRunStringThread.Create(True);
 RunStringThread.Priority := tpIdle;
 RunStringThread.Resume;
end;

procedure TRunStringThread.Execute;
var i:Integer;
begin
 while true do
 begin
     Synchronize(MotionRunString);
     Application.ProcessMessages;
     for i:=0 to 2999999 do;
 end;
end;

procedure TRunStringThread.MotionRunString;
begin
 Form1.StaticText1.Left:=Form1.StaticText1.Left-1;
 if Form1.StaticText1.Left=-Form1.StaticText1.Width then Form1.StaticText1.Left:=Form1.Panel1.Width;
end;

end.


 
Паша555   (2005-01-13 01:39) [18]

Я с потоками еще ни разу не встречался (уровень у меня не тот....)
Может пример на fur_surfen@web.de скинете ????
Непонятно зачем панель....
Буду разбираться.........
Спасибо большое.


 
Поручик ©   (2005-01-13 02:00) [19]

НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙ DELPHIX
Это вторая заповедь программиста графики, после "не двигай image"
А что ты делаешь? Игру или еще что-то, расскажи.


 
bulkas   (2005-01-13 02:13) [20]

Ну встречался ты или не встречался с потоками это дело твоё.
Я тебе предложил два варианта:
Поток или DelphiX.

Пример с потоком скинул тебе на мыло.

Но я тебе советую для начального уровня, если собираешься заниматься графикой освоить DelphiX.


 
bulkas   (2005-01-13 02:17) [21]

Да не надо гнать про дельфи икс, про движение картинок и т.п.
Человек еще толком дельфи не знает.
Ты его хочешь посадить на DirectX, OpenGL или API, да он разбираться будет месяц, если не больше не вылазя из-за компа.

Радости от жизни-то по началу надо получать.
Вот и пусть поюзает DelphiX.

Потом сам поймет когда надо перейти на более серьёзные вещи.


 
Поручик ©   (2005-01-13 02:44) [22]

bulkas   (13.01.05 2:17) [21]
Ты его хочешь посадить на DirectX, OpenGL или API, да он разбираться будет месяц, если не больше не вылазя из-за компа.

Ты читал эту ветку или нет? Наверное нет, посмотри первый пост.

> Радости от жизни-то по началу надо получать.

Вот пусть и получает - рисует на GDI

> Вот и пусть поюзает DelphiX.

Вот этого не надо, DelphiX - тупиковая фигня, ну поюзает, и это ему ничего не даст.
А так немного познакомится с устройством Windows


> Потом сам поймет когда надо перейти на более серьёзные
> вещи.

Это обязательно


 
Паша555   (2005-01-13 04:06) [23]

Не ссорьтесь, парни :)
Все посмотрю все выучу, Вы только помогайте !!!
Спасибо за ответы
Обязательно попробую как сказал и Поручик и Bulkas
И DelphiX и GLScene раньше просматривал немного, что это такое представление имею немного.....
Мое мнение, насчет DelphiX - конечно что-то серьезное не сделать, но для решения мелких задач можно использовать....
Пишу что-тоо вроде игрушки ребенку для улучшения техники чтения...
Там со словами игра на реакцию....


 
Поручик ©   (2005-01-13 04:12) [24]

В твоем случае, лучше не мараться с DelphiX, это безполезная трата времени, имхо. Тебе хватит и Canvas.
Какие еще вопросы?


 
Паша555   (2005-01-13 04:47) [25]

на сегодня все - уже голова не варит
Завтра думаю появятся :)


 
Kerk ©   (2005-01-13 05:19) [26]

Поручик ©   (13.01.05 2:00) [19]
НИ В КОЕМ СЛУЧАЕ НЕ ИСПОЛЬЗУЙ DELPHIX

а почему? звучит слишком категорично.


 
sniknik ©   (2005-01-13 09:03) [27]

> procedure TRunStringThread.Execute;
> var i:Integer;
> begin
>  while true do
>  begin
>      Synchronize(MotionRunString);
>      Application.ProcessMessages;
>      for i:=0 to 2999999 do;
>  end;
> end;

вот это очень криво, так в потоках не делают
(уже надоело обьяснять почему, поиши здесь ветки про потоки)
вот так будет правильнее
procedure TRunStringThread.Execute;
begin
while not terminated do begin
  Synchronize(MotionRunString);
  Sleep(10); //ну не знаю какой задержки он хотель допится тем пустым циклом, подбери
end;
end;


 
bulkas   (2005-01-13 18:35) [28]

Вот прежде чем лупить куда не попадя слипы, проверь как это будет работать, я сам знаю как в книжке написано.
Поставь слип, проверь, и увидишь в чем разница.


 
bulkas   (2005-01-13 18:49) [29]

Вобще потоки насколько я знаю нельзя использовать для изменения свойств визуальных компонентов.
И приведенный мной пример изначально неверен.

Но факт в том , что он работает и причем хорошо работает, но в том случае, если никакие другие процессы в программе не вызывают большую нагрузку.

Вопрос был как запустить бугущую строку быстро - я дал ответ.


 
sniknik ©   (2005-01-13 20:51) [30]

> Вот прежде чем лупить куда не попадя слипы, проверь как это будет работать, я сам знаю как в книжке написано.
> Поставь слип, проверь, и увидишь в чем разница.
не горячись так. ;о)) и лучше сам проверь. мой вариант в отличии от твоего более правильный. (можеш спросить тут на форуме, да и на любом другом)

а книжки... ;о)) знаем такие, небось архангельского начитался... ;о))) (там еще и не то есть)


 
sniknik ©   (2005-01-13 20:53) [31]

> Вобще потоки насколько я знаю нельзя использовать для изменения свойств визуальных компонентов.
через синхронизацию можно.


 
bulkas   (2005-01-13 22:33) [32]

Я естественно попробывал.
Даже если поставить sleep(1) все равно движется очень медленно.
А если сделать, как я говорю - быстро.
Вопрос: почему?

Да, Архангельского начитался =-)))))))))))


 
sniknik ©   (2005-01-13 23:58) [33]

> Даже если поставить sleep(1) все равно движется очень медленно.
> А если сделать, как я говорю - быстро.
> Вопрос: почему?
sleep это "засыпание" потока т.е. приостанов и передеча ресурсов другим, даже поставив sleep(0) ты как бы отдаеш управление другим потокам, естественно это медленнее чем даже весь твой цикл (тут я обсчитался, но я в обшем и не считал, так навскидку дал)

а за счет чего разница (почему)?... винда какая? диспетчер задач есть? открой его и посмотри на загруженность проца в том и другом случае...
у тебя, пустой в общемто код на 100% занимает систему, у меня на 0.001% (от машины будет зависеть, если вообще удастся увидеть)
а если у меня sleep убереш то получиш ту же самую скорость (кому оно нужно? прочитать не успееш, мелькает чтото) с той же загруженностью.
а от Application.ProcessMessages; (на что основной упор про неправильность) она практически не зависит.

> Да, Архангельского начитался =-)))))))))))
выброси, если еще не поздно. ;о)



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

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.041 c
9-1098489583
Malij
2004-10-23 03:59
2005.01.30
OpenGl


14-1105268110
Kerk
2005-01-09 13:55
2005.01.30
distributed.net


14-1105456159
Petrovich_
2005-01-11 18:09
2005.01.30
C++


14-1105318117
Alex_Petr
2005-01-10 03:48
2005.01.30
Устал за ;$1600 пить в одиночку


1-1106045945
ShimON
2005-01-18 13:59
2005.01.30
Шифрование паролей