SDL

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

SDL

Post by cr0acker »

Решил написать что нить под сабж. Вроде заинитил окошко, туда сюда, ну чего то я не пойму как точки присовать. Написал такую процедуру:

Code: Select all

procedure draw_pixel(SCR: pSDL_surface; x: integer; y: integer; r: uint8; g: uint8; b: uint8);
var
  color : uint32;
  cs:byte;
  pixellocation: ^uint32;
begin
  color := SDL_MapRGB(SCR^.format, r, g, b);
  cs:= SCR^.format^.BytesPerPixel;
  case cs of
  1:begin 
      writeln ('8bpp not supported'); //8Bpp
    end;
  2:begin
      writeln ('15 or 16 bpp not supported'); //15 or 16
    end;
  3:begin
       writeln ('24bp not supported'); //24
    end;
  4:begin 
      
      new(pixellocation);
      pixellocation:=SCR^.pixels+y*round(SCR^.pitch/4)+x;
      pixellocation^:=color;
      //dispose(pixellocation);
    end;
  end;
end;
Но при её вызовове вот так

Code: Select all

SDL_LockSurface(screen);
  while x < 640 do
     begin 
      for y:=0 to 320 do begin
      draw_pixel(screen,x,y,round(y/2),round(y/2),round(x/3));
     end;
     inc(x);
  end;
  //SDL_LockSurface(screen);
  //draw_pixel(screen,240,320,254,253,252);
  SDL_UnlockSurface(screen);
  SDL_Flip(screen);
Заполняется не всё окно, получается вот так:
Image
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Да сишный код рисования точки выглядил так:

Code: Select all

 Uint32 *bufp;
        bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
        *bufp = color;
Может я где с математиекой накосячил?
В 2002 году cr0acker писал с использованием SDL на сях.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Умные люди подсказали сделать так:

Code: Select all

procedure draw_pixel(SCR: pSDL_surface; x: integer; y: integer; r: uint8; g: uint8; b: uint8);
type
  pint32 = ^uint32;
var
  color : uint32;
  cs:byte;
  pixellocation: pint32;
begin
  color := SDL_MapRGB(SCR^.format, r, g, b);
  cs:= SCR^.format^.BytesPerPixel;
  case cs of
  1:begin 
      writeln ('8bpp not supported'); //8Bpp
    end;
  2:begin
      writeln ('15 or 16 bpp not supported'); //15 or 16
    end;
  3:begin
       writeln ('24bp not supported'); //24
    end;
  4:begin 
      
      // new(pixellocation); // <--- Это не нужно...
      pixellocation:=pint32(SCR^.pixels) + y * (SCR^.pitch div 4) + x; // <--- Вот так лучше будет
      pixellocation^:=color;
      // dispose(pixellocation);
    end;
  end;
end;

Ну результат пока всё равно не ахти:
Image
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Смотри мою либу UniGraf - там я не флипаю, а делаю SDL_UpdateRect
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Shaos wrote:Смотри мою либу UniGraf - там я не флипаю, а делаю SDL_UpdateRect
Ок приду домой гляну.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

На самом деле всё правильно, просто я оконшок на 480 сделал, а рисую до 320:)
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

А вот чего я чего получилось из этого:
Image
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Правда пока медленно надо переделать вывод точек, или таблицу для плазмы предсчетат, а то 48% цпу жрёт.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Сделал прерасчет таблиц, пока медленновато. Стало давать ФПС 60, правда на видео не видно xvidcap грузит машину и всё начинает тормозить.
Image
Для просмотра видео нажать на картинку.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Научился поворачивать:
Image
Image
Image
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Как бы заоптимищировать:

Code: Select all

for x:=0 to leng do begin
    if coeff1>1001 then coeff1:=coeff1-1 else coeff1:=coeff1+1;
      if coeff2>5 then  coeff2:=coeff2-0.001 else coeff2:=coeff2+0.001;
      if coeff3>5 then  coeff3:=coeff3-0.001 else coeff3:=coeff3+0.001;
      if coeff4>1001 then coeff4:=coeff4-1 else coeff4:=coeff4+1;
      if coeff5>5 then  coeff5:=coeff5-0.001 else coeff5:=coeff5+0.001;
      if coeff6>5 then  coeff6:=coeff6-0.001 else coeff6:=coeff6+0.001;
      
     for i:=0 to pred(480) do begin
      for j:=0 to pred(640) do begin
        qx := r *(Sin(fi*j*i/Coeff1)-Coeff2*Sin(Coeff3*fi*i));
        qy := r *(Sin(fi*j*i/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;
    end;
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

cr0acker wrote:Как бы заоптимищировать:

Code: Select all

for x:=0 to leng do begin
    if coeff1>1001 then coeff1:=coeff1-1 else coeff1:=coeff1+1;
      if coeff2>5 then  coeff2:=coeff2-0.001 else coeff2:=coeff2+0.001;
      if coeff3>5 then  coeff3:=coeff3-0.001 else coeff3:=coeff3+0.001;
      if coeff4>1001 then coeff4:=coeff4-1 else coeff4:=coeff4+1;
      if coeff5>5 then  coeff5:=coeff5-0.001 else coeff5:=coeff5+0.001;
      if coeff6>5 then  coeff6:=coeff6-0.001 else coeff6:=coeff6+0.001;
      
     for i:=0 to pred(480) do begin
      for j:=0 to pred(640) do begin
        qx := r *(Sin(fi*j*i/Coeff1)-Coeff2*Sin(Coeff3*fi*i));
        qy := r *(Sin(fi*j*i/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;
    end;
1) fi*j посчитать один раз, а не 4
2) не считать Coeff2*Sin(Coeff3*fi*i) внутри цикла по j - оно всё равно меняться не будет, если i не меняется
3) развернуть массив цветов в одномерный и бежать по нему инкрементами
4) перейти на табличный синус и целочисленную арифметику ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
cr0acker
God
Posts: 1078
Joined: 03 Feb 2003 13:53

Post by cr0acker »

Shaos wrote:
cr0acker wrote:Как бы заоптимищировать:

Code: Select all

for x:=0 to leng do begin
    if coeff1>1001 then coeff1:=coeff1-1 else coeff1:=coeff1+1;
      if coeff2>5 then  coeff2:=coeff2-0.001 else coeff2:=coeff2+0.001;
      if coeff3>5 then  coeff3:=coeff3-0.001 else coeff3:=coeff3+0.001;
      if coeff4>1001 then coeff4:=coeff4-1 else coeff4:=coeff4+1;
      if coeff5>5 then  coeff5:=coeff5-0.001 else coeff5:=coeff5+0.001;
      if coeff6>5 then  coeff6:=coeff6-0.001 else coeff6:=coeff6+0.001;
      
     for i:=0 to pred(480) do begin
      for j:=0 to pred(640) do begin
        qx := r *(Sin(fi*j*i/Coeff1)-Coeff2*Sin(Coeff3*fi*i));
        qy := r *(Sin(fi*j*i/Coeff4)-Coeff5*Sin(Coeff6*fi*j));
        ColorBuffer[x,j,i].Red:=trunc(Abs(qy)) Mod 256;
        ColorBuffer[x,j,i].Green:=trunc(Abs(qy+qx)) Mod 256;
        ColorBuffer[x,j,i].Blue:=trunc(Abs(qx)) Mod 256;
        end;
     end;
    end;
1) fi*j посчитать один раз, а не 4
2) не считать Coeff2*Sin(Coeff3*fi*i) внутри цикла по j - оно всё равно меняться не будет, если i не меняется
3) развернуть массив цветов в одномерный и бежать по нему инкрементами
4) перейти на табличный синус и целочисленную арифметику ;)
Блин 21 век, 64х ядерные проци и табличный синус с целочисленной арифметикой:) Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

cr0acker wrote: Блин 21 век, 64х ядерные проци и табличный синус с целочисленной арифметикой:)
но тем не менее будет быстрее ;)
ну это я на последок оставил - если ещё захочется ускорить
cr0acker wrote: Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.
компилятор будет индексировать через умножение - а лишнее умножение тебе ненадо (тем более два ; )
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

cr0acker wrote:Блин 21 век, 64х ядерные проци и табличный синус с целочисленной арифметикой:) Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.
Ну можно же посчитать с хорошей точностью, с памятью то проблем не будет, ведь так? А выборка числа (пусть и вещественного) будет все быстрее, чем его посчитает FPU, который еще надо инициализировать.
Shaos wrote:
cr0acker wrote: Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.
компилятор будет индексировать через умножение - а лишнее умножение тебе ненадо (тем более два ; )
У него он вообще трехмерный. RGB собрать в один dword, буфер 640х480 объединить в один и идти, как сказал Shaos, инкрементом. А вот что означает X я не понял.
PS Если работать напрямую с фреймбуфером видеокарты в VESA режиме, то объединение буфера более чем логично. Не знаю за оконную систему Х-ов.