浏览代码

* improved speed; reduced memory usage of the interference bitmap

florian 22 年之前
父节点
当前提交
13a4e41b0c
共有 1 个文件被更改,包括 41 次插入13 次删除
  1. 41 13
      compiler/rgobj.pas

+ 41 - 13
compiler/rgobj.pas

@@ -125,18 +125,20 @@ unit rgobj;
           layer 1 - 256*256 blocks with pointers to layer 2 blocks
           layer 2 - blocks of 32*256 (32 bytes = 256 bits)
       }
-      Tinterferencebitmap2=array[byte] of set of byte;
-      Pinterferencebitmap2=^Tinterferencebitmap2;
-      Tinterferencebitmap1=array[byte,byte] of Pinterferencebitmap2;
+      Tinterferencebitmap2 = array[byte] of set of byte;
+      Pinterferencebitmap2 = ^Tinterferencebitmap2;
+      Tinterferencebitmap1 = array[byte] of Pinterferencebitmap2;
+      pinterferencebitmap1 = ^tinterferencebitmap1;
 
       Tinterferencebitmap=class
       private
         maxx1,
         maxy1    : byte;
-        fbitmap  : Tinterferencebitmap1;
+        fbitmap  : pinterferencebitmap1;
         function getbitmap(x,y:tsuperregister):boolean;
         procedure setbitmap(x,y:tsuperregister;b:boolean);
       public
+        constructor create;
         destructor destroy;override;
         property bitmap[x,y:tsuperregister]:boolean read getbitmap write setbitmap;default;
       end;
@@ -457,21 +459,40 @@ implementation
                               tinterferencebitmap
 ******************************************************************************}
 
+    constructor tinterferencebitmap.create;
+      begin
+        inherited create;
+        maxx1:=1;
+        getmem(fbitmap,sizeof(tinterferencebitmap1)*2);
+        fillchar(fbitmap^,sizeof(tinterferencebitmap1)*2,0);
+      end;
+
+
     destructor tinterferencebitmap.destroy;
       var
         i,j : byte;
       begin
-        for i:=0 to maxx1 do
-          for j:=0 to maxy1 do
-            if assigned(fbitmap[i,j]) then
-              dispose(fbitmap[i,j]);
+        if assigned(fbitmap) then
+          begin
+            for i:=0 to maxx1 do
+              for j:=0 to maxy1 do
+                if assigned(fbitmap[i,j]) then
+                  dispose(fbitmap[i,j]);
+            freemem(fbitmap);
+          end;
       end;
 
 
     function tinterferencebitmap.getbitmap(x,y:tsuperregister):boolean;
+      var
+        page : pinterferencebitmap2;
       begin
-        result:=assigned(fbitmap[x shr 8,y shr 8]) and
-                ((x and $ff) in fbitmap[x shr 8,y shr 8]^[y and $ff]);
+        result:=false;
+        if (x shr 8>maxx1) then
+          exit;
+        page:=fbitmap[x shr 8,y shr 8];
+        result:=assigned(page) and
+          ((x and $ff) in page^[y and $ff]);
       end;
 
 
@@ -481,10 +502,14 @@ implementation
       begin
         x1:=x shr 8;
         y1:=y shr 8;
+        if x1>maxx1 then
+          begin
+            reallocmem(fbitmap,sizeof(tinterferencebitmap1)*(x1+1));
+            fillchar(fbitmap[maxx1+1],sizeof(tinterferencebitmap1)*(x1-maxx1),0);
+            maxx1:=x1;
+          end;
         if not assigned(fbitmap[x1,y1]) then
           begin
-            if x1>maxx1 then
-              maxx1:=x1;
             if y1>maxy1 then
               maxy1:=y1;
             new(fbitmap[x1,y1]);
@@ -1771,7 +1796,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.89  2003-10-19 01:34:30  florian
+  Revision 1.90  2003-10-19 12:36:36  florian
+    * improved speed; reduced memory usage of the interference bitmap
+
+  Revision 1.89  2003/10/19 01:34:30  florian
     * some ppc stuff fixed
     * memory leak fixed