Performance 慢帕斯卡图形单元

Performance 慢帕斯卡图形单元,performance,graph,pascal,Performance,Graph,Pascal,实际上这是我第一次来这里,所以 问题是:标准图形模块的绘图速度太慢了 我有一个研究所的任务,就是用pascal语言编写一个包含模块的大型程序。这个程序有几个部分,但我对图形部分感兴趣。我在屏幕的左角有一个类似计数器的数字,我需要它快速更新。但是我看到了每一个充满颜色的像素,哈哈 我正在使用免费的Pascal 2.6.4 询问一些快速绘制命令窗口的想法或其他方法 program graphical; uses wincrt, graph, querystring, kbd, Ti

实际上这是我第一次来这里,所以

问题是:标准图形模块的绘图速度太慢了

我有一个研究所的任务,就是用pascal语言编写一个包含模块的大型程序。这个程序有几个部分,但我对图形部分感兴趣。我在屏幕的左角有一个类似计数器的数字,我需要它快速更新。但是我看到了每一个充满颜色的像素,哈哈

我正在使用免费的Pascal 2.6.4

询问一些快速绘制命令窗口的想法或其他方法

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以获得更好的性能。对于新的开发,使用一种不会被弃用二十年的技术。