Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ - Za wolne działanie konsoli (pętli + cout)

Jatuzpytaniem 27 Paź 2015 16:27 606 4
  • #1 27 Paź 2015 16:27
    Jatuzpytaniem
    Poziom 2  

    Witam.

    Miesiąc temu zacząłem swoją przygodę z programowaniem w C++ (albo raczej zabawę w pykanie w c++). W ramach rozwoju umiejętności itp. zacząłem pisać własną grę (tradycyjny roguelike). Grę umiejscowiłem w konsoli. Za pomocą podwójnej tablicy zdefiniowałem mapę której mniejszy fragment (95x45) po każdym naszym ruchu jest sczytywany z tablicy i "rysowany" w konsoli za pomocą podwójnej pętli for przy użyciu SetConsoleCursorPosition i cout.

    Pętla kolejno wypełnia obszar odpowiednimi znakami ascii w ustalonym kolorze. I tutaj pojawia się mój problem, kod który napisałem działa zbyt wolno. Przy fragmencie mapy większym niż ok. 1600 znaków (40x40) rysowanie nie jest natychmiastowe. Widać jak skrypt dochodzi do ostatnich linij zanim skończy, coś jak brak V sync.

    Pytanie brzmi, czy da się to przyśpieszyć? Jeżeli tak to jakimi metodami.

    Czy może jest to ograniczenie samej konsoli? W takim wypadku musiał bym użyć jakiejś biblioteki "graficznej" o której jeszcze nie mam zielonego pojęcia. I w tym wypadku jaką wybrać, żeby była jak najprostsza. W końcu jedyną funkcją która jest mi potrzebna to przetworzenie tabeli na siatkę (mapę/planszę) znaków ascii na ekranie w czasie możliwie najszybszym.

    Dziękuję.

    0 4
  • Pomocny post
    #3 28 Paź 2015 01:10
    -psiak-
    Poziom 32  

    lekto napisał:
    Zobacz na biblioteczkę ncurses.
    Czy wg ciebie pod windows'ami ncurses używa coś innego niż SetConsoleCursorPosition?

    Zbuduj w pamięci pewien bufor i wyrzuć to na ekran jednym poleceniem WriteConsoleOutput
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #4 30 Paź 2015 01:34
    Jatuzpytaniem
    Poziom 2  

    Wielkie dzięki za podesłanie przykładu, to co wpisywałem w wyszukiwarkę próbując rozwiązać mój problem wżyciu nie skierowało by mnie w stronę "buforu" i podanej przez ciebie komendy. Teraz rysowanie mapy działa idealnie jak wszystko w Korei.

    Sam przykład na chwilę przykuł moją uwagę. Jest świetnie napisany, wszystko jest dobrze ułożone i na swoim miejscu no i jak zobaczyłem kod w dwunastej linijce to szczęka spadła mi na ziemie jak u Johnego Bravo, temu kto pierwszy raz użył sizeof w ten sposób szczerze gratuluje pomysłu :D.

    Trochę mnie to zainteresowało, czemu b jest tworzone jako unsigned bez podania typu? Poza tym chyba nie osiągnie ujemnej wartości więc po co unsigned, nie wystarczyło by po prostu opisanie jej jako int?

    0
  • #5 30 Paź 2015 01:57
    -psiak-
    Poziom 32  

    Użycie sizeof() w ten sposób znane jest od Kernighan&Ritchie - autorów C.

    Też od Kernighan&Ritchie int jest typem domyślnym czyli:
    synonimy: unsigned int, unsigned
    synonimy: signed int, int, signed
    synonimy: signed short int, signed short, short int, short
    synonimy: signed long int, signed long, long int, long

    Jeżeli coś nie może być zerem to podkreślaj to wyborem odpowiedniego typu, mniej problemów później.

    0
  Szukaj w 5mln produktów