每个高级FMX 3D对象都会产生一个“绘制调用”(drawcall)。这个过程会重新处理所有内容,从CPU(网格准备)到GPU(显示)-> 您始终需要最小化绘制调用次数。
因此,显示10000个FMX矩形永远不是解决方案。:)
您只需创建1个Tmesh子类,它将在一次调用中绘制您的10000个“手工制作”的矩形。
请查看TMesh.Data(data.points和data.triangleindice),以了解如何在直接模式下绘制3D对象。或者更简单地说,请查看源代码中的“TPlane”是如何构建的。
作为一般计划和基本的“3D制作”方法,制作“复杂”的3D FMX对象是可能的,但您必须处理顶点/索引,以便在一次调用中尽可能多地绘制物体。
例如,以下是实现它的代码:
将TMesh放在您的视口上,并调用此过程:
Procedure PopulateMesh_RectangleMap(aMesh : TMesh; const xCount : integer = 100; const yCount : integer=100; const rectWidth : single = 2.0; const rectHeight : single= 1.0);
var lv,li : integer;
lsx, lsy, xpos, ypos : single;
i,j : integer;
a,b,c,d : TPoint3d;
begin
Assert(assigned(aMesh));
lsx := rectWidth;
lsy := rectHeight;
li := 0;
lv := 0;
aMesh.Data.Clear;
aMesh.Data.VertexBuffer.Length := 4 * xCount * yCount;
aMesh.Data.IndexBuffer.Length := 6 * xCount * yCount;
for i := 0 to xcount-1 do
for j := 0 to ycount-1 do begin
xpos := -xcount/2 + i + i*lsx;
ypos := -ycount/2 + j + j*lsy;
a := point3d(xpos - lsx/2,ypos - lsy/2,0);
b := point3d(xpos + lsx/2,ypos - lsy/2,0);
c := point3d(xpos + lsx/2,ypos + lsy/2,0);
d := point3d(xpos - lsx/2,ypos + lsy/2,0);
aMesh.Data.VertexBuffer.Vertices[li+0] := a;
aMesh.Data.VertexBuffer.Vertices[li+1] := b;
aMesh.Data.VertexBuffer.Vertices[li+2] := c;
aMesh.Data.VertexBuffer.Vertices[li+3] := d;
aMesh.Data.IndexBuffer.Indices[lv+0] := li+0;
aMesh.Data.IndexBuffer.Indices[lv+1] := li+1;
aMesh.Data.IndexBuffer.Indices[lv+2] := li+2;
aMesh.Data.IndexBuffer.Indices[lv+3] := li+2;
aMesh.Data.IndexBuffer.Indices[lv+4] := li+3;
aMesh.Data.IndexBuffer.Indices[lv+5] := li+0;
inc(li,4);
inc(lv,6);
end;
aMesh.Data.BoundingBoxNeedsUpdate;
aMesh.Width := lsx*3;
aMesh.Height := lsy*3;
aMesh.Repaint;
end;