Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - Lerhes

Strony: [1]
1
C++ / Tajemnicze zachowanie new
« dnia: Wrzesień 28, 2016, 00:32:51 »
Cześć,

Trafiłem na "trochę dziwne" zachowanie operatora new i bardzo proszę o wyjaśnienie poniższych obserwacji. Sprawdziłem w standardzie języka C++, że pamięć zaalokowana operatorem new nie jest zerowana (no chyba że użyjemy nawiasów). Czyli:
int * tab1 = new[100]; //Nie mamy zerowania
int* tab2 = new[100](); //Mamy zerowanie
Nic w tym dziwnego. Zróbmy mały eksperyment:
http://ideone.com/fblet5
Wynik nie jest specjalnie zaskakujący - zaalokowałem 200 intów. Ustawiłem w tym obszarze same -1 i potem zwolniłem pamięć. Ponowna alokacja takiej samej tablicy dała mi ten sam adres (tutaj może być czasami inny adres, ale akurat to nieistotne) i mam te same wartości (-1) co też nie jest jakieś dziwne (bo niby kiedy miała się zmienić). Kompilator dołączony do Visual Studio daje troszkę inne wyniki, ale generalnie jest podobnie.

Ok, teraz meritum sprawy, podciągnijmy znacznie rozmiar alokowanej tablicy, z 200 elementów do 2000000.
http://ideone.com/W3mLvH
I teraz psikus którego nie rozumiem. Dlaczego przy alokacji dużego obszaru pamięci, ten obszar jest zerowany?
Jeszcze raz wyjaśnię o co mi chodzi. Najpierw alokuję duży obszar pamięci i ustawiam w nim -1. Potem usuwam ten obszar i alokuję ponownie równie duży. Dostaję ten sam adres. Ale dlaczego "gratis" zostały w nim ustawione zera?
Taki sam wynik jest z Visual Studio.

Wiem że nie mogę polegać na takim zachowaniu kompilatora, bo jest niezgodne ze standardem. Natomiast ciekawi mnie, dlaczego duży obszar zaalokowanej pamięci jest zerowany, a mały nie. Wydaje mi się, że przecież takie zerowanie dużego obszaru tylko spowolni program (a wydajność jest przecież najważniejsza w C++ :) ).

Update: W sumie to można pytanie "uprościć" do pytania o malloc - bo przecież new woła malloc (plus trochę magii). Stosowanie samego malloc daje te same wyniki.

Pozdrawiam,
Lerhes

2
Projektowanie kodu / Brak pamięci statycznie alokowanej
« dnia: Listopad 02, 2015, 00:48:58 »
Cześć,

Pytanie nie jest związane z programowaniem gier - za co przepraszam - ale odpowiedź może być przydatna dla ludzi tworzących gry na urządzenia mobilne.

Wyobraźmy sobie sprzęt dedykowany pod kontrolą systemu operacyjnego czasu rzeczywistego. Mamy na nim dostępne około 200 mb wolnej pamięci (jak sądzę RAM). W systemie tym zastosowane są dwa typowe podejścia (typowe o ile mi wiadomo):
1. Większość potrzebnej pamięci (struktury danych, tablice itp) są statycznie zaalokowane jako zmienne globalne (lub są po prostu zmiennymi globalnymi).
2. Jest możliwa dynamiczna alokacja - ale żeby ją przyspieszyć, zaimplementowany został moduł który alokuje większe fragmenty pamięci i "rozdziela" ją według potrzeb (alokacja z puli).

Wyobraźmy sobie teraz, że dostajemy do zaimplementowania pewną nową funkcjonalność. Akurat tak się składa, że wymaga ona głównie dublowania potrzebnej pamięci statycznej (jeżeli mamy tablicę stu elementową pewnych struktur danych, zmieniamy ją na tablicę dwustu elementową). Wszystko idzie spoko, do czasu, gdy okazuje się, że ta pamięć się nam skończyła (za dużo pamięci statycznej nam jest potrzebne).

