-
>>> А потому что пиксели экрана эта та штука, которую надо считать на видухе, а не на ЦПУ.
Ого..... Научите? :)
-
> Вася (01.03.09 23:44) [58] > >>> Для экрана? Для каждого пиксела? И вся эта информация > визуально значительна? А логи на 100 метров, мы в туалете > на релаксацию читаем? > > Что-то не понял, что вы имели ввиду...
Тут надо понять, что надо. Сомнения, что для нормальных fps нужно просчитывать очень сложно весь экран попиксельно самому. А для статики - странно что "тормозит".
Возможно тормоза не там, а в выводе на канвас и т.п. В общем 17-я строка пока.
-
> [60] Вася (02.03.09 00:11)
GLSL?
-
Кто это? :)
-
Для 800х600 не тормозит... А на весь экран - тормозит... :(
Я как раз намекаю на то, что пример plasma, при всей внешней схожести методов, как-то умудряется выдавать 77 FPS на Cel 2.8 и 1280*1024. Могу сказать конкретно - основная причина в использовании только целых чисел, я об этом писал ещё в [21], а также в отсутствии ветвлений (if) и прочих вредных для производительности вещей.
Насчёт "видюхи" я тоже не имею ничего против. Неплохо знать разные методы работы с графикой, чтобы выбирать наилучший для каждой конкретной задачи. Можно применять смешанный подход - например, рассчитывать уменьшенную картинку софтверно и потом увеличивать её аппаратно.
Правда, использование продвинутых функций аппаратной графики вроде GLSL несколько сужает диапазон железа, на котором оно может пойти.
-
> [64] Sapersky (02.03.09 16:21) Правда, использование продвинутых функций аппаратной графики вроде GLSL несколько сужает диапазон железа, на котором оно может пойти.
Если забыьт о моем любимом интеле, то будет работать на всех видеокартах не старше лет 4.
-
> на всех видеокартах не старше лет 4.
А стоит ли тех жертв, пока в 17-й строке ковыряемся?
> Вася (02.03.09 16:18) [63]
Я бы, все-таки подумал для начала о том о чем говорил - о нужности расчитываемого отображаемого объема информации(на мое имхо - там перегрузка мозга, по минимуму), а на первый проход - о методах вывода, без вычислений. Просто без вычислений - как у вас заполянется весь канвас, словно те вычисления есть, но пустые?
-
Я не понимаю про что вы... :(
17-я строка чего?..
Как в Делфи заставить производить вычисления и прорисовку кадра на видеокарте?..
-
> Вася (02.03.09 22:14) [67]
Я тебе не про видеокарту. Я не знаю как ты наносишь данные на канву. Первые тормоза оттуда идут обычно.
И второе, про что говорю, - насколько это важно тебе в своем коде мурыжить жестко каждый пиксел.
-
>>> насколько это важно тебе в своем коде мурыжить жестко каждый пиксел
А как по-другому-то?
>>> Я не знаю как ты наносишь данные на канву. Первые тормоза оттуда идут обычно.
Хм... А можете тогда сразу объяснить (не разбирая моих возможных ошибок по незнанию) как правильнее делать? :))
-
> Вася (03.03.09 06:11) [69]
0. Я не знаю твоих задач. 1. Если нужна динамичная картинка, то применять кучу синусов косинусов для каждого пиксела самому - может быть странно. Большинство пикселов проще просто интерполировать по некоторым соседям. 2. Неа. Но если для канваса - то не пользовать для начала Canvas.Pixel[i,j], а прочитать для начала статью "Поставить точку". Об этом уже было в ветке.
-
>>> проще просто интерполировать по некоторым соседям
У меня случайное изображение... Сомневаюсь что оно как-то так делается...
Вобщем так: Рисую в переменной типа TBitmap, используя метод (или как там его правильнее) TPARGB:=Bit.ScanLine[i]; После этого рисую этот TBitmap на холсте (не важно - на TImage или TForm)
Правда тут вот ещё такой вопрос... Нашёл вот такую информацию (цитаты у меня чтот не работают, уж извините так напишу)
<<< Быструю графику не делают на элементе TTimer. Он не способен (или был раньше не способен?) выдавать события чаще чем через 55 мс (интервал = 1 не будет реализован), то есть TTimer в делфи не может вызываться раз в миллисекунду... Даже если поставить Timer.Interval:=1; то он всё равно будет вызываться примерно раз в 55 миллисекунд, а не раз в 1... >>>
А у меня как раз TTimer кадры меняет..... :(
Я уже и не знаю - не хватает ли скорости синуса или тут уже сам вывод тормозит.....
-
Даже если поставить 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;
-
> У меня случайное изображение... Сомневаюсь что оно как-то > так делается...
Ситуация в том, что каждая картинка - 1 том Войны и Мира. И таких томов ты хочешь давать - ну 20 в секунду. Кто такое воспринимает? Отсюда и не надо плясать над каждым пикселом. А уж если идет рендеринг - так его на железо лучше и повесить, а не рендерить самому. > Рисую в переменной типа TBitmap, используя метод (или как > там его правильнее) TPARGB:=Bit.ScanLine[i];
Прочитай статью "Поставить точку". http://www.delphimaster.ru/articles/pixels/index.htmlНу, и как сказали - надо померить.
-
> У меня случайное изображение... Сомневаюсь что оно как-то > так делается...
Так ты напиши что ты там делаешь иначе тебе никто не поможет. И нечего скрывать никто твои идее тырить не собирается.
Ошибка в том что ты неправельно делаешь. А судя по описанием ты реализуешь плазму? Так она недолжна тормазить. Не зная что-ты делаешь нельзя посоветовать и сказать, что не так.
-
> > Рисую в переменной типа TBitmap, используя метод (или > как > > там его правильнее) TPARGB:=Bit.ScanLine[i]; > > Прочитай статью "Поставить точку".
собственно, примерно это он и делает.
-
> antonn © (05.03.09 01:54) [75] > > > > Рисую в переменной типа TBitmap, используя метод (или > > > как > > > там его правильнее) TPARGB:=Bit.ScanLine[i]; > > > > Прочитай статью "Поставить точку". > > собственно, примерно это он и делает.
ой ли?
-
>ой ли? По большому счету - да. Суть ведь одна - прямое обращение к блоку цветовых данных. Разница в удобстве.
-
> А судя по описанием ты реализуешь плазму?
Нет, он делает скринсервер, с целой кучей вычислений синусов и косинусов. ;D (Вася (01.03.09 23:44) [58] )
> Почему "график"? Для графика не нужно было бы все пиксели перебирать...
"График" - Ошибка: ГрафикА.
-
|