2012-09-12 23 views
12

Android sử dụng cấu trúc RectF để vẽ bitmap. Tôi đang làm việc về cấu trúc trò chơi của mình, ví dụ, một Sprite sẽ có và phối hợp x/y, chiều rộng, chiều cao, tốc độ, v.v. Điều này có nghĩa là mỗi lần trong vòng lặp render của tôi, tôi phải truyền các số nguyên đó sang float khi tìm ra nguồn/đích RectF sử dụng ... cách khác, tôi có thể phổ biến hơn nhiều và sử dụng float ở mọi nơi để khi mô phỏng vật lý và kết xuất, tất cả các loại đã có cùng loại ... ngay cả khi nó không cần thiết cho thuộc tính (Tôi không cần phao cho "vị trí x", nhưng sẽ phải bỏ nó khi render nếu không phải).Đối với Android, tôi có nên sử dụng kiểu dữ liệu nổi thường xuyên hơn cho trò chơi của mình hay chỉ truyền tải nổi khi vẽ?

nếu nổi thường là 2-10x không hiệu quả hơn (mỗi http://developer.android.com/guide/practices/performance.html), khóa học thích hợp để thực hiện là gì?

TLDL: Tôi có nên cast int để nổi trên render, hoặc chỉ có tất cả các biến đóng góp được nổi để bắt đầu, ngay cả khi nổi không hiệu quả? Làm thế nào không hiệu quả là một typecast?

+1

Tôi xem một khoảng thời gian chuyên biệt để định hình trong tương lai gần .... :) Vì tất cả giá trị của nó, tính toán trên phao chậm, và do đó là đúc liên tục ... có thể profiling cho thấy rằng nó tốt hơn cho bạn dính vào phao thay vì thay đổi chúng liên tục. – Shark

+0

Câu trả lời đúng duy nhất ở đây là: thử cả hai và điểm chuẩn. Nó phụ thuộc vào việc tính toán hoặc đúc chiếm ưu thế. (Hoặc nếu một trong hai thực sự là một vấn đề để bắt đầu với.) – millimoose

+0

Trong nhiều, nếu không nhất, trường hợp bạn chỉ đơn giản là không thể tránh arithmetics điểm nổi. Cũng lưu ý rằng liên kết mà bạn cung cấp cho biết rằng điểm nổi có thể lên tới 2 lần trên các thiết bị không có FPU. Sự khác biệt tốc độ 10x được đề cập như một sự so sánh giữa hai thiết bị khác nhau. – harism

Trả lời

5

Cách tốt nhất để làm điều này là thực hiện các phép tính của bạn với mức độ chính xác cao nhất cần thiết để tạo ra kết quả mong đợi trong phạm vi dung sai được chỉ định. Điều đó có nghĩa là nếu bạn cần sử dụng đôi để tính toán và nhận được kết quả mong đợi với tính nhất quán, sau đó sử dụng chúng. Tìm ra nơi mà độ chính xác ít hơn là chấp nhận được, và chỉ thực hiện các hoạt động yêu cầu nó với phao. Hãy nhớ rằng, thế giới của bạn không phải gần đúng lực hấp dẫn trái đất đối với các vật rơi, bạn có thể đơn giản hóa mọi thứ và tạo ra trọng số 10 thay vì 9,81, làm cho pixel tương ứng với các đơn vị thậm chí, v.v. cùng đơn vị và tránh chuyển đổi đơn vị để làm toán (vì điều này dẫn đến ops bổ sung), tốt hơn nên thêm hằng số cuối cùng có thứ gì đó như trọng lực theo cm/s, m/s và km/h hơn là chỉ có một và chuyển đổi nó hàng ngàn lần. Oh và chi phí đúc int để nổi không phải là rất cao so với nhân 2 phao, do đó, suy nghĩ về điều đó. Tôi cũng lưu ý rằng các FPU ngày càng trở nên phổ biến hơn trong các điện thoại Android hiện đại, và do đó vấn đề sử dụng toán học dấu phẩy động đang trở nên ít quan trọng hơn (mặc dù không hoàn toàn).

Điều khác tôi muốn lưu ý là Double/Float/Integer so với double/float/int. Cái trước yêu cầu các đối tượng mới được tạo ra để sử dụng và không nên được sử dụng cho toán học (bất cứ khi nào có thể), trong khi thứ hai là nguyên thủy và không tạo ra đối tượng mới để sử dụng, chúng ít tốn kém hơn để tạo ra.

+0

Cảm ơn tôi đã giả định rằng: 'float a = 1.12f; int b = 2; float c = a + b; ' có thể xấu hoặc xấu hơn ' float a = 1.12f; float b = 2; float c = a + b; ' – user11398

+0

http://gamasutra.com/view/news/165567/Indepth_Float_precision__From_zero_to_100_digits.php#.UFGZeK6tbZ8 – Shark

Các vấn đề liên quan