Vector3 so với Vector2 - hiệu suất, cách sử dụng?


8

Tôi hiện đang chơi xung quanh với XNA và tạo một nền tảng 2D đơn giản. Tôi đã nghĩ đến việc thêm nhiều lớp để làm cho nó một chút thách thức.

Thay vì có một Vector2vị trí cho các vị trí của mình, bây giờ tôi chỉ sử dụng một Vector3, chỉ để sử dụng nó Zlàm độ sâu lớp. Tuy nhiên, vì bạn không thể sử dụng các toán tử giữa Vector2Vector3vì một số lý do không xác định [1] , cuối cùng tôi đã thay đổi tất cả các game khác Vector2trong trò chơi của mình, chẳng hạn như tăng tốc , tốc độbù đắp , vì vậy tôi có thể làm những việc như position += offsetkhông có lỗi.

Tôi cũng đã thay đổi biến xoay của mình từ floatsang Vector3và tôi sử dụng Zgiá trị để xoay kết cấu của mình. Tôi đang dự định sử dụng XYlật tỷ lệ họa tiết của mình, để bạn có được hiệu ứng Super Paper Mario.

Tuy nhiên, sau khi thay đổi tất cả những thứ này Vector2trong Vector3s, tôi cảm thấy hơi tệ về nó. Làm thế nào điều này ảnh hưởng đến hiệu suất của trò chơi? Tôi biết tôi không cần phải lo lắng về hiệu suất trong trò chơi platformer nhỏ của mình, nhưng tôi chỉ tò mò về nó.

Có bất kỳ hoạt động đáng chú ý giữa Vector2s và Vector3s, ví dụ như khi thêm hoặc nhân họ, hoặc khi gọi Normalize, Transformhoặc Distance?


[1] Chỉ là một câu hỏi phụ, tại sao không có toán tử để tính toán giữa Vector3 và Vector2?

Câu trả lời:


13

Có bất kỳ hoạt động đáng chú ý giữa Vector2s và Vector3s, ví dụ như khi thêm hoặc nhân họ, hoặc khi gọi Normalize, Transformhoặc Distance?

Có, bạn có thêm một tọa độ để bạn sẽ sử dụng nhiều chu kỳ CPU hơn.

Nhưng nó rất khó có thể gây rắc rối cho bạn. XNA 4 đang sử dụng các phần mở rộng SIMD cho toán học vectơ (EDIT: chỉ trên Windows Phone ), vì vậy việc triển khai là rất tối ưu (trên nền tảng đó). Ngoại trừ nếu bạn đang làm máy tính rất nặng, rất khó có thể gây rắc rối cho bạn. Bạn cần Vector3s cho các vị trí của mình vì bạn hiện đang thực hiện 3D (hoặc 2.5D ...), vì vậy vui lòng không thực hiện bất kỳ tối ưu hóa sớm nào. Đây là 97% ác 1 .

Chỉ là một câu hỏi phụ, tại sao không có toán tử để tính toán giữa Vector3 và Vector2?

Bởi vì nó không có ý nghĩa, về mặt toán học. Bạn mong đợi điều gì từ những tính toán như vậy? Chẳng hạn, điều gì sẽ xảy ra nếu bạn cố gắng thêm a Vector3và a Vector2:

[ x1, y1, z1 ] + [ x2, y2 ] = [ x1 + x2, y1 + y2, z1 ] hoặc [ x1, y1 + x2, z1 + y2 ]?

Trong trường hợp này, thông thường bạn sẽ cần tự xác định những gì bạn muốn làm tọa độ thứ ba cho Vector2và nơi bạn muốn thêm nó. Ví dụ, điều này giải quyết sự mơ hồ:

[ x1, y1, z1 ] + [ x2, y2, 0 ] = [ x1 + x2, y1 + y2, z1 ]


Bây giờ có thể một số phần trong trò chơi của bạn chỉ hoạt động ở dạng 2D. Nếu có những trường hợp bạn chỉ cần 2D tọa độ, và nếu máy tính không có được thực sự nặng (ví dụ như vật lý 2D), bạn có thể dính vào Vector2s trong đó phần cụ thể của mã để tiết kiệm một số chu kỳ quý giá. Sau đó, bạn có thể dễ dàng chuyển đổi giữa các tọa độ 2D và 3D khi bạn cần (ví dụ: lấy vị trí cảnh từ vị trí vật lý 2D hoặc ngược lại):

Ví dụ: từ Vector2việc Vector3sử dụng hàm tạo này :

Vector2 v2;
Vector3 v3(v2, someDepthValue);

