c# - How to detect when a WPF control has been redrawn? -
i using d3dimage display sequence of frames rendered unto same direct3d surface 1 after other. current logic thus:
- display last rendered frame (i.e.d3dimage.lock()/adddirtyrect()/unlock())
- start rendering next frame
- wait next frame ready , it's time display it
- display last rendered frame
- ...
the problem approach when done calling unlock() on d3dimage, image isn't copied, it's scheduled copied on next wpf render. it's therefore possible render new frame on direct3d surface before wpf has had chance display it. net result see missed frames on display.
right i'm experimenting using separate direct3d texture rendering , performing copy "display texture" before display, giving better results incurs substantial overhead. preferrable able know when d3dimage done refreshing , start rendering next frame after. possible, if how? or have better idea altogether?
thanks.
the compositiontarget.rendering event called when wpf going render, that's when should lock() , unlock(). after unlock(), can kick off next render.
you should check renderingtime because event may fire multiple times per frame. try this:
private void handlewpfcompositiontargetrendering(object sender, eventargs e) { renderingeventargs rea = e renderingeventargs; // it's possible rendering call twice in same frame // render when haven't rendered in frame. if (this.lastrendertime == rea.renderingtime) return; if (this.renderisfinished) { // lock(); // setbackbuffer(...); // adddirtyrect(...); // unlock(); this.renderisfinished = false; // fire event start new render // event needs set this.renderisfinished = true when render done // remember last render time this.lastrendertime = rea.renderingtime; } } update address comments
are sure there's race condition? this page says buffer gets copied when call unlock().
and if there race condition, how putting lock/unlock around render code? this page says lock() block until copy finished.
Comments
Post a Comment