A very primitive example of bitmap/image double buffering in tcl. With this model: More sprites & more updates == more cpu used.
source bmpdata.dat proc do_frame {} { # Generate a random frame full of sprites. set sprites {} for {set i 0} {$i < 100} {incr i} { set dest_x [expr {int (rand()*620)}] set dest_x2 [expr {int ($dest_x + 28)}] set dest_y [expr {int (rand()*420)}] set dest_y2 [expr {int ($dest_y + 35)}] set sprite [expr {int (rand()* 2) == 0 ? $::sprite_1:$::sprite_2}] lappend sprites [list $sprite $dest_x $dest_y $dest_x2 $dest_y2] } # "blit" the sprites to the buffer. foreach sprite_info $sprites { foreach {spr dest_x dest_y dest_x2 dest_y2} $sprite_info {} $::double_buffer copy $spr -to $dest_x $dest_y $dest_x2 $dest_y2 } } proc do_update {} { # Clear the display area with the background image. # Use 'blank' if you do not have one. i.e. $::double_buffer blank $::double_buffer copy $::base_image -zoom 2 3 # Get the frame update. do_frame # Push out the new frame. .l1 configure -image $::double_buffer # This controls our frame rate. after 35 {do_update} } # Load the background and the sprite images. set ::sprite_1 [image create photo -data $box_data] set ::sprite_2 [image create photo -data $hitchcock_data] set ::base_image [image create photo -height 640 -width 480 -data $map_data] set ::double_buffer [image create photo -height 640 -width 480] $::double_buffer copy $::base_image -zoom 2 3 #Get the first frame full... do_frame label .l1 -height 680 -width 500 -image $double_buffer pack .l1 # Start up the frame 'animator' after 35 {do_update}
Bitmap data file bmpdata.dat:
set box_data {R0lGODlhHAAjAPcAAAAAAAsLAQsLDAgHBBMNABQSAhsUABwaARUVDBQUExoa Gg4PDyQbASgZATIdBSkmBDYpATc2BycnGTc2FS4wDx0dIigoJzY2Kjc4Ni8v LR4hFEc3AVY5AEUvBE89ITxCJUdGCFlGAVhYCldXFUpKFGZJAGpVAXhYAHBO BXloAHt3BWdnFnd3F2lpDUNDO0lIJ3FyJV1jGTw8Q0hIR1dXVlFSTWVlW1pa ZGloaHh4d3Bxbl5gXT4+QodaAJReAJpeAIxkAIdnAJRkAJtkAJRrAJpqAIZ4 AZxzAJd5AIN7F6FkAKJsAKZ5ALJ+ALZ2AJZqEIR9eHyCFH6DeoeGCZqDAYmI FpiYF5CTEqyDAKeGALSEALyMALeJAL2UAL2aALWTAaWZFaenGri4Ga+oDZmY Jo+OLKKWJqKRMaenJrq5KLq6Nq2sMJyjIsONAMiKAMWVAMuVAMWbAMubAMmc C9KVANKbANmbANiVAc+VCcWhAMyhAMqnCtKhANSnB8qqFcq4GdC0Eci8KNO7 KMi9NtC2ML3JG77JKL3IN77TL8vLFcTEHMvEHMXLHMvLHMfHFNLLHNPHGcvS HMfTGdLSHNPTFsvLDMTEJMvFJMXLJMvLJMXFLMvFLMXLLMvLLNLFJNLLJNLF LNLLLNnKKcXSJMvSJMXSLMvSLMvZKdLSJNLSLNfWKsXFM8vFM8XLM8vLM8XF O8vFO8XLO8vLO9LFM9LLM9LFO9LLO9nJNsXSM8vSM8XSPMvSO8vZONLSM9LS O9bXN7S2Q4WGe6ydQsu9Rr7LRcXFQ8vFQ8XLQ8vLQ8vFSsXLSsvLSsXFS9LF Q9LLQ9LLStTGScXSQ8vSQ8vSS8fUSdLSQ9PTStfXRsrKUtHPUnt7hYB8hX2F iYeHiJeYl5CRj6Skm6Wsk5qbpKiop7e3t7Gxrp+hnb3EtMjIus/Ouby9xb+8 27zHzM3NzMjIxsvSydXVycvK1dfX19DN0ePj2tPU5ezs7Obm5fLy7ezs8/T0 9P////f3+O/w8N/f38a9xiwAAAAAHAAjAAAI/wD3CRxIsKDBgwgTKlwoMF8+ hhCHHbpSDyJCesHkuCLkSk64gQ4hsjvjqpKrkyevDHFypQUMOcDOIRx3xiTK jVecyOmx8tDNIQ8Ftgt3BaXNM3KSyhlC8uYhDu1Avtx48pCcK0qHDDl0CyUh lWd6eCOYj+TVIXJYMr15cog3OVH30TN4BqndHjDYXhEmdFhCnyVPvlTZMVgw gocPstN4k0POM+3YhcQh8AnCM1eKnlx6kpBAb+3m7hs3JvFBHD04cGih09Wh oPRgmo17cJxWrUkDn2tXCWnHQzIR1tOp8yrKQxxd5Uz6MSFWpYzZVrLqyvTB 4livcHxyaPqwdsmtG6h8C707bYHYTp5ROA56bgzcxnkbBiz564T50ColdAuA fwCamXTFQmhl5wQvDfzHgVOiXVYJdJXA8B8AcvByUiXsKBQOdk4gV8F/EQxT 1TgKteOeRvjIFZRGlTSXEEtKFXUIifu0I2JnCyGV1IMoXdFdYFecd9AwSS3X WUdn3HIFjQuZmBQh0W02lkXtPHeVfZBZNNA5wehXEnBaGpQPRkOEE1SYaKZp UUAAOw==} set hitchcock_data {R0lGODlhGgAmAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgICAgMDAwP8AAAD/ AP//AAAA//8A/wD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAMwAAZgAAmQAAzAAA/wAzAAAzMwAzZgAzmQAzzAAz/wBmAABmMwBmZgBm mQBmzABm/wCZAACZMwCZZgCZmQCZzACZ/wDMAADMMwDMZgDMmQDMzADM/wD/ AAD/MwD/ZgD/mQD/zAD//zMAADMAMzMAZjMAmTMAzDMA/zMzADMzMzMzZjMz mTMzzDMz/zNmADNmMzNmZjNmmTNmzDNm/zOZADOZMzOZZjOZmTOZzDOZ/zPM ADPMMzPMZjPMmTPMzDPM/zP/ADP/MzP/ZjP/mTP/zDP//2YAAGYAM2YAZmYA mWYAzGYA/2YzAGYzM2YzZmYzmWYzzGYz/2ZmAGZmM2ZmZmZmmWZmzGZm/2aZ AGaZM2aZZmaZmWaZzGaZ/2bMAGbMM2bMZmbMmWbMzGbM/2b/AGb/M2b/Zmb/ mWb/zGb//5kAAJkAM5kAZpkAmZkAzJkA/5kzAJkzM5kzZpkzmZkzzJkz/5lm AJlmM5lmZplmmZlmzJlm/5mZAJmZM5mZZpmZmZmZzJmZ/5nMAJnMM5nMZpnM mZnMzJnM/5n/AJn/M5n/Zpn/mZn/zJn//8wAAMwAM8wAZswAmcwAzMwA/8wz AMwzM8wzZswzmcwzzMwz/8xmAMxmM8xmZsxmmcxmzMxm/8yZAMyZM8yZZsyZ mcyZzMyZ/8zMAMzMM8zMZszMmczMzMzM/8z/AMz/M8z/Zsz/mcz/zMz///8A AP8AM/8AZv8Amf8AzP8A//8zAP8zM/8zZv8zmf8zzP8z//9mAP9mM/9mZv9m mf9mzP9m//+ZAP+ZM/+ZZv+Zmf+ZzP+Z///MAP/MM//MZv/Mmf/MzP/M//// AP//M///Zv//mf//zP///yH5BAEAABAALAAAAAAaACYAAAj/AP2kGkhtYKqC BA8qTEhQ4L+HECP+o0ZNoECFFB8OlCgxlZ8pH0NaPPhv40NqEFFOWcmyJcuL qTiedOky5BSDE1NqRMGSJ82XMWV+pOlz5dCbOiHaNArSj1OnHv2g7LiUaM8p KIJC5Mn1ateuK7VOLEoTqkeQK7Pq/Iq16cWCFAsilehTpMeDGVGi3Dh1Z9SR ePNONNmx4lOEb/WW1Np38N+KgfOSlHl2JcWhUhXzTVrwMOKCEykSliiaL1zF KB2ejGiQ4D+pkR3LLIkwbl7Bm1eXbpoKZNzQCGcPfDolNUnNjHNO5J35tW3R jSU+tVgRNHLSENHWro56dEe0IrnnbyTcd29LmE4li+UIHibImHvhJ51YFerF 5esj3rS7EH7YnFN15gd9vOG1nGVUVZTTe7Y9xJR8wzmV00c+hfZaS0FF2BsK RzGoEXhICVgcTwWRGNpBZBXnmFQh/cPhFHTZNFRvfnBI4VA8PZUKWzwFBAA7} set map_data {R0lGODlh8ACsAPcAANnViNfJl9fJt9jWl8e4h6Wadba1eaeod8jJl8jVydbK pdjXtdfXp+fXtcbWtde5h8jUmejiifjKlua8lfjVi/jWl/fmp/W9iNnkt8bV p/jLi/fXtMjHifO9lfTpyPjWpvfZ2OTa2MjX1vX39dfY1sfa49fzytrn5sjl 2Obb5PTb5vPq6fTM0/Pr8tzf8MXK5Nny8cvu8Ofp5/b12fX16Ord8LXX1tjb 47bJyMbGucjJyLXWyajVyqnW1bbk45bNysnm5pfV4X3HxbLZ4prl46fM0467 xrLk0srz1fTzy9rz2Nnl2Ma7xZjJk7LQrJKXpMa6lJCwr6qbqK+zr9bM09XK yfPL716noo16jtbWyvbYxunz6ebn2Nrx5saolO+9x8jK0+S5rrG7xsfluJfk zKeZaK60jpOsdLepeOXXyNTOd+jWltfilujKl+jjmOOzdvbntdjK5Nfmy/Tp 2Orr8bXL03rFs3Wtruvz8ufz2MfmyebJx3nGksi3sZTLsqSLYpKVbaiVj6el aqi1eefKtufLpejmt+jWiujWpue7iffMpOflp9arhM2vc/bMtOfJiMfKpOny y/XKyFiPj6bKyejoyaOew5SzjJLCcrnimrDLlMuXaraYZ/fkmNvs8Hi2wvTc 8XSPb3GRkeuvk8mRWMaYiMaqhribdOnwp8jyusnx7HSsj5CRkKFqNsF7VOjR epfmuLPis2yXpqt2SLanasfUierM55CQVq+PU9e7lMnyycjhqPjkira2aNby urLGc6iPObGqVNjjp3OJUunyuKW0Z9vidNfIiKiJdZaoVNqpl1VncliSp1R0 hHWpdJB2TrXAVT9OR3R9kMvKWjZmbH+AP7WKY8mxWeSohvXwm/bwt0+Pdezl deXN1HJ1cOvxmc7z8UlZZ1ZnTN7wqIdzaL+arHJyUPTxqW6lWqd/YUVXVXZb XFiOXKezOIuLNsloObVdNJFvH41sNXBeLnVuNsOSuo1TLoFZGU1hGgAAAAAA AAAAAAAAAAAAAAAAAAAAACwAAAAA8ACsAAAI/wAlIBgoAdAmQF50DJQ0cNwo BAIl6BAoSaAuga8UQkRQcZouSTokgZP0kYwkkOCshBz5gqSVFzrAvRhJE6QV cDpCrrQywiXOH/Vy/tAxVIiloUSO6giigwjRp2R+DJ1qSQjRH0mH4hypi2dM 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 VAICADs=}
slebetman 28 April 2009: This is a VERY BAD implementation of drawing sprites onto a background. Image copying is very very slow (probably done with memcpy). Use the canvas instead. The following is an improved re-implementation in canvas which achives a much higher framerate using far fewer CPU time while managing to be flicker-free without resorting to double buffering:
proc do_frame {} { set sprites {} for {set i 0} {$i < 100} {incr i} { set dest_x [expr {int (rand()*620)}] set dest_y [expr {int (rand()*420)}] set sprite [expr {int (rand()* 2) == 0 ? $::sprite_1:$::sprite_2}] lappend sprites [list $sprite $dest_x $dest_y] } .c delete sprites foreach sprite_info $sprites { foreach {spr dest_x dest_y} $sprite_info {} .c create image $dest_x $dest_y -image $spr -tags sprites } } proc do_update {} { # Get the frame update. do_frame # This controls our frame rate. after 35 {do_update} } # Load the background and the sprite images. set ::sprite_1 [image create photo -data $box_data] set ::sprite_2 [image create photo -data $hitchcock_data] set ::base_image [image create photo -height 640 -width 480 -data $map_data] set ::map_image [image create photo -height 640 -width 480] $::map_image copy $::base_image -zoom 2 3 pack [canvas .c -height 680 -width 500] .c create image 0 0 -image $map_image -anchor nw #Get the first frame full... do_frame # Start up the frame 'animator' after 35 {do_update}
I think a bit of explanation is warranted as to why this implementation manage to smoothly update the canvas without us needing to do anything special (i.e. no double buffering). When you draw anything in Tk (canvas elements or plain widgets) what you draw is not immediately displayed on the screen. Instead Tk waits for the event loop before drawing stuff. This means that Tk is already implicitly double buffered (the stuff on the screen is not modified while drawing takes place).
JSB Very nice example. I did mine with a label to disconnect the process from the canvas widget, just to show some simple double buffer code.
ZB Of course, the example of sort: "how not to do it" is also very valuable; it shows, what one has to avoid. There is even a special cathegory for such examples here: Don't do that.
I was trying to suggest the simplest way out - I meant just using usual "canvas offerings", yes: "itemconfigure" and "move" (still using the same example):
proc do_frame {} { set sprites {} for {set i 0} {$i < 100} {incr i} { set dest_x [expr {int (rand()*620)}] set dest_y [expr {int (rand()*420)}] set sprite [expr {int (rand()* 2) == 0 ? $::sprite_1 : $::sprite_2}] lappend sprites [list $sprite $dest_x $dest_y] } set i -1 set ::shapes [list] foreach sprite_info $sprites { foreach {spr dest_x dest_y} $sprite_info {} incr i .c create image $dest_x $dest_y -image $spr -tags sprite$i lappend ::shapes sprite$i } } proc next_frame {} { foreach sprite $::shapes { set dest_x [expr {int (rand()*620)}] set dest_y [expr {int (rand()*420)}] set spriteImage [expr {int (rand()* 2) == 0 ? $::sprite_1 : $::sprite_2}] .c itemconfigure $sprite -image $spriteImage .c moveto $sprite $dest_x $dest_y } } proc do_update {} { # Get the frame update. next_frame # This controls our frame rate. after 35 {do_update} } # Load the background and the sprite images. set ::sprite_1 [image create photo -data $box_data] set ::sprite_2 [image create photo -data $hitchcock_data] set ::base_image [image create photo -height 640 -width 480 -data $map_data] set ::map_image [image create photo -height 640 -width 480] $::map_image copy $::base_image -zoom 2 3 pack [canvas .c -height 680 -width 500] .c create image 0 0 -image $map_image -anchor nw #Get the first frame full... do_frame # Start up the frame 'animator' after 35 {do_update}
...but, unfortunately, my suggestions to use obvious, "native" canvas commands, lost in confrontation with "double buffering". Nothing like advanced technology! :)
Not sure, which one is faster (didn't make any measurement) - slebetman's or mine - "optically" looks about the same, and both have similar CPU utilization.
slebetman: Where did you get that "moveto" subcommand in your canvas from? Is it a Tk8.6 thing? I did a delete-all-and-redraw because that was what the original code seem to be doing.
ZB Yes, I'm testing 8.6b1. So there's no "moveto" in 8.5.7? I'm a bit surprised - but it's possible.
slebetman: I'm using 8.5.3 and there's no "moveto" subcommand. But for this specific example, I think [.c coords $coords $dest_x $dest_y] is equivalent.
DKF: I can confirm that “moveto” is an 8.6 addition; I can also remember checking that code in. ;-)
Did you know that Tk canvases (along with virtually all other Tk widgets) are double-buffered internally anyway?
ZB As for me: I didn't. Just being aware, that copying graphics data using "pure TCL" won't be particularly fast, I've been voting for using "canvas buffering" (swapping images via "itemconfigure") rather - not realizing, that it's double buffering. :D