Czy macie może jakieś podpowiedzi / uwagi jak sobie z tym problemem poradzić?

Oczywiście - dokupienie większej ilości pamięci nie wchodzi w grę - to system dedykowany o ustalonej architekturze i parametrach - nie można ich zmienić.
O co chodzi mi konkretnie:
1. Czy jest coś ważnego jeżeli chodzi o pamięć statycznie alokowaną (lub po po prostu pamięć gdzie umieszczane są globalne zmienne) o czym powinienem wiedzieć? Np: Czy może ulegać fragmentacji, przez co tracę dużo pamięci? (np: zmieniając ułożenie globalnych obiektów albo kolejność kompilacji coś mogę zyskać?)
2. Jeżeli odpowiedź na powyższe pytanie brzmi "to zależy" to proszę o przykład typowych rozwiązań.
3. Zdaję sobie sprawę, że ułożenie parametrów w strukturach ma znaczenie ponieważ występuje wyrównywanie parametrów (tak zwany padding) - co zresztą można kontrolować poleceniami do kompilatora - ale generalnie to chyba za mała "strata" żeby tutaj jakoś bardzo walczyć.

Wiem, że na pytanie dość trudno odpowiedzieć nie znając szczegółów, ale może ktoś mnie naprowadzi na jakiś ciekawy trop (skuteczne rozwiązanie) - bardzo chętnie przyjmę też linki z informacjami które mogą mi pomóc.

Pozdrawiam,
Lerhes

3
Projektowanie kodu / Mock funkcji w tym samym pliku
« dnia: Czerwiec 27, 2015, 19:01:06 »
Uwaga: Pytanie ma niewiele wspólnego z samymi grami, aczkolwiek odpowiedź na nie może się przydać i w tej branży.

Krótki wstęp: Życie programisty C/C++ jest trudne :). Nie mam na myśli problemów ze znalezieniem pracy ale jej rodzaj. Bardzo często wiąże się ona z pracą z tak zwanym Legacy Code - miliony linii kodu bez jednego testu. Korzysta z tego kodu tysiące klientów - więc wiadomo nie można go "zepsuć". Kod ten tworzyło setki programistów, każdy miał inne doświadczenie i nawyki. Brak struktury projektu, jednolitego formatowania - jeden problem jest rozwiązywany na wiele sposobów, każdy z nich inny.
Trudno mi powiedzieć, czy to tylko moje doświadczenia, czy prawie każdy mógłby się pod tym podpisać.

Skupmy się jednak na problemie: Niejaki Michael Feathers napisał książkę (Working Effectively with Legacy Code) która próbuje jakoś odpowiedzieć na pytanie: Co z tym Legacy Code? Zaznajomiłem się z nią i staram się stosować przedstawione w niej metody pracy z kodem. Wszystko trzeba jednak osadzić w realiach zarządzania firmą - mój przełożony zgodził się, żebym sobie pracował z kodem tak jak lubię - ale żeby zmiany w plikach źródłowych kodu produkcyjnego były możliwie najmniejsze (najlepiej nic nie zmieniać jeśli nie trzeba). To jest ważne ograniczenie z mojej perspektywy.

Testowanie idzie nawet sprawnie. Dodawanie nowych funkcjonalności wspierane przez testy jest naprawdę produktywne i skutecznie. Większość moich zmian robi to co powinno praktycznie za pierwszym razem i bardzo rzadko przy tych modyfikacjach uszkodzeniu ulegają inne części systemu. Fajnie. Natomiast mam problem z wprowadzaniem testów do kodu który jest bardzo mocno napisany w C (są i takie fragmenty systemu).

Konkretnie z czym mam problem: Jak testować/refaktoryzować kod w C. Jest nawet książka która adresuje ten problem: "Test Driven Development for Embedded C" - przeglądnąłem ją tylko, ale jakoś nie znalazłem w niej rozwiązania mojego problemu. Oto jak wygląda przykładowy kod który zmieniam:

