performance bug, more fixes

svn: r17463
This commit is contained in:
Matthias Felleisen 2010-01-02 21:47:08 +00:00
parent 719b72ca7e
commit 261aa3937a
4 changed files with 1431 additions and 10 deletions

View File

@ -210,6 +210,10 @@
(rec on-receive)) (rec on-receive))
(define drawing #f) ;; Boolean; is a draw callback scheduled? (define drawing #f) ;; Boolean; is a draw callback scheduled?
(define (set-draw#!) (set! draw# (random 3)) (set! drawing #f))
(define draw# 0)
(set-draw#!)
(define-syntax-rule (def/pub-cback (name arg ...) transform) (define-syntax-rule (def/pub-cback (name arg ...) transform)
;; Any ... -> Boolean ;; Any ... -> Boolean
(define/public (name arg ...) (define/public (name arg ...)
@ -218,6 +222,13 @@
(with-handlers ([exn? (handler #t)]) (with-handlers ([exn? (handler #t)])
(define tag (format "~a callback" 'transform)) (define tag (format "~a callback" 'transform))
(define nw (transform (send world get) arg ...)) (define nw (transform (send world get) arg ...))
(define (d) (pdraw) (set-draw#!))
;; ---
;; [Listof (Box [d | void])]
(define w '())
;; set all to void, then w to null
;; when a high priority draw is scheduledd
;; ---
(when (package? nw) (when (package? nw)
(broadcast (package-message nw)) (broadcast (package-message nw))
(set! nw (package-world nw))) (set! nw (package-world nw)))
@ -230,14 +241,24 @@
(when draw (pdraw)) (when draw (pdraw))
(callback-stop! 'name) (callback-stop! 'name)
(enable-images-button)) (enable-images-button))
(let ([changed-world? (send world set tag nw)]) (let ([changed-world? (send world set tag nw)])
(unless changed-world? (unless changed-world?
#; (when draw
(when draw (pdraw)) (cond
(when (and draw (not drawing)) [(not drawing)
(set! drawing #t) (set! drawing #t)
(queue-callback (lambda () (pdraw) (set! drawing #f)) (let ([b (box d)])
#f)) ;; low priority, otherwise it's too fast (set! w (cons b w))
;; low priority, otherwise it's too fast
(queue-callback (lambda () (unbox b)) #f))]
[(< draw# 0)
(set-draw#!)
(for-each (lambda (b) (set-box! b void)) w)
(set! w '())
;; high!! the scheduled callback didn't fire
(queue-callback (lambda () (d)) #t)]
[else
(set! draw# (- draw# 1))]))
(when (pstop) (when (pstop)
(when last-picture (when last-picture
(set! draw last-picture) (set! draw last-picture)
@ -259,9 +280,13 @@
(def/pub-cback (prec msg) rec) (def/pub-cback (prec msg) rec)
;; ---------------------------------------------------------------------- ;; ----------------------------------------------------------------------
;; draw : render this world ;; -> Void
(define/private (pdraw) (show (ppdraw))) ;; draw : render the given world or this world (if #f)
(define/private (pdraw)
(show (ppdraw)))
;; -> Scene
;; produce the scene for the this state
(define/private (ppdraw) (define/private (ppdraw)
(check-scene-result (name-of draw 'your-draw) (draw (send world get)))) (check-scene-result (name-of draw 'your-draw) (draw (send world get))))

View File

@ -0,0 +1,21 @@
#lang scheme
(require 2htdp/universe 2htdp/image)
(define (slow)
(let sloop ([n (expt 2 22)])
(unless (zero? n)
(sloop (- n 1)))))
(define (update-world w)
(slow)
(- w 1))
(define (render w)
(circle 30 'solid (if (odd? w) 'red 'green)))
(big-bang 10
(on-tick update-world)
(on-draw render)
(stop-when zero?))
(printf "done\n")

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
#lang scheme/gui
(require profile)
(profile-thunk
(λ ()
(parameterize ([current-eventspace (make-eventspace)])
(let ([s (make-semaphore 0)])
(queue-callback
(λ ()
(dynamic-require "perform-robby.ss" #f)
(semaphore-post s)))
(semaphore-wait s))))
#:threads #t)