From: Mikko Rasa Date: Sun, 26 Aug 2012 12:03:21 +0000 (+0300) Subject: Improve performance of Bufferable::update_buffer_data X-Git-Url: http://git.tdb.fi/?a=commitdiff_plain;h=719578516a4d44a6f39eac3b074ce9f6180b5d53;p=libs%2Fgl.git Improve performance of Bufferable::update_buffer_data ... by avoiding the walk through the entire chain every time it is called. It's not necessary to add up all the sizes either, since we can just get the end of the last Bufferable. --- diff --git a/source/bufferable.cpp b/source/bufferable.cpp index 4660e9c3..12e0aef7 100644 --- a/source/bufferable.cpp +++ b/source/bufferable.cpp @@ -74,19 +74,22 @@ void Bufferable::update_buffer_offset() void Bufferable::update_buffer_data() const { - const Bufferable *first = this; - for(; first->prev_in_buffer; first=first->prev_in_buffer) ; - - unsigned total_size = 0; - for(const Bufferable *b=first; b; b=b->next_in_buffer) - total_size += b->get_data_size(); - - if(total_size!=buffer->get_size()) + if(buffer_offset+get_data_size()>=buffer->get_size()) { - buffer->data(total_size, 0); - // Resizing the buffer invalidates its contents. - for(const Bufferable *b=first; b; b=b->next_in_buffer) - b->dirty = true; + const Bufferable *last = this; + for(; last->next_in_buffer; last=last->next_in_buffer) ; + + unsigned total_size = last->buffer_offset+last->get_data_size(); + + if(total_size>buffer->get_size()) + { + buffer->data(total_size, 0); + /* Resizing the buffer invalidates its contents. Non-dirty data may + be in use, so reupload it. */ + for(const Bufferable *b=last; b; b=b->prev_in_buffer) + if(!b->dirty) + b->upload_data(); + } } upload_data();