Hoặc từ Vector3việc Vector2sử dụng hàm tạo đó ;

Vector3 v3;
Vector2 v2(v3.X, v3.Y);

1 Theo lời của Donald Knuth :

Các lập trình viên lãng phí một lượng lớn thời gian để suy nghĩ hoặc lo lắng về tốc độ của các phần không chính xác trong chương trình của họ và những nỗ lực này có hiệu quả thực sự có tác động tiêu cực mạnh khi gỡ lỗi và bảo trì. Chúng ta nên quên đi những hiệu quả nhỏ, nói về 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi tội lỗi . Tuy nhiên, chúng ta không nên bỏ qua cơ hội của mình trong 3% quan trọng đó.


Như tôi đã nói, tôi biết rằng tôi không phải lo lắng về hiệu suất sớm như vậy, nhưng chính sự tò mò của tôi đã khiến tôi đăng câu hỏi này. Tôi đoán bạn đúng về sự mơ hồ . Cảm ơn câu trả lời rõ ràng :)
Rudey

@RuudLender Tôi đã thêm chi tiết về cách bạn có thể tiến hành nếu bạn gặp phải các vấn đề về hiệu suất.
Laurent Couvidou

Tôi đã chỉnh sửa câu trả lời của bạn để bao gồm một điểm rất quan trọng: SIMD chỉ được XNA sử dụng trên Windows Phone! Thời gian chạy .NET trên PC - và do đó chính XNA - không hỗ trợ SIMD. Tương đương cũng không được hỗ trợ trên Xbox 360.
Andrew Russell

(Trên PC và Xbox 360, Hiểu về Hiệu suất Khung XNA vẫn là hướng dẫn áp dụng để tối ưu hóa các hoạt động vectơ của bạn.)
Andrew Russell

Tối ưu hóa sớm không phải là xấu xa. Chỉ tối ưu hóa vô dụng sớm là. Bạn cần loại trừ nó với lý do là vô dụng , không phải với lý do là quá sớm.
sam hocevar

3

Bạn đang cố gắng tối ưu hóa sớm. Hầu hết các thao tác bạn đã đề cập (chuẩn hóa, biến đổi, khoảng cách) khá giống với những gì vector2D thực hiện, nếu bạn có thể nhìn vào mã của chúng, bạn sẽ nhận thấy rằng chúng thực tế giống nhau. Sự khác biệt duy nhất là vector3D có trục thứ ba. Hiệu suất khôn ngoan nên tầm thường so với Vector2D.

Đối với câu hỏi phụ của bạn:
Bởi vì bạn không thể nhân ma trận / vectơ hàng / vectơ cột mà cả hai đều có kích thước khác nhau.


1

Một trong những hiệu ứng hiệu suất lớn nhất của việc sử dụng Vector3không cần thiết, thay vì Vector2, là tăng 50% kích thước và hiệu ứng có trên bộ đệm .

Dữ liệu bổ sung không cần thiết đó cần được tải vào bộ đệm CPU từ bộ nhớ chính. Đây là sloooow .

Ngoài ra, bằng cách tải dữ liệu không cần thiết này, bạn tăng cơ hội rằng bạn đang đẩy ra dữ liệu hữu ích mà ngay lập tức phải được tải lại vào bộ đệm.

Trong một vòng lặp chặt chẽ khiêm tốn, các hiệu ứng bộ đệm sẽ áp đảo bất kỳ hiệu ứng CPU nào khi thực hiện các thao tác bổ sung.

Ngoài ra, nhanh hơn để thêm các phần tử trực tiếp (do các quirks khác nhau của .NET). Vì vậy, nếu bạn tối ưu hóa vi mô, bạn sẽ không sử dụng các hoạt động vectơ nào. Vì vậy, nếu bạn chỉ cần thêm hai phần tử đầu tiên của một vectơ, bạn có thể làm điều này:

v1.X += v2.X; v1.Y += v2.Y;

Nhưng những cân nhắc về hiệu suất này chỉ thực sự có thể áp dụng cho những thứ như động cơ hạt, động cơ vật lý, v.v. Vì vậy, đừng quá lo lắng!


Vì vậy, nội tuyến thủ công vẫn là cách nhanh nhất để đi ngay cả với sự hỗ trợ bổ sung của SIMD?
Mikael Högström

1
@ MikaelHögström SIMD gần như chắc chắn sẽ nhanh hơn - nhưng nó là chỉ có sẵn trên nền tảng Windows Phone (xem chỉnh sửa và ý kiến tôi thực hiện để trả lời Laurent Couvidou của).
Andrew Russell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.