From 719578516a4d44a6f39eac3b074ce9f6180b5d53 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 26 Aug 2012 15:03:21 +0300 Subject: [PATCH] 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. --- source/bufferable.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) 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(); -- 2.45.2