Lựa chọn của bạn về hệ toạ độ (nói cách khác, lựa chọn của bạn về ý nghĩa của 1 đơn vị thế giới) đi đôi với lựa chọn của bạn về giá trị epsilon của cọ vẽ.
Hệ toạ độ được phản ánh trong giá trị ma trận biến đổi inputToWorld mà bạn truyền đến InProgressStrokesView.startStroke() và phép biến đổi tương tự mà bạn áp dụng cho Canvas khi vẽ nét khô.
Một ứng dụng thông thường chỉ có thể xem xét các đơn vị trên thế giới và để đối số strokeToWorldTransform của startStroke() làm ma trận nhận dạng mặc định.
Nếu ứng dụng của bạn hỗ trợ thao tác xoay, thu phóng hoặc xoay bề mặt vẽ, thì giá trị chính xác của các ma trận biến đổi đó sẽ thay đổi theo thời gian, nhưng những thay đổi đó phản ánh sự thay đổi về cách hệ toạ độ thế giới của bạn được camera mà người dùng xem bề mặt vẽ thông qua.
Hệ toạ độ thế giới có thể được hình dung như một lưới, trong đó mỗi ô có kích thước bằng một đơn vị thế giới. Epsilon là một kích thước trong lưới đó, một số dấu phẩy động của các đơn vị trên thế giới.
Khi người dùng phóng to nội dung của bạn, họ cũng phóng to lưới đơn vị thế giới. Vì vậy, việc lựa chọn đơn vị thế giới và kích thước epsilon theo mức thu phóng mặc định là 100% là rất quan trọng.
Định nghĩa kích thước đơn vị thế giới và giá trị epsilon trong đơn vị thế giới phải là các giá trị cố định trong suốt thời gian hoạt động của ứng dụng.
Quá trình triển khai nội bộ sử dụng epsilon để xác định khoảng cách tối thiểu giữa hai điểm để được coi là cùng một điểm. Nói cách khác, mọi khoảng cách nhỏ hơn epsilon đều được coi là khoảng cách bằng 0. Tham số này dùng để lượng tử hoá và làm tròn các phép tính nội bộ.
Kích thước đơn vị thế giới và giá trị epsilon hợp lý là bao nhiêu?
Để có thể di chuyển trên nhiều kích thước màn hình và mật độ thiết bị, kích thước đơn vị thế giới phải độc lập với mật độ. Đơn vị thông thường cho các trường hợp như vậy là pixel không phụ thuộc vào mật độ (dp). Thông thường, hãy chọn 1 dp làm kích thước đơn vị thế giới.
Khi chọn một giá trị epsilon cố định, hãy tránh việc triển khai nội bộ làm tròn các số đến bất kỳ khoảng cách nào lớn hơn một pixel. Với kích thước đơn vị thế giới là 1 dp, epsilon phải có kích thước tối đa là 1/4 (0,25 đơn vị thế giới) để có kích thước của một pixel trên các thiết bị có mật độ hiển thị cao, trong đó 1 dp có thể là 4 px. Tuy nhiên, nếu bạn muốn hỗ trợ người dùng phóng to nội dung của họ lên đến 10 lần và vẫn giữ được việc làm tròn liên quan đến epsilon thành 1 px trở xuống, thì epsilon phải là 0,25 chia cho 10, bằng 0,025 đơn vị thế giới.
Điều này không có nghĩa là bạn không thể phóng to hơn 10 lần, nhưng bạn có thể bắt đầu thấy một số điểm không chính xác và hiện tượng giả tạo trong quá trình kết xuất nét vẽ tại thời điểm đó.
Việc chọn giá trị epsilon là sự cân bằng giữa độ chi tiết chính xác khi phóng to và tài nguyên tính toán, chẳng hạn như:
- Chu kỳ CPU để tính toán hình học chính xác hơn
- Bộ nhớ để lưu trữ thêm thông tin chi tiết trong hình học đó
- Thời gian GPU để kết xuất hình học đó
Đây là các nguyên tắc mặc định hợp lý, nhưng bạn có thể sử dụng chúng để chọn hệ toạ độ và giá trị epsilon phù hợp hơn với nhu cầu của mình.
Việc đi quá xa những giá trị được đề xuất này có thể ảnh hưởng không tốt đến ứng dụng của bạn. Ví dụ: mức tiêu thụ tài nguyên tăng có thể khiến ứng dụng của bạn chạy chậm. Trong một số trường hợp, các vấn đề về độ chính xác của số thực dấu phẩy động cũng có thể biểu hiện dưới dạng các hiện tượng lạ về hình ảnh.