Plik: funkcjonalnoc.h
void funkcjaKtoraRobiCosWaznego(int a, strukturaJakas b);
Plik: funkcjonalnosc.cpp

static int global_1;
static int blobal_2;

<tutaj 100 innych globali>

void funkcjaKtoraRobiCosWaznego(int a, strukturaJakas b)
{
int zmiennaLokalna = 14;
<1000 linii kodu>
global_1 = 12;

if ( funkcjaLokalnaDlaTegoPliku(zmiennaLokalna ) )
{
//Tutaj dużo kodu
}

<2000 linii kodu>

funkcjaWInnymPliku(zmiennaLokalna);

}


static void funkcjaLokalnaDlaTegoPliku(zmiennaLokalna )
{
<tutaj znowu 1000 linii kodu>
}


Ok, tak wygląda mniej więcej kod. Teraz muszę zmienić implementację w funkcjaKtoraRobiCosWaznego. Zanim się tym zajmę, muszę trochę zrefaktoryzować tę funkcję - najpierw ją przetestować, żeby być pewnym że nic nie psuję, a potem zrefaktoryzować.

Nic prostszego:

Plik: Test.cpp
#include "potrzebnyNaglowek.h"

//Miejsce X

#include "funkcjonalnosc.cpp"

void funkcjaWInnymPliku(int zmiennaLokalna)
{
Expect(zmiennaLokalna, 150);
}

Test1()
{
strukturaJakas tmp;
tmp.pole = 15;
funkcjaKtoraRobiCosWaznego(100, tmp);
Expect(blobal_2, 12);
}

To tylko zarys - tak naprawdę to korzystam z google mock, ale to nie ma dużego znaczenia. Zwracam uwagę, że robię include na pliku cpp, dzięki temu mam dostęp do zmienny statycznych globalnych, a dodatkowo mogę robić sprytne definy jeżeli ich potrzebuję. Testowanie funkcjaKtoraRobiCosWaznego idzie jak złoto, powoli jestem gotowy do refaktoryzacji a tutaj nagle klops. Nie wiem jak "podmienić" zachowanie funkcjaLokalnaDlaTegoPliku. Jest zdefiniowana w tym samym pliku...

Jeśli w: "//Mijesce X" wstawię:
#define funkcjaLokalnaDlaTegoPliku funkcjaLokalnaDlaTegoPliku_STUB
nic mi to nie pomoże, bo zmieni się nazwa w miejscu wywołania i definicji.

Sporo czasu grzebałem w google, szukałem w książkach, ale żadne rozwiązanie mi się nie spodobało, np:
http://stackoverflow.com/questions/4882029/unit-test-stub-c-helper-method
http://stackoverflow.com/questions/8959132/function-mocking-for-testing-in-c
Working Effectively with Legacy Code - rozdział 19.

Generalnie wyszło mi, że tego problemu nie da się rozwiązać przez sprytne makro albo na poziomie linkera (dodam że korzystam z google test a projekt jest w Visual Studio). Jedyne wyjście to zmodyfikować plik: funkcjonalnosc.cpp (kod produkcyjny). Pierwsze pytanie: Czy to faktycznie prawda? Ktoś miał podobny problem i jakoś sprytnie sobie z tym poradził?

Ok załóżmy, że chcemy przerobić funkcjonalnosc.cpp, - jak to zrobić żeby móc "podmienić" implementację w funkcjaLokalnaDlaTegoPliku w teście. Można na przykład przekazać ją jako wskaźnik do funkcji, ale to nie jest dobre rozwiązanie. Takich funkcji do przekazania było by bardzo dużo, a do tego chcę żeby było ich jeszcze więcej (chcę powydzielać implementację do nowych funkcji).

