Remove most asyncs (#14)

This commit is contained in:
Patrick Stevens
2023-05-06 23:40:09 +01:00
committed by GitHub
parent 075890919c
commit a2d40daef2
5 changed files with 49 additions and 93 deletions

View File

@@ -43,12 +43,14 @@ module SampleImages =
}
let image =
Array.init
Seq.init
256
(fun height ->
let output = Array.init 256 (fun i -> async { return pixelAt height i })
progressIncrement 1.0<progress>
output
async {
let output = Array.init 256 (pixelAt height)
progressIncrement 1.0<progress>
return output
}
)
|> Image.make 256 256

View File

@@ -16,24 +16,18 @@ module TestRayTracing =
let image =
[|
[| Colour.Red ; Colour.Green ; Colour.Blue |]
[|
async { return Colour.Red }
async { return Colour.Green }
async { return Colour.Blue }
|]
[|
async {
return
{
Red = 255uy
Blue = 0uy
Green = 255uy
}
{
Red = 255uy
Blue = 0uy
Green = 255uy
}
async { return Colour.White }
async { return Colour.Black }
Colour.White
Colour.Black
|]
|]
|> Array.map async.Return
|> Image.make 2 3
let outputFile = fs.Path.GetTempFileName () |> fs.FileInfo.FromFileName

View File

@@ -1,5 +1,6 @@
namespace RayTracing
open System.Threading.Tasks
open RayTracing
[<Measure>]
@@ -8,7 +9,7 @@ type progress
type Image =
private
{
Rows : Pixel Async[] seq
Rows : Async<Pixel[]> seq
RowCount : int
ColCount : int
}
@@ -19,34 +20,10 @@ module Image =
let colCount i = i.ColCount
let render (i : Image) : (Pixel * Async<unit>)[] seq =
i.Rows
|> Seq.map (fun imageRow ->
if imageRow.Length <> i.ColCount then
failwithf
"Thought the image had %i columns, got a pixel array with %i columns"
i.ColCount
imageRow.Length
let render (i : Image) : Pixel[][] Task =
i.Rows |> Async.Parallel |> Async.StartAsTask
let outputRow = Array.zeroCreate<Pixel * Async<unit>> i.ColCount
let doIt =
imageRow
|> Array.mapi (fun i p ->
async {
let! pixel = p
let _, a = outputRow.[i]
outputRow.[i] <- pixel, a
}
)
for k in 0 .. i.ColCount - 1 do
outputRow.[k] <- Unchecked.defaultof<_>, doIt.[k]
outputRow
)
let make (rowCount : int) (colCount : int) (pixels : Async<Pixel>[] seq) : Image =
let make (rowCount : int) (colCount : int) (pixels : Async<Pixel[]> seq) : Image =
{
RowCount = rowCount
ColCount = colCount

View File

@@ -148,46 +148,28 @@ module ImageOutput =
=
let tempFile = fs.Path.GetTempFileName () |> fs.FileInfo.FromFileName
tempFile,
task {
use outputStream = tempFile.OpenWrite ()
use enumerator = image.Rows.GetEnumerator ()
let mutable rowNum = 0
let task =
async {
use outputStream = tempFile.OpenWrite ()
let! pixels = image.Rows |> Async.Parallel
while enumerator.MoveNext () do
let row = enumerator.Current
let! _ =
pixels
|> Array.iteri (fun rowNum row ->
row
|> Array.mapi (fun colNum pixel ->
backgroundTask {
let! pixel =
match soFar.TryGetValue ((rowNum, colNum)) with
| false, _ -> pixel
| true, v -> async { return v }
lock
outputStream
(fun () ->
writeAsciiInt outputStream rowNum
outputStream.WriteByte 44uy // ','
writeAsciiInt outputStream colNum
outputStream.WriteByte 10uy // '\n'
outputStream.WriteByte pixel.Red
outputStream.WriteByte pixel.Green
outputStream.WriteByte pixel.Blue
)
incrementProgress 1.0<progress>
return ()
}
|> Array.iteri (fun colNum pixel ->
writeAsciiInt outputStream rowNum
outputStream.WriteByte 44uy // ','
writeAsciiInt outputStream colNum
outputStream.WriteByte 10uy // '\n'
outputStream.WriteByte pixel.Red
outputStream.WriteByte pixel.Green
outputStream.WriteByte pixel.Blue
incrementProgress 1.0<progress>
)
|> Task.WhenAll
rowNum <- rowNum + 1
}
)
}
tempFile, Async.StartAsTask task
let writePpm
(gammaCorrect : bool)

View File

@@ -213,21 +213,22 @@ module Scene =
RowCount = rowsIter
ColCount = colsIter
Rows =
Array.init
Seq.init
rowsIter
(fun row ->
let row = maxHeightCoord - row - 1
Array.init
colsIter
(fun col ->
let col = col - maxWidthCoord
async {
return
Array.init
colsIter
(fun col ->
let col = col - maxWidthCoord
async {
let ret = renderPixel print s rand camera maxWidthCoord maxHeightCoord row col
progressIncrement 1.0<progress>
return ret
}
)
let ret = renderPixel print s rand camera maxWidthCoord maxHeightCoord row col
progressIncrement 1.0<progress>
ret
)
}
)
}