Tôi đang thực hiện chức năng nhiễu kết hợp và ngạc nhiên khi thấy rằng sử dụng nhiễu gradient (tức là tiếng ồn Perlin) thực sự nhanh hơn một chút so với nhiễu giá trị. Hồ sơ cho thấy rằng lý do cho điều này là bộ phận cần thiết để chuyển đổi các giá trị int ngẫu nhiên thành một đôi phạm vi -1.0 đến 1.0:Phân chia hiệu quả gấp đôi theo công suất 2
static double noiseValueDouble(int seed, int x, int y, int z) {
return 1.0 - ((double)noiseValueInt(seed, x, y, z)/1073741824.0);
}
tiếng ồn Gradient đòi hỏi một vài nhân lên nhiều hơn, nhưng do việc sử dụng bảng precomputed dốc số noiseValueInt
trực tiếp để tính chỉ mục vào bảng và không yêu cầu bất kỳ bộ phận nào. Vì vậy, câu hỏi của tôi là, làm thế nào tôi có thể làm cho các bộ phận trên hiệu quả hơn, xem xét việc phân chia là bởi một sức mạnh của 2 (2^30). Về mặt lý thuyết, tất cả những gì cần làm là trừ 30 từ số mũ kép, nhưng làm điều đó bằng vũ lực (tức là thao tác bit) sẽ dẫn đến tất cả các trường hợp góc (INF, NAN, tràn số mũ, v.v ...).). Một giải pháp lắp ráp x86 sẽ là ok.
Bạn có chắc chắn rằng điều đó quan trọng không? Sử dụng thao tác bit cụ thể của máy không mang tính di động và thậm chí có thể đạt hiệu suất do các vấn đề về bộ nhớ đệm hoặc lên lịch ... –
@BasileStarynkevitch Đó là ý tôi với đoạn cuối của tôi. Tôi không muốn làm thao tác bit giả sử IEEE 754, nhưng sẽ là tốt với một giải pháp lắp ráp x86 cụ thể. – zennehoy
Tôi sẽ không bận tâm về điều đó. Bạn sẽ không giành chiến thắng nhiều, và bạn có thể mất một số hiệu suất. –