Форум: "Основная";
Текущий архив: 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