I’ve given both requestImage() and thread() a go - requestImage() seems to be working well for me, but I’m having a bit of confusion over why thread() is drastically slowing down my framerate (when being used to process an offscreen pGraphics)
I made a little test script, where I’m using a thread which is triggered by a mouse click. The thread updates a global pGraphics object by applying a pretty heavy blur, with a new blur value for each click.
The part that is confusing to me is that even though I’m doing this heavy lifting on a separate thread, it still crashes my framerate on each new blur.
I think my code should run with a copy and paste, if anyone is down to give it a go - I’m using the site lorempixel to get a placeholder 1000px by 1000px image, rather than local image files
pg = None
imgtest = requestImage('http://lorempixel.com/1000/1000',"jpg")
img_loaded = False
click_thread_running = False
frameRates = []
def setup():
    size(1000,1000,P2D)
    background(255,255,255)
    fill(0)
    textSize(18)
    textAlign(CENTER)
def draw():
    global img_loaded
    
    # First check that initial thread requestImage has loaded
    if img_loaded != True:
        if imgtest.width > 0:
            img_loaded = True
            thread('click_thread')
        pass
    else:
        background(255,255,255)
        if pg and not click_thread_running:
            pushMatrix()
            translate(mouseX - pg.pixelWidth/2, mouseY - pg.pixelHeight/2)
            image(pg,0,0)
            popMatrix()
        else:
            draw_loader()
        update_framerate_monitor()
def mousePressed():
    if not click_thread_running:
        thread('click_thread')
# this does some hefty blur processing on a large pGraphics in a separate thread
# ... but causes the framerate to go down?
def click_thread():
    global pg
    global click_thread_running
    
    click_thread_running = True
    if !pg:
        pg = createGraphics(1500,1500)
        pg.smooth(8)
    pg.beginDraw()
    pg.background(100,200,37)
    pg.image(imgtest,40,40)
    new_blur_val = int(25+random(15))
    pg.filter(BLUR, new_blur_val)
    fill(0)
    pg.text("Blur Value: {}\nClick to apply a new blur to this global pg via a thread".format(new_blur_val), 750,780)
    pg.endDraw()
    click_thread_running = False
# Just to monitor framerate
def update_framerate_monitor():
    global frameRates
    if frameCount % 10 == 0:
        frameRates.append(int(frameRate))
        if len(frameRates) > 60:
            frameRates.pop(0)
    pushMatrix()
    translate(80,10)
    fill(255)
    rect(0,0,80,80)
    translate(10,10)
    noFill()
    beginShape()
    for i,rate in enumerate(frameRates):
        vertex(i+1,60-rate)
    endShape()
    popMatrix()
    fill(0)
    text(frameRate,30,30)
def draw_loader():
    pushMatrix()
    translate(width/2,height/2)
    fill(255)
    stroke(0)
    pushMatrix()
    translate(100.0*cos(frameCount/10.),100.0*sin(frameCount/10.))
    rect(0,0,5,5)
    popMatrix()
    fill(0)
    text('Large image blur processing on a thread...',0,0)
    popMatrix()