Można dopisać do wywołania: funkcjaLokalnaDlaTegoPliku_ORG i w kodzie produkcyjnym:
#define _ORG
a w kodzie testowym:
#define _ORG _STUB
ale takie _ORG dziwnie będzie wyglądało w kodzie produkcyjnym. Mogę też wrzucić wszystkie te funkcje do klasy - już to sprawdziłem - działa niby fajnie, ale to dość duża modyfikacja w funkcjonalnosc.cpp. Taka zmiana jest dopuszczalna, bo cały kod jest kompilowany jako kod C++ (i testowy i produkcyjny) - ale czy to dobry pomysł ? Funkcje w tej klasie nadal korzystają z globalnych zmiennych. Można by te globalne zmienne wrzucić do klasy - ale to temat na innego posta.
Jeszcze inną opcją jest wyrzucenie funkcjaLokalnaDlaTegoPliku do innego pliku. Wtedy automatycznie stanie się zewnętrzną zależnością i będę mógł ją podmienić. Ale to nie jest dobre rozwiązanie, bo funkcjaLokalnaDlaTegoPliku jest mocno związana z funkcjaKtoraRobiCosWaznego (funkcja lokalna wykonuje pracę dla funkcji która robi coś ważnego - powinny być w jednym pliku bo realizują jedno zadanie i łatwiej zrozumieć co się dzieje gdy są blisko siebie )

Tutaj drugie pytanie: Jak wy to robicie? Jak przerobić funkcjonalnosc.cpp żeby móc wygodnie "podmienić" zachowanie funkcjaLokalnaDlaTegoPliku w teście. Przypominam, że chciałbym możliwie jak najmniej zmieniać plik funkcjonalnosc.cpp.

Jeżeli jest taka potrzeba, mogę dostarczyć bardziej "realne" fragmenty kodu - w sensie budujący się projekt który można sprawdzić. Zależy mi na konkretnych propozycjach rozwiązania - fragmenty kodu mile widziane.
Jeżeli ktoś ma ciekawy materiał na ten temat (ale nie generalnie o testowaniu tylko z rozwiązaniem tego konkretnego problemu) w internecie - proszę o linka.

Przepraszam za objętość tego wpisu.

Pozdrawiam,
Lerhes

4
Gry / Gry typu survival - prośba o tytuły
« dnia: Styczeń 20, 2014, 16:59:21 »
Cześć,

Krótkie przedstawienie się / przypomnienie o sobie:
Kiedyś (w sumie już dość dawno temu) byłem w miarę aktywnym użytkownikiem forum. Potem ciężko było z czasem, ale zawsze tutaj przychodziłem i czytałem różne co ciekawsze wątki. Dla tych którzy już mnie nie pamiętają / są nowi : jestem programistą pracującym w branży telekomunikacyjnej, po godzinach zajmuję się programowaniem gier.

Do rzeczy:
Chciałbym poprosić was o tytuły gier (komputerowych/mobilnych itp) które pasują wam do poniższego opisu:
1. Gatunek: Survival simulator lub po prostu survival.
2. W grze chodzi o to, żeby przetrwać w trudnych warunkach: takich jak brak pożywienia, niska temperatura, ewentualnie jakieś zagrożenie w stylu dzikie bestie.
3. W grze żeby przetrwać musimy zbierać jakieś materiały. W stylu drewno (ogień nas ogrzeje), skóry zwierząt (ciepłe ubrania), owoce roślin (jedzenie) lub mięso .. To jest najważniejszy warunek.
4. Startujemy praktycznie z niczym i musimy od zera zbierać materiały i najpierw przetrwać a potem coś zbudować.
5. Czas płynie nieprzerwanie, nie ma podziału na tury.
6. Postać (główny bohater) może rozwijać umiejętności, dzięki czemu może coraz lepiej radzić sobie w trudnych warunkach.
7. Może być 3D ale raczej w rzucie izometrycznym (coś w stylu Warcraft 3), głównie chodzi mi o gry 2D.

