Author: shadowmaster
Date: Tue Apr 28 03:33:23 2009
New Revision: 35285
URL: http://svn.gna.org/viewcvs/wesnoth?rev=35285&view=rev
Log:
Implemented simple storyscreen caching for non-LOW_MEM builds, and
switched some code that was using pure memory pointers to using
shared_ptrs for safety and cleanness.
(I was using pointers just to avoid copy-constructor calls on the part
and part_ui objects- now we copy-construct shared_ptrs, which has no
important effects on runtime performance. It was becoming a huge hassle
to keep track of the pure pointers.)
Modified:
trunk/src/storyscreen/controller.cpp
trunk/src/storyscreen/controller.hpp
trunk/src/storyscreen/interface.cpp
Modified: trunk/src/storyscreen/controller.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen/controller.cpp?rev=35285&r1=35284&r2=35285&view=diff
==============================================================================
--- trunk/src/storyscreen/controller.cpp (original)
+++ trunk/src/storyscreen/controller.cpp Tue Apr 28 03:33:23 2009
@@ -57,11 +57,6 @@
build_parts();
}
-controller::~controller()
-{
- clear_parts();
-}
-
void controller::resolve_wml(const vconfig& cfg)
{
for(vconfig::all_children_iterator i = cfg.ordered_begin(); i !=
cfg.ordered_end(); i++)
@@ -71,7 +66,7 @@
const vconfig node = i->second;
if(key == "part" && !node.empty()) {
- part* const story_part = new part(*gamestate_, node);
+ part_pointer_type const story_part(new
part(*gamestate_, node));
// Use scenario name as part title if the WML doesn't
supply a custom one.
if((*story_part).show_title() &&
(*story_part).title().empty()) {
(*story_part).set_title( scenario_name_ );
@@ -126,55 +121,56 @@
}
}
-void controller::clear_parts()
-{
- foreach(part* p, parts_) {
- delete p;
- }
- parts_.clear();
-}
-
-void controller::show_all_parts()
+void controller::show()
{
if(parts_.empty()) {
LOG_NG << "no storyscreen parts to show\n";
+ return;
}
- size_t part_n = 0, parts_c = parts_.size();
- while((part_n = show_part(part_n)) < parts_c)
- ;
-}
-
-size_t controller::show_part(size_t part_num)
-{
- if(part_num >= parts_.size()) {
- ERR_NG << "attempted to display inexistant storyscreen part: "
<< part_num+1 << " (of " << parts_.size() << ")\n";
- return parts_.size();
- }
-
- LOG_NG << "displaying storyscreen part " << part_num+1 << " of " <<
parts_.size() << '\n';
-
- part* const p = parts_[part_num];
- ASSERT_LOG( p != NULL, "Ouch: hit NULL storyscreen part in collection"
);
-
+ gui::button next_button(disp_.video(),_("Next") + std::string(" >"));
+ gui::button skip_button(disp_.video(),_("Skip"));
// TODO:
// gui::button back_button(disp_.video(),std::string("< ")+_("Next"));
- gui::button next_button(disp_.video(),_("Next") + std::string(" >"));
- gui::button skip_button(disp_.video(),_("Skip"));
- part_ui ui(*p, disp_, next_button, skip_button);
- switch(ui.show()) {
- case part_ui::NEXT:
- return part_num+1;
- case part_ui::BACK:
- return(part_num > 0 ? part_num-1 : part_num);
- case part_ui::SKIP:
- return parts_.size();
- default:
- throw quit();
+ // Build renderer cache unless built for a low-memory environment;
+ // caching the scaled backgrounds can take over a decent amount of
memory.
+#ifndef LOW_MEM
+ std::vector< render_pointer_type > uis_;
+ foreach(part_pointer_type p, parts_) {
+ ASSERT_LOG( p != NULL, "Ouch: hit NULL storyscreen part in
collection" );
+ render_pointer_type const rpt(new part_ui(*p, disp_,
next_button, skip_button));
+ uis_.push_back(rpt);
}
+#endif
- return 0;
+ size_t k = 0;
+
+ while(k < parts_.size()) {
+#ifndef LOW_MEM
+ render_reference_type render_interface = *uis_[k];
+#else
+ render_value_type render_interface(parts_[k], disp_,
next_button, skip_button);
+#endif
+
+ LOG_NG << "displaying storyscreen part " << k+1 << " of " <<
parts_.size() << '\n';
+
+ switch(render_interface.show()) {
+ case part_ui::NEXT:
+ ++k;
+ break;
+ case part_ui::BACK:
+ // If we are at the first page we can't go back.
+ if(k > 0) {
+ --k;
+ }
+ break;
+ case part_ui::SKIP:
+ k = parts_.size();
+ default:
+ throw quit();
+ }
+ }
}
} // end namespace storyscreen
Modified: trunk/src/storyscreen/controller.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen/controller.hpp?rev=35285&r1=35284&r2=35285&view=diff
==============================================================================
--- trunk/src/storyscreen/controller.hpp (original)
+++ trunk/src/storyscreen/controller.hpp Tue Apr 28 03:33:23 2009
@@ -24,6 +24,8 @@
#include "variable.hpp"
#include "video.hpp"
+#include <boost/shared_ptr.hpp>
+
class display;
class game_state;
// class vconfig;
@@ -31,25 +33,25 @@
namespace storyscreen {
class part;
+class part_ui;
class floating_image;
class controller
{
public:
controller(display& disp, const vconfig& data, const std::string&
scenario_name);
- ~controller();
/**
* Display all story screen parts in a first..last sequence.
*/
- void show_all_parts();
- /**
- * Display a single story screen part.
- * @return Next part requested by the user interface.
- */
- size_t show_part(size_t part_num);
+ void show();
private:
+ typedef boost::shared_ptr< part > part_pointer_type;
+ typedef boost::shared_ptr< part_ui > render_pointer_type;
+ typedef part_ui render_value_type;
+ typedef part_ui& render_reference_type;
+
// Executes WML flow instructions and inserts parts.
void resolve_wml(const vconfig& cfg);
// Used by ctor.
@@ -67,7 +69,7 @@
std::string scenario_name_;
// The part cache.
- std::vector<part*> parts_;
+ std::vector< part_pointer_type > parts_;
// The state of the world.
game_state* gamestate_;
Modified: trunk/src/storyscreen/interface.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen/interface.cpp?rev=35285&r1=35284&r2=35285&view=diff
==============================================================================
--- trunk/src/storyscreen/interface.cpp (original)
+++ trunk/src/storyscreen/interface.cpp Tue Apr 28 03:33:23 2009
@@ -55,7 +55,7 @@
storyscreen::controller ctl(disp, story_cfg, scenario_name);
try {
- ctl.show_all_parts();
+ ctl.show();
} catch(storyscreen::controller::quit const&) {
LOG_NG << "leaving storyscreen for titlescreen...\n";
STUB();
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits