Конференция "Игры" » Быстрый канвас [Delphi, Windows, ХР]
 
  • Вася (02.03.09 00:11) [60]
    >>> А потому что пиксели экрана эта та штука, которую надо считать на видухе, а не на ЦПУ.

    Ого..... Научите? :)
  • Дуб © (02.03.09 05:59) [61]

    > Вася   (01.03.09 23:44) [58]
    > >>> Для экрана? Для каждого пиксела? И вся эта информация
    > визуально значительна? А логи на 100 метров, мы в туалете
    > на релаксацию читаем?
    >
    > Что-то не понял, что вы имели ввиду...


    Тут надо понять, что надо. Сомнения, что для нормальных fps нужно просчитывать очень сложно весь экран попиксельно самому. А для статики - странно что "тормозит".

    Возможно тормоза не там, а в выводе на канвас и т.п. В общем 17-я строка пока.
  • @!!ex © (02.03.09 11:27) [62]
    > [60] Вася   (02.03.09 00:11)

    GLSL?
  • Вася (02.03.09 16:18) [63]
    Кто это? :)
  • Sapersky (02.03.09 16:21) [64]
    Для 800х600 не тормозит... А на весь экран - тормозит... :(

    Я как раз намекаю на то, что пример plasma, при всей внешней схожести методов, как-то умудряется выдавать 77 FPS на Cel 2.8 и 1280*1024.
    Могу сказать конкретно - основная причина в использовании только целых чисел, я об этом писал ещё в [21], а также в отсутствии ветвлений (if) и прочих вредных для производительности вещей.

    Насчёт "видюхи" я тоже не имею ничего против. Неплохо знать разные методы работы с графикой, чтобы выбирать наилучший для каждой конкретной задачи. Можно применять смешанный подход - например, рассчитывать уменьшенную картинку софтверно и потом увеличивать её аппаратно.

    Правда, использование продвинутых функций аппаратной графики вроде GLSL несколько сужает диапазон железа, на котором оно может пойти.
  • @!!ex © (02.03.09 16:41) [65]
    > [64] Sapersky   (02.03.09 16:21)
    Правда, использование продвинутых функций аппаратной графики вроде GLSL несколько сужает диапазон железа, на котором оно может пойти.

    Если забыьт о моем любимом интеле, то будет работать на всех видеокартах не старше лет 4.
  • Дуб © (02.03.09 17:34) [66]

    > на всех видеокартах не старше лет 4.

    А стоит ли тех жертв, пока в 17-й строке ковыряемся?

    > Вася   (02.03.09 16:18) [63]

    Я бы, все-таки подумал для начала о том о чем говорил - о нужности расчитываемого отображаемого объема информации(на мое имхо - там перегрузка мозга, по минимуму), а на первый проход - о методах вывода, без вычислений. Просто без вычислений - как у вас заполянется весь канвас, словно те вычисления есть, но пустые?
  • Вася (02.03.09 22:14) [67]
    Я не понимаю про что вы... :(

    17-я строка чего?..

    Как в Делфи заставить производить вычисления и прорисовку кадра на видеокарте?..
  • Дуб © (03.03.09 05:42) [68]
    > Вася   (02.03.09 22:14) [67]

    Я тебе не про видеокарту. Я не знаю как ты наносишь данные на канву. Первые тормоза оттуда идут обычно.

    И второе, про что говорю, - насколько это важно тебе в своем коде мурыжить жестко каждый пиксел.
  • Вася (03.03.09 06:11) [69]
    >>> насколько это важно тебе в своем коде мурыжить жестко каждый пиксел

    А как по-другому-то?

    >>> Я не знаю как ты наносишь данные на канву. Первые тормоза оттуда идут обычно.

    Хм... А можете тогда сразу объяснить (не разбирая моих возможных ошибок по незнанию) как правильнее делать? :))
  • Дуб © (03.03.09 06:31) [70]
    > Вася   (03.03.09 06:11) [69]

    0. Я не знаю твоих задач.
    1. Если нужна динамичная картинка, то применять кучу синусов косинусов для каждого пиксела самому - может быть странно. Большинство пикселов проще просто интерполировать по некоторым соседям.
    2. Неа. Но если для канваса - то не пользовать для начала Canvas.Pixel[i,j], а прочитать для начала статью "Поставить точку". Об этом уже было в ветке.
  • Вася (03.03.09 20:28) [71]
    >>> проще просто интерполировать по некоторым соседям

    У меня случайное изображение... Сомневаюсь что оно как-то так делается...

    Вобщем так:
    Рисую в переменной типа TBitmap, используя метод (или как там его правильнее) TPARGB:=Bit.ScanLine[i];
    После этого рисую этот TBitmap на холсте (не важно - на TImage или TForm)

    Правда тут вот ещё такой вопрос...
    Нашёл вот такую информацию (цитаты у меня чтот не работают, уж извините так напишу)

    <<< Быструю графику не делают на элементе TTimer. Он не способен (или был раньше не способен?) выдавать события чаще чем через 55 мс (интервал = 1 не будет реализован), то есть TTimer в делфи не может вызываться раз в миллисекунду... Даже если поставить Timer.Interval:=1; то он всё равно будет вызываться примерно раз в 55 миллисекунд, а не раз в 1... >>>

    А у меня как раз TTimer кадры меняет..... :(

    Я уже и не знаю - не хватает ли скорости синуса или тут уже сам вывод тормозит.....
  • Sapersky (03.03.09 23:46) [72]
    Даже если поставить Timer.Interval:=1; то он всё равно будет вызываться примерно раз в 55 миллисекунд, а не раз в 1

    Так и есть, хотя для некоторых случаев 18-20 FPS хватает.
    Если нужно быстрее - используй Application.OnIdle с Done = False (см. справку).

    Я уже и не знаю - не хватает ли скорости синуса или тут уже сам вывод тормозит

    Так замерять нужно.
    В начале измеряемого блока TimeReset, в конце TimeMs/TimeShowMs, покажет время в миллисекундах:

    Var
     PCFreq, PCTime1, PCTime2 : Int64;

    procedure QueryPerformanceCounter(Var Cnt : Int64);
    Var Thread, OldMask : DWord;
    begin
    // force the thread to CPU 0 for multi-core CPU
    Thread := GetCurrentThread; OldMask := SetThreadAffinityMask(Thread, 1);

    // update counter frequency for CPUs with variable clock rate (Athlon64, Pentium M)
    QueryPerformanceFrequency(PCFreq);
    Windows.QueryPerformanceCounter(Cnt);

    // restore threads
    SetThreadAffinityMask(Thread, OldMask)
    end;

    procedure TimeReset;
    begin
    QueryPerformanceCounter(PCTime1);
    end;

    function TimeMs: Integer;
    begin
    QueryPerformanceCounter(PCTime2);
    Result:=( (PCTime2-PCTime1) * 1000 ) div PCFreq;
    PCTime1:=PCTime2;
    end;

    procedure TimeShowMs;
    Var i : Integer;
       s : String;
    begin
    i := TimeMs; Str(i, s);
    MessageBox(0, PChar(s), 'Time elapsed, ms ', MB_OK or MB_ICONWARNING);
    end;
  • Дуб © (04.03.09 05:54) [73]
    > У меня случайное изображение... Сомневаюсь что оно как-то
    > так делается...

    Ситуация в том, что каждая картинка - 1 том Войны и Мира. И таких томов ты хочешь давать - ну 20 в секунду. Кто такое воспринимает? Отсюда и не надо плясать над каждым пикселом. А уж если идет рендеринг - так его на железо лучше и повесить, а не рендерить самому.

    > Рисую в переменной типа TBitmap, используя метод (или как
    > там его правильнее) TPARGB:=Bit.ScanLine[i];

    Прочитай статью "Поставить точку".

    http://www.delphimaster.ru/articles/pixels/index.html

    Ну, и как сказали - надо померить.
  • Pavia © (04.03.09 08:35) [74]

    > У меня случайное изображение... Сомневаюсь что оно как-то
    > так делается...

    Так ты напиши что ты там делаешь иначе тебе никто не поможет. И нечего скрывать никто твои идее тырить не собирается.

    Ошибка в том что ты неправельно делаешь.
    А судя по описанием ты реализуешь плазму?
    Так она недолжна тормазить.
    Не зная что-ты делаешь нельзя посоветовать и сказать, что не так.
  • antonn © (05.03.09 01:54) [75]

    > > Рисую в переменной типа TBitmap, используя метод (или
    > как
    > > там его правильнее) TPARGB:=Bit.ScanLine[i];
    >
    > Прочитай статью "Поставить точку".

    собственно, примерно это он и делает.
  • Дуп (05.03.09 05:11) [76]

    > antonn ©   (05.03.09 01:54) [75]
    >
    > > > Рисую в переменной типа TBitmap, используя метод (или
    >
    > > как
    > > > там его правильнее) TPARGB:=Bit.ScanLine[i];
    > >
    > > Прочитай статью "Поставить точку".
    >
    > собственно, примерно это он и делает.

    ой ли?
  • MBo © (05.03.09 07:11) [77]
    >ой ли?
    По большому счету - да. Суть ведь одна - прямое обращение к блоку цветовых данных. Разница в удобстве.
  • Б (05.03.09 10:03) [78]
    > А судя по описанием ты реализуешь плазму?

    Нет, он делает скринсервер, с целой кучей вычислений синусов и косинусов. ;D
    (Вася   (01.03.09 23:44) [58] )

    > Почему "график"? Для графика не нужно было бы все пиксели перебирать...

    "График" - Ошибка: ГрафикА.
  • Б (05.03.09 10:31) [79]
 
Конференция "Игры" » Быстрый канвас [Delphi, Windows, ХР]
Есть новые Нет новых   [119322   +7][b:0.001][p:0.001]