O jakie gry mi nie chodzi:
Wszelkie FPS-y w których zabijamy zombie (to jest survival ale nie o taki klimat mi chodzi).
Wszelkiego rodzaju gry RTS: budowanie bazy i produkowanie jednostek.

Kilka przykładów żeby trochę rozjaśnić jakie gry mnie interesują:
1. Island Troll tribes -> chyba tak to się nazywało. Mapa-mod do Warcrafta 3. To gra na której oparłem powyższy opis. Każdy gracz ma trolla którego kontroluje i stara się zebrać odpowiednie materiały żeby najpierw przetrwać a potem zawalczyć z bestiami na mapie (lub drugą grupą graczy-troli na mapie).
2. Dwarf Fortress -> Nom nie do końca dobry przykład, ale jest zbieranie zasobów (albo raczej ich wykopywanie). Gra nie pasuje pod tym względem, że nie ma bezpośredniej kontroli nad krasnalami (można im wydawać rozkazy ale czy coś zostanie wykonane zależy na przykład od ich nastroju).
3. Rebuild -> fajna gra na iphona jest w jakiś sposób zbieranie zasobów i budowanie miasta. Natomiast nie pasuje mi do punktu 4 i 5.
4. PixelVillage -> To nawet ciekawa gra -> jest budowanie wioski od zera. Ale trochę za bardzo przypomina klimatem RTS. Poza tym, jeżeli nic nie będziemy robić to nic złego się nie stanie -> nie ma tej presji że jeżeli nie przygotujemy mięsa -> to postać umrze z głodu. Jeżeli nie ubierzemy się, to nocą zamarzniemy z zimna.
4. Minecraft / Terrania / Junk Jack i inne klony -> Jest zbieranie materiałów i jest walczenie o przetrwanie. Nie do końca klimat jest taki o jaki mi chodzi ale te produkcje nawet pasują do opisu.
5. Kiedyś ktoś w innym temacie dał linka do tej strony: http://thelectricafe.blogspot.com/ . Całkiem nieźle do opisu pasuje pomysł 4. CASTAWAY.

Jeżeli jest gra która mogła by być tym o co mi chodzi ale nie do końca pasuje do opisu, to i tak proszę ją wymienić -> na pewno sprawdzę. Byłbym szczególnie wdzięczny za tytuły z platformy mobilnej (ale proszę też o tytuły z PC/flashowe itp).

Pozdrawiam,
Lerhes

5
Gry / Prawa autorskie -> granice
« dnia: Luty 09, 2011, 16:48:10 »
Przeszukałem forum, ale nie znalazłem tematu który odpowiadał by na moje pytanie:
W tym było o używaniu nazwy już wykorzystanej do innej gry (ala tetris) to nie dotyczy mnie, bo grafika jak i tytuł będą zupełnie inne.
http://forum.warsztat.gd/index.php/topic,5466.0.html
Tutaj było ogólnie o prawach autorskich, ale nie znalazłem tego co mnie ciekawi:
http://forum.warsztat.gd/index.php/topic,17813.0.html
http://forum.warsztat.gd/index.php/topic,17562.15.html
http://forum.warsztat.gd/index.php/topic,6539.15.html
http://forum.warsztat.gd/index.php/topic,416.0.html

