vendredi 24 avril 2015

Test - The Talos Principle - Aussi loin que j'ai pu

Après 3 mondes complets et 20 étoiles, je jette l'éponge: les 10 dernières étoiles, j'irai chercher sur Internet comment les trouver.

J'avais déjà raconté ici à quel point j'étais impressionné par The Talos Principle après avoir joué à la démo. Je me le suis donc offert, et il est tout à fait à la hauteur de mes attentes. Il est difficile de ne pas le comparer à Portal puisqu'il s'agit d'un jeu de réflexion en 3d à la première personne où il s'agit de résoudre une série de problèmes situés dans des zones bien délimitées en utilisant divers objets tels des cubes pour appuyer sur des boutons ou pour accéder à des éléments en hauteur, des ventilateurs pour s'élever, des redirigeurs de lasers pour actionner des capteurs, ou encore une sorte d'enregistreur qui permet d'interagir avec son soi du passé.

Le principe est de récupérer dans chaque zone un sigil, c'est à dire un tetromino, qui, assemblés, permettent d'ouvrir de nouvelles zones. Il y a également 30 étoiles plus ou moins cachées, qui donneront parfois beaucoup de fil à retordre. L'idée des étoiles est excellente: autant récupérer un tetromino requiert d'assembler correctement les éléments disponibles, autant récupérer les étoiles demande à réfléchir un peu à l'envers: il s'agit souvent de subvertir le système, en assemblant les éléments de plusieurs zones, à distance, ou encore en s'arrangeant pour faire s'échapper des éléments de certaines zones autrement que par la porte, qui les bloque. Il y a donc vraiment deux familles de problèmes, et passer de l'un à l'autre est agréable.

L'autre bonne idée est que de nombreuses zones sont disponibles dès le début, il est ainsi possible de laisser un problème de côté temporairement et d'aller en résoudre d'autres.

Dans chaque monde, des terminaux, des enregistrements audio et autres informations permettent de comprendre petit à petit ce qu'est ce monde et ce que l'on y fait. Les thèmes abordés, la conscience, le libre arbitre, l'humanité, sont intéressants et s'intègrent complètement au jeu.

Au niveau des défauts, de nombreux joueurs se plaignent des trop nombreux puzzles de tétrominos à résoudre. Sans qu'ils apportent grand chose, cela ne m'a pas gêné outre mesure. J'ai trouvé la chasse aux étoiles un peu frustrante, étonnamment ce sont les étoiles du niveau 3, là où les problèmes sont les plus compliqués, où les étoiles sont finalement les plus faciles à obtenir: j'ai réussi à acquérir les 10 étoiles, alors qu'un coup d'oeil aux soluces m'ac confirmé que je n'aurais sans doute jamais trouvé mes étoiles manquantes du niveau 1 et 2.

The Talos Principle est également le premier jeu AAA auquel j'ai joué exclusivement sous Linux. Manifestement, les drivers libres ATI ne sont pas totalement à la hauteur, et j'ai donc souffert de bugs graphiques, qui dans mon cas n'ont pas été particulièrement gênants. Apparemment, les drivers propriétaires seraient pleinement supportés (mais il y a bien longtemps qu'AMD ne fournit plus les drivers proprios pour mon matériel, vive le libre!).

samedi 11 avril 2015

Boost - Temps de compilation par en-tête

La bibliothèque boost est LA bibliothèque du C++ (après la bibliothèque standard, bien entendu!), bourrée d'utilitaires utiles pour fournir une base solide à son développement. Utilisée dans nombre de projets C++, un reproche fréquent est que la bestiole prend de l'embonpoint, et que ses en-têtes à ralonge plombent rapidement les temps de compilation d'un projet.

J'ai donc écrit un petit script bash qui me compile chaque en-tête l'une après l'autre et me renvoie le temps qu'il a fallu pour compiler. J'utilise g++ 4.9.2, en mode C++11 et avec l'option d'optimisation -O3. Me voilà avec la liste complète des en-têtes les plus couteuses parmi celles disponibles directement sous le répertoire "boost" et "boost/algorithm". Pas vraiment de surprises, mais la confirmation qu'il faut faire un peu attention à ses inclusions.

