Performance 慢帕斯卡图形单元
实际上这是我第一次来这里,所以 问题是:标准图形模块的绘图速度太慢了 我有一个研究所的任务,就是用pascal语言编写一个包含模块的大型程序。这个程序有几个部分,但我对图形部分感兴趣。我在屏幕的左角有一个类似计数器的数字,我需要它快速更新。但是我看到了每一个充满颜色的像素,哈哈 我正在使用免费的Pascal 2.6.4 询问一些快速绘制命令窗口的想法或其他方法Performance 慢帕斯卡图形单元,performance,graph,pascal,Performance,Graph,Pascal,实际上这是我第一次来这里,所以 问题是:标准图形模块的绘图速度太慢了 我有一个研究所的任务,就是用pascal语言编写一个包含模块的大型程序。这个程序有几个部分,但我对图形部分感兴趣。我在屏幕的左角有一个类似计数器的数字,我需要它快速更新。但是我看到了每一个充满颜色的像素,哈哈 我正在使用免费的Pascal 2.6.4 询问一些快速绘制命令窗口的想法或其他方法 program graphical; uses wincrt, graph, querystring, kbd, Ti
program graphical;
uses
wincrt, graph, querystring, kbd, Timer, sysutils;
const
speedX1 = 0;
speedY1 = 0;
var
//draw part
gd, gm, error, tw, th, i: integer;
speedX2: integer = 10;
speedY2: integer = 10;
speedSize: word;
speedImage: pointer;
size: word;
//qstring part
qrec: qstr;
qtext: AnsiString;
current, ch: char;
//keyboard part
kbrd: kb;
//speedometer part
counter: word = 0;
time: word;
speed: word;
//debug part
c: string;
t: comp;
procedure draw; //screens text
begin
qtext := copy(qrec.text, qrec.qpointer, Length(qrec.text) - qrec.qpointer + 1);
outTextXY(getMaxX div 2, getMaxY div 8, qtext);
end;
begin
//graphic initialization
//gd := detect;
gd := VGA;
gm := VGAHi;
initgraph(gd, gm, '..\bgi');
//checking for errors
error := graphResult;
if (error <> grOk) then
begin
writeln('800x600x256 is not supported');
halt(1);
end;
//querystring initialization
qInit(qrec);
//keyboard initialization
initKeyboard(kbrd);
//timer initialization
TimerOn;
time := 0;
//drawing
setTextStyle(defaultFont, horizDir, 8);
draw;
drawKeyboard(kbrd);
current := getCurrent(qrec);
randomize;
speedX2 := 200;
speedY2 := 100;
repeat
//on timer events
if (isTimer) then
begin
size := ImageSize(speedX1, speedY1, speedX2, speedY2);
GetMem(speedImage, size);
GetImage(speedX1, speedY1, speedX2, speedY2, speedImage^);
PutImage(speedX1, speedY1, speedImage^, 1); FreeMem(speedImage, size);
inc(time);
speed := round(counter/time/25*60);
speed := time;
outTextXY(0, 0, IntToStr(speed));
end;
if KeyPressed then
begin
ch := readkey;
if (ch = #0) then
ch := readkey;
end;
if (UpCase(ch) = UpCase(current)) then
begin
drawKeyboard(kbrd);
draw;
current := getCurrent(qrec);
inc(counter);
end
else
if (counter > 0) then
dec(counter);
until (ch = #27) or (getLength(qrec) < 0);
closegraph;
end.
我从代码中看到: 每次迭代都会调用drawKeyboard,这可能不是必需的 对于每个计时器事件,都会再次分配和释放内存,这通常是一个相当昂贵的操作。所需的内存似乎大小不变,因此请尝试将分配和解除分配移出循环。
如果不解决这些问题,您可能也会遇到与其他图形库相同的问题,请尝试一下。显示一些代码如何?好的,但这对您没有帮助,伙计。。。。并正确设置格式。问题在ontimer部分。理论上,它每40毫秒更新一次屏幕,但不会发生,因为绘图速度慢。这不是Dos,这是windows控制台,不太适合绘图。您可以尝试wingraph以获得更好的性能。对于新的开发,使用一种不会被弃用二十年的技术。