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

Вниз

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

 
Паша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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.03 c
14-1105605805
лягушка-путешественица
2005-01-13 11:43
2005.01.30
Хачу в Америку


3-1103794357
ks13
2004-12-23 12:32
2005.01.30
Проблема с таблицами, или с приложением?


3-1103809388
Бульбаш
2004-12-23 16:43
2005.01.30
Обработка исключения Oracle


1-1106150907
Wolf3
2005-01-19 19:08
2005.01.30
Ка поставить таймаут на определенное время?


1-1105787946
Ilya___
2005-01-15 14:19
2005.01.30
ошибка: Invalid variant operation





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