Optimize controller_frame_vector::compatible()
This commit is contained in:
parent
31ff9a4b8f
commit
dffe0de67e
1 changed files with 20 additions and 2 deletions
|
@ -660,11 +660,29 @@ bool controller_frame_vector::compatible(controller_frame_vector& with, uint64_t
|
||||||
//sync done.
|
//sync done.
|
||||||
uint64_t syncs_seen = 0;
|
uint64_t syncs_seen = 0;
|
||||||
uint64_t frames_read = 0;
|
uint64_t frames_read = 0;
|
||||||
|
size_t old_size = size();
|
||||||
|
size_t new_size = with.size();
|
||||||
|
size_t pagenum = 0;
|
||||||
|
size_t ocomplete_pages = old_size / frames_per_page; //Round DOWN
|
||||||
|
size_t ncomplete_pages = new_size / frames_per_page; //Round DOWN
|
||||||
|
size_t complete_pages = min(ocomplete_pages, ncomplete_pages);
|
||||||
|
while(syncs_seen + frames_per_page < frame - 1 && pagenum < complete_pages) {
|
||||||
|
//Fast process page. The above condition guarantees that these pages are completely used.
|
||||||
|
auto opagedata = pages[pagenum].content;
|
||||||
|
auto npagedata = with.pages[pagenum].content;
|
||||||
|
size_t pagedataamt = frames_per_page * frame_size;
|
||||||
|
if(memcmp(opagedata, npagedata, pagedataamt))
|
||||||
|
return false;
|
||||||
|
frames_read += frames_per_page;
|
||||||
|
pagenum++;
|
||||||
|
for(size_t i = 0; i < pagedataamt; i += frame_size)
|
||||||
|
if(opagedata[i] & 1) syncs_seen++;
|
||||||
|
}
|
||||||
while(syncs_seen < frame - 1) {
|
while(syncs_seen < frame - 1) {
|
||||||
controller_frame oldc = blank_frame(true), newc = with.blank_frame(true);
|
controller_frame oldc = blank_frame(true), newc = with.blank_frame(true);
|
||||||
if(frames_read < size())
|
if(frames_read < old_size)
|
||||||
oldc = (*this)[frames_read];
|
oldc = (*this)[frames_read];
|
||||||
if(frames_read < with.size())
|
if(frames_read < new_size)
|
||||||
newc = with[frames_read];
|
newc = with[frames_read];
|
||||||
if(oldc != newc)
|
if(oldc != newc)
|
||||||
return false; //Mismatch.
|
return false; //Mismatch.
|
||||||
|
|
Loading…
Add table
Reference in a new issue