Tôi đang viết một động cơ hạt và nhận thấy nó chậm hơn rất nhiều so với (Tôi đã viết các công cụ hạt 3D C++ không được tối ưu hóa cao có thể khiến các hạt 50k ở tốc độ 60 khung hình/giây, giảm xuống còn 32 khung hình/giây ở khoảng 1,2 k ..), tôi đã thực hiện một số phân tích về mã giả định kết xuất của các hạt hoặc phép quay là hoạt động chuyên sâu nhất của CPU, tuy nhiên tôi phát hiện ra rằng trên thực tế hai thuộc tính nhỏ này của đối tượng đồ họa thực sự chiếm hơn 70% hiệu suất của tôi ....Graphics.Transform là không hiệu quả ồ ạt, tôi có thể làm gì với điều này?
public void RotateParticle(Graphics g, RectangleF r,
RectangleF rShadow, float angle,
Pen particleColor, Pen particleShadow)
{
//Create a matrix
Matrix m = new Matrix();
PointF shadowPoint = new PointF(rShadow.Left + (rShadow.Width/1),
rShadow.Top + (rShadow.Height/1));
PointF particlePoint = new PointF(r.Left + (r.Width/1),
r.Top + (r.Height/2));
//Angle of the shadow gets set to the angle of the particle,
//that way we can rotate them at the same rate
float shadowAngle = angle;
m.RotateAt(shadowAngle, shadowPoint);
g.Transform = m;
//rotate and draw the shadow of the Particle
g.DrawRectangle(particleShadow, rShadow.X, rShadow.Y, rShadow.Width, rShadow.Height);
//Reset the matrix for the next draw and dispose of the first matrix
//NOTE: Using one matrix for both the shadow and the partice causes one
//to rotate at half the speed of the other.
g.ResetTransform();
m.Dispose();
//Same stuff as before but for the actual particle
Matrix m2 = new Matrix();
m2.RotateAt(angle, particlePoint);
//Set the current draw location to the rotated matrix point
//and draw the Particle
g.Transform = m2;
g.DrawRectangle(particleColor, r.X, r.Y, r.Width, r.Height);
m2.Dispose();
}
gì đang giết chết hiệu suất của tôi là đặc biệt những dòng này:
g.Transform = m;
g.Transform = m2;
Một nền nhỏ, đối tượng đồ họa được lấy từ painteventargs, sau đó nó hiển thị các hạt cho màn hình trong phương thức render particles, gọi phương thức này để thực hiện bất kỳ phép quay nào, đa luồng không phải là giải pháp như đối tượng đồ họa không thể được chia sẻ giữa nhiều luồng. Dưới đây là một liên kết đến các phân tích mã Tôi chạy chỉ để bạn có thể xem những gì đang xảy ra cũng như:
https://gyazo.com/229cfad93b5b0e95891eccfbfd056020
Tôi kinda suy nghĩ này là một cái gì đó mà có thể không thực sự được giúp đỡ bởi vì nó trông giống như bất động sản chính nó là phá hủy hiệu suất và không phải bất cứ điều gì tôi đã thực sự thực hiện (mặc dù tôi chắc chắn có chỗ để cải thiện), đặc biệt là kể từ khi dll lớp gọi là sử dụng sức mạnh cpu nhất. Dù sao, bất kỳ trợ giúp sẽ được đánh giá rất cao trong việc cố gắng tối ưu hóa điều này ... có lẽ tôi sẽ chỉ kích hoạt/vô hiệu hóa vòng quay để tăng hiệu suất, chúng tôi sẽ ...
Ngoài ra tôi xin lỗi vì hình ảnh, tôi biết nó thực sự nhỏ, nếu bạn nheo mắt, bạn có thể thấy các con số mặc dù! : P –