Показать сообщение отдельно
  #1  
Старый 27.01.2013, 15:20
gadmaker gadmaker вне форума
Прохожий
 
Регистрация: 19.04.2009
Сообщения: 49
Репутация: 10
Вопрос Помогите оптимизировать!

Пишу нечто похожее на 3D карту, структуру ячеек с шириной, высотой, и длинной по типу одномерного массива:

Код:
type TGrid3D = class(TObject)
public
 SizeX, SizeY, SizeZ: Integer;
 Grid3D: array of Byte;
end;

var
 Grid3D: array of TGrid3D;
 Grid3DNumber: Word = 0;

function DsGrid3dCreate(SX,SY,SZ: Double): Double; cdecl;
begin
 Result:=-1;
 if SX*SY*SZ>1024*1024*1024 then Exit;
 SetLength(Grid3D,Length(Grid3D)+1);
 Grid3D[Grid3DNumber]:=TGrid3D.Create;
 Grid3D[Grid3DNumber].SizeX:=Trunc(SX);
 Grid3D[Grid3DNumber].SizeY:=Trunc(SY);
 Grid3D[Grid3DNumber].SizeZ:=Trunc(SZ);
 SetLength(Grid3D[Grid3DNumber].Grid3D,Grid3D[Grid3DNumber].SizeX*Grid3D[Grid3DNumber].SizeY*Grid3D[Grid3DNumber].SizeZ);
 Result:=Grid3DNumber;
 Grid3DNumber:=Grid3DNumber+1;
end;

function DsGrid3dDestroy(ID: Double): Double; cdecl;
begin
 Result:=0;
 Grid3D[Trunc(ID)].Destroy;
 Result:=1;
end;

function DsGrid3dSet(ID, X, Y, Z, V: Double): Double; cdecl;
var r: Integer;
begin
 Result:=0;
 r:=Grid3D[Trunc(ID)].SizeX*Grid3D[Trunc(ID)].SizeY*Trunc(Z)+Grid3D[Trunc(ID)].SizeX*Trunc(Y)+Trunc(X);
 Grid3D[Trunc(ID)].Grid3D[r]:=Trunc(V);
 Result:=1;
end;

function DsGrid3dGet(ID, X, Y, Z: Double): Double; cdecl;
var r: Integer;
begin
 r:=Grid3D[Trunc(ID)].SizeX*Grid3D[Trunc(ID)].SizeY*Trunc(Z)+Grid3D[Trunc(ID)].SizeX*Trunc(Y)+Trunc(X);
 if (X<0) or (Y<0) or (Z<0) or
    (X>=Grid3D[Trunc(ID)].SizeX) or (Y>=Grid3D[Trunc(ID)].SizeY) or (Z>=Grid3D[Trunc(ID)].SizeZ)
 then Result:=-1 else Result:=Grid3D[Trunc(ID)].Grid3D[r];
end;

function DsGrid3dGetSize(ID, WHD: Double): Double; cdecl;
begin
 try
  Result:=-1;
  if WHD = 0 then Result:= Grid3D[Trunc(ID)].SizeX;
  if WHD = 1 then Result:= Grid3D[Trunc(ID)].SizeY;
  if WHD = 2 then Result:= Grid3D[Trunc(ID)].SizeZ;
 except
  Result:=-1;
 end;
end;

вопрос в оптимизации DsGrid3dGet т.к. для защиты от некорректного ввода пользователя используется условие т.е. код защищён от запроса на отсутствующую ячейку. Можно ли заменить условие чем-то более быстым, поскольку этот запрос наиболее востребыванный?
Ответить с цитированием