Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.0] Problem z obsługą dużej ilości Sprite'ów

Ostatnio zmodyfikowano 2013-10-27 18:42
Autor Wiadomość
Wicon
Temat założony przez niniejszego użytkownika
[SFML 2.0] Problem z obsługą dużej ilości Sprite'ów
» 2013-10-27 15:35:41
Witam. Mój problem jest chyba dość nietypowy. Tworzę rozbudowaną grę akcji RPG za pomocą bibliotek SMFL 2.0. Pracuję nad grą już kilka miesięcy i teraz pojawił się problem. Nie wiem w czym on tkwi, mam nadzieję, że pomożecie.

Otóż, kod jest już bardzo złożony i rozbudowany, moje okienko renderuje ogromną ilość różnych elementów (Sprite). Dziś chciałem dokończyć okienko z umiejętnościami postaci i pojawił się niespodziewany błąd. Podejrzewam iż wynika on z tego, że wywołałem zbyt dużo zmiennych typu Sprite, ale wydaje mi się to dziwne. Wczoraj gdy kończyłem pracę program kompilował się normalnie, dzisiaj dodałem kilka kolejnych zmiennych typu Sprite:
C/C++
Sprite Skill_Bsm_1; Sprite Skill_Bsm_1_Train;
Sprite Skill_Bsm_2; Sprite Skill_Bsm_2_Train;
Sprite Skill_Bsm_3; Sprite Skill_Bsm_3_Train;
Sprite Skill_Bsm_4; Sprite Skill_Bsm_4_Train;
Sprite Skill_Bsm_5; Sprite Skill_Bsm_5_Train;
Sprite Skill_Bsm_6; Sprite Skill_Bsm_6_Train;
Sprite Skill_Bsm_7; Sprite Skill_Bsm_7_Train;
Sprite Skill_Bsm_8; Sprite Skill_Bsm_8_Train;
Sprite Skill_Bsm_9; Sprite Skill_Bsm_9_Train;
Sprite Skill_Bsm_10; Sprite Skill_Bsm_10_Train;
Sprite Skill_Bsm_11; Sprite Skill_Bsm_11_Train;
Sprite Skill_Bsm_12; Sprite Skill_Bsm_12_Train;
Sprite Skill_Bsm_13; Sprite Skill_Bsm_13_Train;
Sprite Skill_Bsm_14; Sprite Skill_Bsm_14_Train;
Sprite Skill_Bsm_15; Sprite Skill_Bsm_15_Train;
Sprite Skill_Bsm_16; Sprite Skill_Bsm_16_Train;
Sprite Skill_Bsm_17; Sprite Skill_Bsm_17_Train;
Po dodaniu kolejnej dawki Sprite'ów (tutaj 34) program nie chce się już kompilować. Wyskakuje taki błąd:
"Unhandled exception at 0x77b4defe in MyGame.exe: 0xC00000FD: Stack overflow."
Po naciśnięci przycisku break otwiera się w Visualu nowe okienko z następującą treścią:
"No Source Available
No symbols are loaded for any call stack frame. The source code cannot be displayed"

Kiedyś już coś takiego widziałem na oczy bawiąc się i tworząc tablice Spritów o dużych rozmiarach, ale się tym nie przejąłem. Co z tym zrobić? Z góry dziękuje za pomoc.

EDIT:
Aha i jeszcze log kompilacji:
First-chance exception at 0x77baa793 in MyGame.exe: 0xC0000005: Access violation writing location 0x00080ffc.
Unhandled exception at 0x77baa793 in MyGame.exe: 0xC0000005: Access violation writing location 0x00080ffc.
P-94672
killjoy
» 2013-10-27 15:40:57
Wychodzisz gdzieś poza tablice, albo używasz pustego wskaźnika, dlatego program się wysypuje. Co do okienka przy debugowaniu, kompilujesz program w trybie release, zmień na debug i wtedy debuger powinien Ci pokazać co mu nie pasuje.
P-94673
Wicon
Temat założony przez niniejszego użytkownika
» 2013-10-27 15:44:54
Nie. Nie wychodzę po za tablicę. Program wysypuje się dopiero po dodaniu tych kolejnych 34 sprit'ow. Gdy je usunę wtedy kompiluje się normalnie. Wydawało mi się, że cały czas kompiluje w trybie debug. Po zmianie odesłało mnie do linijki w której tworzę okno aplikacji:
RenderWindow oknoAplikacji( sf::VideoMode( 800, 600, 32 ), L"Tutył gry" );