Więc z przytoczonych dyskusji wywnioskowałem, że pomysł na mechanikę gry można kopiować (RTS-ów jest masa). Więc dla uproszczenia załóżmy, że chodzi o klon sokobana. Zrobiłem sobie własne grafiki itp. Zrobiłem sobie własną fabułę (szaman kazał poukładać głazy w takich miejscach, żeby nie przeszkadzały). Fajnie. Ale teraz przyszła kolej na konkretne etapy: Czy można skopiować ułożenie początkowe głazów na planszy i punkty ich "doczołgania" wraz ze ścianami "przeszkadzającymi"? Oczywiście dołożył bym też kilka własnych plansz. Do tego jak bardzo trzeba by je modyfikować? Przecież mógłbym na przykład dodać w każdej dodatkowe pole -> w ścianie, które nie wpłynie na wynik rozgrywanej planszy -> ale w sumie będzie inną planszą (przykład do porównania w załączniku -> nie skupiamy się na tym czy faktycznie nie wpłynie na wynik :P ). W końcu różnych etapów nie można wymyślać w nieskończoność (właściwie można, przynajmniej w tej grze), ale chyba wiadomo o co mi chodzi.

To w co celuje ma jeszcze mniejsze możliwości generowania plansz i nawet jakbym powymyślał wszystkie sam, to wiele było by takich samych jak w klonowanej grze.

Generalnie pytanie na tym forum o takie rzeczy jest dość niefortunne: przecież mam do czynienia z programistami a nie prawnikami ;]. Mimo wszystko próbuję, może ktoś już przechodził przez podobny problem.

Edit KOS: Prawda i dlatego właśnie się zastanawiam czy coś jest na rzeczy, czy nie. Z tych fragmentów akt prawnych, które cytowane były na forum -> trudno mi wywnioskować czy mogę to zrobić czy nie. Ktoś jeszcze ma jakieś uwagi ?
Lerhes

6
Forum / Czyszczenie forum?
« dnia: Styczeń 24, 2011, 15:46:53 »
Szukałem dzisiaj pewnego bloga w którym wyczytałem ciekawy artykuł, a potem zgubiłem jego adres. Z racji tego, że to był blog użytkownika warsztatu, to myślałem, że szybko znajdę go, klikając na opcje "Ludzie" z forum i segregując po wpisanym adresie strony (najczęściej są to właśnie blogi).

Okazało się, że oprócz wartościowych wyników, większość zawiera śmieci. To znaczy jakieś boty pozakładały konta, w celu promowania jakiejś strony (często są to strony porno). Wychodzi, że 24% użytkowników warsztatu prowadzi jakąś stronę.

Trochę dziwne, że udało im się pozakładać tak dużo kont, ale to nieistotne. Mnie interesuje, czy można by je wyczyścić (prosta piłka -> ma ustawiony adres strony i zero postów -> delete) tak aby odnalezienie użytkowników z sensownymi blogami było możliwe? Jeszcze lepiej było by wyczyścić wszystkich użytkowników z zerową liczbą postów (którzy utworzyli konto przed 2011) i tak nie wnieśli nic do społeczności warsztatu a tylko zaśmiecają wyniki wyszukiwania (jak się trafi chociaż jeden który nie napisał do tej pory, bo nie miał o czym, a w końcu się zdecyduje coś napisać, to założy sobie konto ponownie i po kłopocie (aczkolwiek jakoś wątpię by taki przypadek miał miejsce)).

To jest propozycja, jeżeli ktoś zna powody, dlaczego nie warto było by tego robić, to proszę o komentarze (ja ich nie dostrzegam).
Edit down: No to trafił się jakiś wrażliwy. Z tym ostatnio aktywny nawet lepszy pomysł.
Zirytowany szukaniem między spamem
Lerhes

7
Forum / Problem z nieprzeczytanymi wątkami
« dnia: Grudzień 15, 2010, 13:18:10 »
Myślałem, żeby to zignorować, ale jednak mnie to denerwuje.
Na stronie głównej forum, poprawnie podświetla mi tematy w których są nowe, nieprzeczytane wiadomości (zaznacza je tak na szaro), ale ja już się wejdzie do danego tematu, wszystko jest oznaczone jako nowe. Leci po całości. Więc mam pytanie, to chwilowy bug, który wymaga drobnej poprawki, czy trzeba się przyzwyczaić, bo to się już nie zmieni?

Lerhes

Strony: [1]