Помощь - Поиск - Пользователи - Календарь
Полная версия: Ускорение графики
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Altair
Очень медленно выводятся некоторые фигуры, например, окружность.
Как можно ускорить вывод графики?

В программе выводятся только окружности, но много.
Вывод осуществляется ОЧЕНЬ медленно.
Может поможет написание процедуры Circle на асме?
NetAnton
Могу привести тебе программку с рисованием окружности (см. присоединенный файл). Можно, в принципе, основную процедуру набросить на асме.
Очень хотелось бы взглянуть на graph.tpu, то есть на graph.pas, но где его взять - вот проблема.
p.s. конечно же, мне сейчас рейтинг еще раз понизят за то что программу припер в этот раздел.
GLuk
Цитата(NetAnton @ 4.07.04 12:51)
Могу привести тебе программку с рисованием окружности (см. присоединенный файл). Можно, в принципе, основную процедуру набросить на асме.
Очень хотелось бы взглянуть на graph.tpu, то есть на graph.pas, но где его взять - вот проблема.
p.s. конечно же, мне сейчас рейтинг еще раз понизят за то что программу припер в этот раздел.

С дизассемблером не пробовал поработать?
NetAnton
с тем, что tpu расклеивает в текстовый документ с подробной информацией о процедурах, переменных и т.п.? да, опыт небольшой есть
Altair
lol.gif
нет, дизасемблировать, значит загружать с помощью специальной проги свою прогу в память и переводить машинные инструкции в код ассемблера
NetAnton
lol.gif
зачем мне объяснять, что это такое. я прекрасно знаю, что такое декомпиляция, дизассемблирование и прочие штучки
Altair
тогда зачем спрашивал что это?
Цитата
с тем, что tpu расклеивает

Кстати не все расклеиваются.
Ты я так понимаю пробовал с помощью спец. утилитки?
Она вроде на tp 7 не работает ...
NetAnton
у меня есть такие утилитки для tpu-шников для 5, 6 и 7 версии. пока не замечал ничего такого. если хочешь, выложу на свой сайт для седьмой версии. сюда экзешники не хочет цеплять.

http://netanton.narod.ru/other/TINFO70.EXE
Altair
Ладно, так есть какие-нибудь реальные способы ускорить графику, кроме асма?
APAL
Та прога, что была выложена, она использует стандартную процедурку вывода точек. А ведь можно попробовать работать напрямую с памятью - скорость наверняка будет больше...


P.S.:
Цитата
p.s. конечно же, мне сейчас рейтинг еще раз понизят за то что программу припер в этот раздел.

Ай-яй-яй! angry.gif
Altair
Точно, как я сразу не догадался. Спасибо, APAL.
Осталось только определить как нарисовать точку в режими 640*480 ?
BlackShadow
smile.gif
Уж лучше 13h. Там явно проще.
А вообще можно было бы подумать о "прозрачной" вставке изображения. Если у тебя однотипные фигуры, то можно создать маску этой фигуры с указанием индексов цветов той или иной точки и флага прозрачности. Затем при выводе брать какую-то палитру и выводить с её помощью. Получается довольно быстро, если не пользоваться PutPixel. По сравнению с рисованием самой окружности выигрыш идёт на отсутствии каких-либо вычислений. А если фигура куда сложней...
Altair
13h проще, но мне надо именно 640*480.
А можешь поподробнее про твой метод?
Делов в том, что у меня выводятся только окружности, при этом разного радиуса.
Romtek
Цитата(Oleg_Z)
Ладно, так есть какие-нибудь реальные способы ускорить графику, кроме асма?

OpenGL, DirectX... smile.gif

В ДОСе ты все равно быстро ничего не сделаешь.
Кстати, пробовал ли ты вывод графики во Фри ?
BlackShadow
Принцип примерно такой:
1). Готовишь матрицу m*n, в которой записываешь коды цвета каждого пикселя. Например:
Код

0 0 1 0 0
0 1 0 1 0
1 0 2 0 1

2). Когда нужно вывести фигуру пробегаешь по массиву и вместо кода цвета подставляешь нужный цвет или пропускаешь точку вобще.
Например при выводе фигуры указанного массива можно поступить так.Написать функцию DrawShtuka с четырьмя параметрами: x, y, цвет №1 и цвет №2. В функции пробежаться по этому массиву типа
Код

For i:=0 To 4 Do
 For j:=0 To 2 Do
   Case Matrix[i,j] Of
     1: PutPixel(x+i,y+j,Color1);
     2: PutPixel(x+i,y+j,Color2)
   End

Для шибкоразноцветных фигур можно передавать массив цветов. А в идилии такая функция описывается примерно так:
Код

Type
 TIntVector=Array Of Integer;
 TIntMatrix=Array Of TIntVector;

Procedure Draw(x,y:Integer;Matrix:TIntMatrix;Colors:TIntVector);
Var
 i,j:Integer;
Begin
 For i:=0 To Hi(Matrix) Do
   For j:=0 To Hi(Matrix[i]) Do
     If Matrix[i][j]<>-1 Then
        PutPixel(x+i,y+j,Colors[Matrix[i][j]]
End;

Ну, или примерно так.

В твоём случае, конечно, это плохой выход. Даже, наверное, совсем не выход. Но в будующем может и пригодится smile.gif
Romtek
Во первых, это лишнее использование памяти.
Во вторых, вряд ли увеличит скорость вывода окружностей.
BlackShadow
Я про сложные фигуры. Например 20 камазов разного цвета. Проще один раз забить в массив, чем 20 раз рисовать.
P@sh@
Oleg_Z
но мне надо именно 640*480
да еще в 16 цветов поди?

в принципе не намного сложнее, чем в 13h, особенно в защищенном режиме с несегментированной проекцией видеопамяти... правда не совсем просто установить этот режим - видеопорты надо настраивать... но пример на асме у меня где-то был...
а если в реальном режиме, то так же, по адресу A000h... только с большими разрешениями надо проецируемые сегменты видеопамяти переключать, с VESA-функциями это сделать несложно, а без них не знаю, наверное опять в видеопорты надо лезть...
да еще если 4х- (или 1-) битный цвет, то придется по ORу биты складывать
Shadow
необязательно ASM, но напрямую в видео память
можно предварительные расчеты хранить в файле
после запуска программы грузить их в опреативку
да много способов....
----------
но тут есть особенность оптимизация под скорость
увеличивает размер программы зависимость smile.gif
BlackShadow
Не всегда оптимизация по скорости приводит к росту размеров. Вот яркий пример:

Код

Begin
 Asm
   MOV AX,0013h
   INT 10h
   MOV AX,$A000
   MOV ES,AX
   MOV CX,100
   MOV AL,$FF
   XOR DI,DI
   REP STOSB
   XOR AH,AH
   INT 16h
   MOV AX0003
   INT 10h
 End
End.

против
Код

Uses Graph,Crt;
Var
 r,m:Integer;
Begin
 r:=DETECT;
 InitGraph('',r,m);
 SetColor(WHITE);
 Line(0,0,99,0);
 ReadKey;
 RestoreCRTMode
End.

Увеличивается только кол-во строк в исходнике, да и то не так уж сильно smile.gif
Shadow
BlackShadow
представь что программа в исходнике несколько МГб и ее нужно оптимизиров подскорость
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.