2009-05-15 44 views
7

Tôi đang sử dụng this marching cube algorithm để vẽ hình nổi 3D (được chuyển vào C#, xuất ra MeshGeomtry3D s, nhưng nếu không giống nhau). Các bề mặt kết quả trông tuyệt vời, nhưng mất nhiều thời gian để tính toán.Làm thế nào để tăng tốc các khối hành quân?

Có cách nào để tăng tốc các khối hành quân không? Điều rõ ràng nhất là chỉ đơn giản là giảm tỷ lệ lấy mẫu không gian, nhưng điều này làm giảm chất lượng của lưới kết quả. Tôi muốn tránh điều này.

Tôi đang xem xét một hệ thống hai vượt qua, trong đó không gian mẫu vượt qua đầu tiên thô ráp hơn nhiều, loại bỏ khối lượng mà cường độ trường thấp hơn mức cô lập của tôi. Đây có phải là khôn ngoan không? Cạm bẫy là gì?

Chỉnh sửa: mã đã được lược tả và phần lớn thời gian CPU được chia giữa các khối hành trình thường và tính toán cường độ trường cho từng góc ô lưới. Các tính toán hiện trường nằm ngoài tầm kiểm soát của tôi, vì vậy việc tăng tốc thói quen khối là lựa chọn duy nhất của tôi ...

Tôi vẫn nghĩ đến việc cố gắng loại bỏ không gian chết, vì điều này sẽ giảm số lượng cuộc gọi đến cả hai hệ thống đáng kể.

+0

Bạn đã lược tả mã chưa? – AShelly

Trả lời

5

Tôi biết điều này hơi cũ, nhưng gần đây tôi đã triển khai Cubing Marching dựa trên nhiều nguồn giống nhau. Có rất nhiều không hiệu quả ở đây. Tối thiểu nếu bạn đang làm một cái gì đó như

for (int x=0; x<densityArrayWidth; x++) 
    for (int z=0; z<densityArrayLength; z++) 
    for (int y=0; y<densityArrayHeight; y++) 
     Polygonize(Gridcell, isolevel, Triangles) 

Nhìn vào bao nhiêu lần bạn sẽ tái phân bổ edgeTable và có thể thực hiện được! Những người đó ngay lập tức cần phải chuyển sang lớp học tổng thể. Tôi cũng bỏ đối tượng gridCell, đi trực tiếp từ các điểm/giá trị đến các hình tam giác.

Tóm lại, nó không chỉ là sự phức tạp về thuật toán, phân bổ bộ nhớ (và trong cơ sở, điều này thực hiện một số lượng lớn trong số chúng) cũng mất thời gian.

2

Chỉ trong trường hợp bất kỳ ai khác kết thúc ở đây, việc xóa không gian chết thông qua tỷ lệ lấy mẫu thô hơn làm cho hầu như không có sự khác biệt nào ở tất cả. Bất kỳ an toàn từ xa (ví dụ: cho phép một biên giới để lấy mẫu hiện vật) lấy mẫu thô hơn kết thúc lên grabbing hầu hết các lưới anyway trong bất kỳ từ xa không tầm thường trường.

Đẩy nhanh quá trình đánh giá trường bên dưới (có ghi nhớ nặng) dường như chủ yếu là giải quyết các vấn đề về hiệu suất.

0

Thử dùng tứ diện hành quân thay thế - toán học đơn giản hơn, cho phép bạn xem xét ít trường hợp hơn cho mỗi ô.

+1

Tôi không nghĩ rằng đây là một ý tưởng tốt ... toán học đơn giản hơn, nhưng bạn sẽ phải xử lý nhiều tứ diện hơn bạn sẽ làm khối cho một độ phân giải lưới nhất định. Đây là một liên kết đến một bài khảo sát với các con trỏ để tối ưu hóa có thể, trong số những thứ khác. Đó là một chút cũ (2006) nhưng tôi không nghĩ rằng đó là tất cả những nghiên cứu mang tính cách mạng về nó gần đây. http://graphics.ethz.ch/teaching/scivis_common/Literature/Newman06.pdf – user168715

+0

Nhiều tứ diện hơn, nhưng ít tính toán hơn cho mỗi loại, ít phụ thuộc hơn, có thể song song hơn. Thật ra tôi không biết; Tôi đề cập đến nó bởi vì chúng tôi đang lập kế hoạch cho một thí nghiệm thay thế một hình khối diễu hành với chính mình, và tôi tò mò liệu có ai khác đã thử và đo lường hay không. – Crashworks

0

mỗi khối có 12 cạnh, nếu bạn đi qua từng ô và tìm 12 điểm giao nhau, bạn đang thực hiện quá 4 lần tính toán cho điểm giao nhau, bạn chỉ phải sử dụng 3 cạnh ở góc dưới cùng bên trái của mỗi khối, với một hàng bổ sung ở góc trên bên phải của khu vực, và sau đó sử dụng một nâng cấp đặc biệt để truy cập tất cả các giá trị mà bạn đã tìm thấy. Tôi sẽ làm một chủ đề về điều này bởi vì nó cần phải được thảo luận và nó phức tạp.

Ngoài ra, kiểm tra các khu vực trong không gian cần đa giác, bằng cách đánh giá mức ISO bằng cách sử dụng Octree và bỏ qua các khu vực cách xa mức ISO.

Tôi đã xem xét tuyên truyền, nhưng nó không phải là đáng tin cậy và hiệu quả.

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