2016-10-10 4 views
2

나는 느릅 나무로 쓰여진 콘웨이의 삶의 게임을 uminokirin.com으로 실행했다.느릅 나무 인생 프로그램의 게임이 응답하지 않게됩니다 - 정상적으로 실패하는 방법이 있습니까?

출처는 here입니다.

이 프로그램을 사용하면 사용자가 원반 그리드의 크기를 조정하고 셀을 클릭하여 상태를 변경하고 세계를 무작위로 추출 할 수 있습니다. 그것은 내 컴퓨터에서 작은 값 (50 미만)에 대해 잘 작동합니다.

그러나 임계 값이 항상 같지 않은 더 큰 그리드에서 임의 화 그리드 기능을 사용하려고하면 프로그램이 아무런 경고없이 응답하지 않으며 복구 할 수있는 유일한 방법은 앱을 다시로드하는 것입니다.

GOL 알고리즘은 최적화되어 있지 않으며 모든 셀에 대해 하나의 svg 직사각형을 사용하는 것은 대단히 비효율적 일 수 있습니다.하지만 그 이유는 프로그램이 왜 속도가 느려지는 대신이 방식으로 작동하는지 설명하지 않습니다.

느릅 나무 런타임이 포기하고 있습니까? 아니면 어떤 종류의 브라우저 보호 장치입니까?

더 중요한 것은 격자의 최대 크기를 임의로 제한하는 것 외에이 동작을 방지하는 방법이 있습니까?

답변

6

관찰중인 동작은 Javascript 스택 오버플로가 원인입니다. "랜덤 화"버튼을 누르면 브라우저 콘솔에서 "잡히지 RangeError : 최대 호출 스택 크기 초과"메시지를 볼 수 있습니다.

이것은 randomize 함수가 여러 개의 큰 임시 변수를 할당하기 때문에 발생합니다. 특히, 무작위 화 함수에서 호출 된 셔플 함수는 라이프 그리드의 모든 셀에 대해 하나의 요소가있는 두 개의 임시 목록을 할당하는 것처럼 보입니다. 느릅 나무는 적시에 이것들을 공개하는 것에 영리 할지도 모르지만 이것은 너무 멀리 밀고있는 것처럼 보입니다.

이 문제를 해결하려면 더 간단한 임의 화 기능을 사용할 수 있습니다. 아래에 표시된 버전은 Elm Generators를 사용하여 Dead/Alive 값의 단일 목록을 생성 한 다음 해당 목록에서 임의 화 된 배열을 초기화합니다.

randomize2 : Array Cell -> Int -> Int -> Int -> Array Cell 
randomize2 grid gs sd n = 
    let floatGen = Random.float 0.0 1.0 
     lifeGen = Random.map (\b -> if (b < toFloat n/100) then Alive else Dead) floatGen 
     listGen = Random.list (gs*gs) lifeGen 
    in fst (Random.step listGen (initialSeed sd)) |> fromList 

내가 600 × 600까지 격자의 크기를 조정하고 성공적으로 무작위 할 수 있었다이 RANDOMIZE 기능을 사용. 그 시점에서 나는 시험을 중단했다.