Конференция "Игры" » Быстрый канвас [Delphi, Windows, ХР]
 
  • Pavia © (01.04.09 15:58) [140]

    > Но по-моему проще OnIdle со Sleep

    Мультимидийный таймер проще. 1мс. И не нужно заботиться.


    > Вообще есть способ повысить дискретность Sleep до 1 мс:

    Чуши не пишите. Sleep он гарантирует время задержки более но не менее указанного времени. Дискретность там не повышается. Там идея в том что если выставить максимальный приоритет у задачи то при вызови sleep(0) мы тут же поподаем в нашуже задачу только в другой поток. А гемора с планированием полно. Проще мультемидийный таймер там точность 1мс.


    > Код кривой.

    Согласен. Помниться когда только начинал разбираться умудрился написать код который на 300МГц работал быстрее чем на 2ГГц. =)в
  • @!!ex © (01.04.09 16:50) [141]
    > [140] Pavia ©   (01.04.09 15:58)
    > Мультимидийный таймер проще. 1мс. И не нужно заботиться.

    Многопточность - это проще? :)) Ну-ну.
  • Pavia © (01.04.09 18:15) [142]

    > Многопточность - это проще? :)) Ну-ну.

    Так она там и там. Но там мы расчитываем каждую операцию, не дай бог дольше и будут проблемы. А тут все окей система сама прервет когда надо. И заботиться о всех проверках нужно меньше.
  • @!!ex © (01.04.09 18:41) [143]
    > [142] Pavia ©   (01.04.09 18:15)

    OnIdle не создает второго потока.
  • Sapersky (01.04.09 20:05) [144]
    Чуши не пишите. Sleep он гарантирует время задержки более но не менее указанного времени. Дискретность там не повышается.

    См. фрагмент статьи начиная с "Поверье четвертое". О том, что timeBeginPeriod устанавливает размер кванта времени Windows, что влияет и на таймеры (MM/waitable), и на Sleep.

    А тут все окей система сама прервет когда надо.

    Это как, интересно, система может "прервать"? Если, допустим, выполняем в таймерной функции что-то более длительное чем интервал таймера...
    ИМХО, может только прокрутить последующие итерации с меньшим интервалом, чтобы попытаться компенсировать "отставание".
  • Pavia © (01.04.09 20:33) [145]

    > См. фрагмент статьи начиная с "Поверье четвертое". О том,
    >  что timeBeginPeriod устанавливает размер кванта времени
    > Windows, что влияет и на таймеры (MM/waitable), и на Sleep.
    >

    А ты возьми и проверь не меняет она квант времени. Вернее на коких-то вариантах ос может и меняет, но на xp viste 2003 она не меняла. И вообще этот факт относиться к 2000.
  • Sapersky (02.04.09 16:40) [146]
    Да, что-то не работает. Вроде же был эффект, правда, давно и на другом железе...
    Sleep(1) занимает от 1.2 до 1.9 мс в зависимости от нагрузки. Подозреваю, что "довесок" сильно зависит от конкретного железа, надо будет проверить на старом компе.
    MM-таймер как-то умудряется выдерживать интервал в 1 мс (хотя и не точно выдерживает, получается 0.9 с периодическими скачками до 2), что, конечно, круто, но... имеется неприятный побочный эффект: при превышении таймерного интервала (выполняем в таймерной функции что-то длительное) вся система начинает дико тормозить, даже 100% загрузка процессора не даёт такого эффекта. Так что "не дай бог дольше и будут проблемы" относится именно к MM-таймеру.
  • DomiNickDark (02.04.09 19:38) [147]
    А можно перевести это всё на язык для простых смертных..? :)

    "мультемидийный таймер" - это что за компонент и хде его добыть..? :)

    И всё-таки как лучше и быстрее..?
  • @!!ex © (02.04.09 20:06) [148]
    > [147] DomiNickDark   (02.04.09 19:38)

    MMSystem
    help timeSetEvent

    Быстрее OnIdle и QueryPerfomanceCounter
  • Pavia © (03.04.09 01:23) [149]

    > меется неприятный побочный эффект: при превышении таймерного
    > интервала (выполняем в таймерной функции что-то длительное)
    > вся система начинает дико тормозить, даже 100% загрузка
    > процессора не даёт такого эффекта. Так что "не дай бог дольше
    > и будут проблемы" относится именно к MM-таймеру.

    Да, это следствие. Но некритично. Уменьшаем интервал динамически что бы успевал выполняться. Зато можем равномерно распеделить нагрузку на разные процессы. Если без него то все определяется самой медленной операцией что не есть хорошо. Нет такой гибкости в планировании.

    QueryPerfomanceCounter высоко скоросной таймер. Особых нареканий нет. Единственное что в разных системах частота может быть любой, но постоянной и достаточно высокой блее 1МГц. И баг в многоядерных системах.

    OnIdle и QueryPerfomanceCounter дают в суме, хороший результат.
  • @!!ex © (03.04.09 08:58) [150]
    > [149] Pavia ©   (03.04.09 01:23)
    > QueryPerfomanceCounter высоко скоросной таймер. Особых нареканий
    > нет. Единственное что в разных системах частота может быть
    > любой, но постоянной и достаточно высокой блее 1МГц. И баг
    > в многоядерных системах.

    Чтобы бага не было , есть официальные заплатки.
  • Вася (05.04.09 03:37) [151]
    Я-то с "OnIdle" давно разобрался (почти сразу, как посоветовали), а вот компонентов "QueryPerfomanceCounter" и "MMSystem" чтот никак не найду - на какой они должны быть вкладке? Может у меня Делфи старая?((

    DomiNickDark, оно вот так работает:

    В "public" надо дописать: "procedure Idle(Sender: TObject; var Done: Boolean);"

    А в самом коде:

    procedure Draw;
    begin
    // твоя процедура
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Application.OnIdle:=Idle;
    end;

    procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
    begin
    Draw;
    Done:=False;
    end;
  • @!!ex © (05.04.09 05:58) [152]
    > а вот компонентов "QueryPerfomanceCounter" и "MMSystem"
    > чтот никак не найду

    А никто не говорил что это компоненты.

    Help о них все знает и гугл тоже.
  • AutoBOT (06.04.09 00:20) [153]
    > Pavia ©   (18.03.09 17:44) [107]

    потрясающий код.. я его, пожалуй, стырю.. Х)
    Pavia, вы не против?))
  • Sapersky (06.04.09 15:48) [154]
    а вот компонентов "QueryPerfomanceCounter" и "MMSystem" чтот никак не найду

    Вообще-то пример использования "компонента" QPC приводился ещё в [72]...
    И, кстати, такой вариант теоретически должен нормально работать на двухъядерниках.
  • AutoBOT (06.04.09 19:22) [155]
    Так там же что-то для замера времени.....

    Или вы предлагаете как-то так:

    While a=a Do
      Begin
      Draw2_7;
      Sleep(1);
      End;



    не будет ли оно тормозить..?
  • @!!ex © (06.04.09 19:25) [156]
    > [155] AutoBOT   (06.04.09 19:22)

    Постоянный рендер с расчетом времени между кадрами. Так делают ВСЕ большие игры. И ОЧЕНЬ много мелких. Так работают почти все демки.
  • Вася (06.04.09 21:58) [157]
    >>> Постоянный рендер с расчетом времени между кадрами. Так делают ВСЕ большие игры. И ОЧЕНЬ много мелких. Так работают почти все демки.

    Мда?? Ну я тогда попробую сделать так:

    Stop: BooLean;
    ...
    While Not Stop Do
     Begin
     Draw2_7;
     End;

    У меня даже с OnIdle всё равно подвисает, может так лучше будет...)

    А если сделать такой код в Form1.Button1Click - то его ж наверное не остановить...
    Может это отдельным потоком делать, чтоб можно было как-то управлять рисованием?
  • @!!ex © (06.04.09 22:26) [158]
    > [157] Вася   (06.04.09 21:58)

    Ну лично я в таких случаях просто не использую форм, а пишу окно на API. Там таких проблем нет.
    Остановить цикл в кнопке можно, если в цикл поместить Application.ProcessMessages(), но это убьет напрочь производительность.
  • @!!ex © (06.04.09 22:26) [159]
    Кстати, для окон с формами есть простое решение:
    OnPaint:
    begin
     //Draw Frame
     InvalidateRect(Handle,nil,false);
    end;
 
Конференция "Игры" » Быстрый канвас [Delphi, Windows, ХР]
Есть новые Нет новых   [134428   +39][b:0.001][p:0.001]