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