मैं एक हास्केल प्रोग्राम लिख रहा हूं जो big mapsKnytt Stories विश्व फ़ाइलों से खींचता है। मैं छवि फ़ाइलों को बनाने के लिए friday
पैकेज का उपयोग करता हूं, और मुझे कई ग्राफिक्स परतों को लिखना होगा जिन्हें मैंने spritesheets से एक साथ रखा था। अभी, मैं इस के लिए मेरे अपने बदसूरत समारोह का उपयोग करें:`शुक्रवार पैकेज बहुत धीमा है
हैं "नीचे" परत:
import qualified Vision.Primitive as Im
import qualified Vision.Image.Type as Im
import qualified Vision.Image.Class as Im
import Vision.Image.RGBA.Type (RGBA, RGBAPixel(..))
-- Map a Word8 in [0, 255] to a Double in [0, 1].
w2f :: Word8 -> Double
w2f = (/255) . fromIntegral . fromEnum
-- Map a Double in [0, 1] to a Word8 in [0, 255].
f2w :: Double -> Word8
f2w = toEnum . round . (*255)
-- Compose two images into one. `bottom` is wrapped to `top`'s size.
compose :: RGBA -> RGBA -> RGBA
compose bottom top =
let newSize = Im.manifestSize top
bottom' = wrap newSize bottom
in Im.fromFunction newSize $ \p ->
let RGBAPixel rB gB bB aB = bottom' Im.! p
RGBAPixel rT gT bT aT = top Im.! p
aB' = w2f aB; aT' = w2f aT
ovl :: Double -> Double -> Double
ovl cB cT = (cT * aT' + cB * aB' * (1.0 - aT'))/(aT' + aB' * (1.0 - aT'))
(~*~) :: Word8 -> Word8 -> Word8
cB ~*~ cT = f2w $ w2f cB `ovl` w2f cT
aO = f2w (aT' + aB' * (1.0 - aT'))
in RGBAPixel (rB ~*~ rT) (gB ~*~ gT) (bB ~*~ bT) aO
यह बस एक नीचे की परत है और एक शीर्ष स्तर है, तो जैसे अल्फा कंपोजिट एक बनावट है, इसे शीर्ष परत के आकार में फिट करने के लिए क्षैतिज और लंबवत (wrap
द्वारा) लूप किया जाएगा।
नक्शा प्रस्तुत करना उससे कहीं अधिक लंबा लगता है। गेम के साथ आने वाली डिफ़ॉल्ट दुनिया के लिए मानचित्र को 27 मिनट-O3
पर ले जाता है, भले ही गेम स्वयं कुछ अलग-अलग मिलीसेकंड से कम में प्रत्येक अलग स्क्रीन को स्पष्ट रूप से प्रस्तुत कर सके। (उपरोक्त लिंक किए गए छोटे उदाहरण आउटपुट में 67 सेकंड लगते हैं; बहुत लंबा भी है।)
प्रोफाइलर (आउटपुट here) कहता है कि कार्यक्रम compose
में अपने समय का लगभग 77% खर्च करता है।
इसे काटना एक अच्छा पहला कदम लगता है। यह एक बहुत ही सरल ऑपरेशन की तरह लगता है, लेकिन मुझे friday
में मूल फ़ंक्शन नहीं मिल रहा है जो मुझे ऐसा करने देता है। माना जाता है कि जीएचसी fromFunction
सामानों को ध्वस्त करने में अच्छा होना चाहिए, लेकिन मुझे नहीं पता कि क्या हो रहा है। या पैकेज सिर्फ सुपर धीमी है?
Here’s the full, compileable code.
क्या आप 'रचना' में थोड़ा गहरा खोदने के लिए '-auto-all' प्रोफाइलिंग विकल्प का उपयोग कर सकते हैं और देख सकते हैं कि समय क्या ले रहा है? – crockeea
क्या यह आपको कुछ बताता है? https://bpaste.net/raw/cb2454d6fbc6 – Lynn
[यहां] (https://gist.github.com/lynn/504e0712b5dd8c13f953) कोड – Lynn