EDIT:

Oczywiście w międzyczasie próbuję sam coś zdziałać i chyba coś zdziałałem.
Jeśli zamiast tworzyć te Sprite: 1,2,3,4 itd. stworzę sobie vector i wepcham do niego te swoje 34 Sprity to program śmiga. To by oznaczało, że do końca prac nad tą grą musiał bym korzystać zawsze z vectorów. W niektórych przypadkach może to być uciążliwe ale jakoś sobie będę radził.

Póki co stworzyłem kilkanaście wektorów typu Sprite, do jednego wepchałem kilkaset spritów i jest git.

Boje się tylko o jedno. Jak to będzie się miało na dłuższą metę, czy nie wysypie się prędzej czy później tak jak teraz.

Jeśli ktoś ma inne rozwiązania tego problemu to proszę pisać. Z chęcią odczytam.

EDIT 2:

Niestety. Nadal jest problem. Próbowałem różnych, nawet niedorzecznych jak dla mnie sposobów. O dziwo niekiedy się sprawdzało. Program się nie kompiluje, zmieniam nazwę 1 zmiennej typu Sprite i już się kompiluje. Potem dodaje 1 Sprite, już się nie kompiluje. Później dodałem tablice zmiennych w osobnym pliku i podpiąłem go do głównego kodu, nie działo. Więc zamiast tablicy zrobiłem sobie 17 osobnych Spritów i teraz działa. Ciągle wyskakuje błąd, w którym pisze, że nie można obsłużyć wyjątku w MyGame, bo stos jest przepełniony. Tak jak napisałem w pierwszym poście. Nie rozumiem tego. Bardzo proszę, aby ktoś wytłumaczył o co chodzi z tym przepełnieniem stosu. (Czyżbym nie mógł dodać więcej zmiennych tego typu do programu?)

Stworzyłem sobie nowy projekt, zeby pokombinować i napisałem coś takiego:
C/C++
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    bool prawdaczynie[ 6000 ];
    return 0;
};
I trochę się dziwie. Gdy tworzę tablice o rozmiarze 6000 kompiluje się bez przeszkód. Potem tworzę tablice o rozmiarze 100000000 i wysypuje się. Również pokazuje, że stos jest przepełniony. Ale to nic, bo po nieudanej próbie wpisuje z powrotem 6000 i pomimo iż na początku dla takiej ilości błąd się nie pojawił, to przy tej próbie już się pojawił. Nie pojmuję tego, a chciałbym.
P-94674
Wicon
Temat założony przez niniejszego użytkownika
» 2013-10-27 18:42:40
Problem rozwiązany. Napiszę co i jak z tym stosem dla innych, którzy też będą mieć ten problem.
PS: Wystarczyło zapytać wujka google.

Z przepełnieniem stosu mamy do czynienia wtedy, gdy jedna funkcja będzie przechowywać zbyt dużo danych tego samego typu lokalnie. Oznacza to, że nie możemy w jednej funkcji wywołać kilka tysięcy Sprit'ów, tak jak próbowałem to zrobić.
Rozwiązanie? Najprostszym jest zapewne utworzyć zmienne globalne. Możemy oczywiście część zmiennych utworzyć w osobnych funkcjach. Jak, no z funkcji to ja już uczył nie będę są kursy. Sam głupio zacząłem robić, bo wszystko waliłem ciągle do funkcji main no i się w końcu brzydko mówiąc zes**ło. Do końca pisania gry mam jeszcze spory kawał drogi i pewnie nie raz będę się jeszcze z tym problemem męczył, ale przynajmniej wiem już o co chodzi. Nie popełnijcie tego samego błędu, używajcie funkcji.
Pozdrawiam!
P-94686
« 1 »
  Strona 1 z 1