5.41boost/geometry.hpp
4.73boost/phoenix.hpp
3.86boost/wave.hpp
3.77boost/thread.hpp
3.24boost/random.hpp
2.92boost/signals2.hpp
2.68boost/algorithm/string_regex.hpp
2.65boost/date_time.hpp
2.57boost/program_options.hpp
2.24boost/bimap.hpp
2.21boost/flyweight.hpp
2.18boost/algorithm/string.hpp
2.15boost/algorithm/hex.hpp
2.05boost/exception_ptr.hpp
1.99boost/local_function.hpp
1.86boost/lexical_cast.hpp
1.85boost/asio.hpp
1.81boost/multi_array.hpp
1.71boost/locale.hpp
1.68boost/multi_index_container.hpp
1.68boost/assign.hpp
1.61boost/variant.hpp
1.59boost/regex.hpp
1.50boost/unordered_map.hpp
1.48boost/chrono.hpp
1.46boost/circular_buffer.hpp
1.45boost/unordered_set.hpp
1.45boost/scope_exit.hpp
1.45boost/function.hpp
1.45boost/filesystem.hpp
1.41boost/format.hpp
1.39boost/range.hpp
1.26boost/make_shared.hpp
1.24boost/optional.hpp
1.22boost/smart_ptr.hpp
1.16boost/shared_container_iterator.hpp
1.10boost/tokenizer.hpp
1.08boost/token_iterator.hpp
1.08boost/algorithm/gather.hpp
1.02boost/dynamic_bitset.hpp
1.01boost/weak_ptr.hpp
1.00boost/shared_ptr.hpp
1.00boost/enable_shared_from_this.hpp
0.99boost/shared_array.hpp
0.88boost/array.hpp
0.84boost/compressed_pair.hpp
0.82boost/any.hpp
0.80boost/algorithm/minmax.hpp
0.79boost/swap.hpp
0.68boost/type_traits.hpp
0.60boost/parameter.hpp
0.58boost/multi_index_container_fwd.hpp
0.58boost/concept_check.hpp
0.45boost/cast.hpp
0.43boost/foreach.hpp
0.41boost/iterator_adaptors.hpp
0.41boost/generator_iterator.hpp
0.38boost/ratio.hpp
0.35boost/scoped_ptr.hpp
0.35boost/rational.hpp
0.35boost/concept_archetype.hpp
0.35boost/algorithm/clamp.hpp
0.33boost/bind.hpp
0.32boost/progress.hpp
0.32boost/intrusive_ptr.hpp
0.31boost/circular_buffer_fwd.hpp
0.29boost/aligned_storage.hpp
0.28boost/utility.hpp
0.28boost/pointee.hpp
0.28boost/mem_fn.hpp
0.28boost/indirect_reference.hpp
0.27boost/operators.hpp
0.27boost/functional.hpp
0.26boost/strong_typedef.hpp
0.26boost/scoped_array.hpp
0.26boost/get_pointer.hpp
0.25boost/iterator.hpp
0.25boost/dynamic_bitset_fwd.hpp
0.24boost/next_prior.hpp
0.24boost/function_output_iterator.hpp
0.24boost/assert.hpp
0.22boost/cregex.hpp
0.15boost/nondet_random.hpp
0.10boost/blank.hpp
0.08boost/crc.hpp
0.08boost/call_traits.hpp
0.08boost/atomic.hpp
0.07boost/integer_traits.hpp
0.07boost/integer.hpp
0.06boost/timer.hpp
0.06boost/regex_fwd.hpp
0.06boost/limits.hpp
0.06boost/integer_fwd.hpp
0.06boost/implicit_cast.hpp
0.05boost/throw_exception.hpp
0.05boost/ref.hpp
0.05boost/last_value.hpp
0.04boost/visit_each.hpp
0.04boost/static_assert.hpp
0.04boost/preprocessor.hpp
0.04boost/noncopyable.hpp
0.04boost/math_fwd.hpp
0.04boost/cstdint.hpp
0.04boost/config.hpp
0.02boost/io_fwd.hpp
0.02boost/cstdlib.hpp
0.02boost/algorithm/minmax_element.hpp
0.01boost/version.hpp
0.01boost/type.hpp
0.01boost/pointer_cast.hpp
0.01boost/non_type.hpp
0.01boost/none_t.hpp
0.01boost/none.hpp
0.01boost/memory_order.hpp
0.01boost/is_placeholder.hpp
0.01boost/current_function.hpp
0.01boost/checked_delete.hpp
0.01boost/cerrno.hpp
0.01boost/blank_fwd.hpp
0.00boost/pointer_to_other.hpp
0.00boost/function_equal.hpp
0.00boost/foreach_fwd.hpp