nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 29 Mar 2024 07:09



Reply to topic  [ 27 posts ]  Go to page 1, 2  Next
SDL 
Author Message
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post SDL
Решил написать что нить под сабж. Вроде заинитил окошко, туда сюда, ну чего то я не пойму как точки присовать. Написал такую процедуру:
Code:
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:
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
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Oct 2008 11:22
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Да сишный код рисования точки выглядил так:
Code:
 Uint32 *bufp;
        bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
        *bufp = color;

Может я где с математиекой накосячил?
В 2002 году cr0acker писал с использованием SDL на сях.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Oct 2008 12:45
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Умные люди подсказали сделать так:
Code:
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
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Oct 2008 13:18
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Post 
Смотри мою либу UniGraf - там я не флипаю, а делаю SDL_UpdateRect

_________________
:dj: https://mastodon.social/@Shaos


05 Oct 2008 14:49
Profile WWW
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Shaos wrote:
Смотри мою либу UniGraf - там я не флипаю, а делаю SDL_UpdateRect

Ок приду домой гляну.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Oct 2008 22:52
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
На самом деле всё правильно, просто я оконшок на 480 сделал, а рисую до 320:)

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Oct 2008 22:56
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
А вот чего я чего получилось из этого:
Image

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


27 Nov 2008 14:29
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Правда пока медленно надо переделать вывод точек, или таблицу для плазмы предсчетат, а то 48% цпу жрёт.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


27 Nov 2008 14:30
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Сделал прерасчет таблиц, пока медленновато. Стало давать ФПС 60, правда на видео не видно xvidcap грузит машину и всё начинает тормозить.
Image
Для просмотра видео нажать на картинку.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


28 Nov 2008 13:00
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Научился поворачивать:
Image
Image
Image

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Dec 2008 12:16
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Как бы заоптимищировать:
Code:
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
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Dec 2008 12:19
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Post 
cr0acker wrote:
Как бы заоптимищировать:
Code:
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) перейти на табличный синус и целочисленную арифметику ;)

_________________
:dj: https://mastodon.social/@Shaos


05 Dec 2008 15:47
Profile WWW
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Shaos wrote:
cr0acker wrote:
Как бы заоптимищировать:
Code:
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
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


05 Dec 2008 17:18
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22422
Location: Silicon Valley
Reply with quote
Post 
cr0acker wrote:
Блин 21 век, 64х ядерные проци и табличный синус с целочисленной арифметикой:)


но тем не менее будет быстрее ;)
ну это я на последок оставил - если ещё захочется ускорить

cr0acker wrote:
Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.


компилятор будет индексировать через умножение - а лишнее умножение тебе ненадо (тем более два ; )

_________________
:dj: https://mastodon.social/@Shaos


05 Dec 2008 18:05
Profile WWW
Banned
User avatar

Joined: 20 Mar 2005 13:41
Posts: 2141
Location: От туда
Reply with quote
Post 
cr0acker wrote:
Блин 21 век, 64х ядерные проци и табличный синус с целочисленной арифметикой:) Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.

Ну можно же посчитать с хорошей точностью, с памятью то проблем не будет, ведь так? А выборка числа (пусть и вещественного) будет все быстрее, чем его посчитает FPU, который еще надо инициализировать.
Shaos wrote:
cr0acker wrote:
Кстати почему ондомерный будет быстрее? Компилятор жепоидеедолжен это сам делать, попробую завтра.

компилятор будет индексировать через умножение - а лишнее умножение тебе ненадо (тем более два ; )

У него он вообще трехмерный. RGB собрать в один dword, буфер 640х480 объединить в один и идти, как сказал Shaos, инкрементом. А вот что означает X я не понял.
PS Если работать напрямую с фреймбуфером видеокарты в VESA режиме, то объединение буфера более чем логично. Не знаю за оконную систему Х-ов.


06 Dec 2008 00:04
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 27 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 28 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.