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.


Wiadomości - remz

Strony: [1] 2
1
https://github.com/SaschaWillems/Vulkan

Link z vulkanowego reddita, w razie jakby ktoś już chciał zacząć się uczyć. Od trójkąta do postprocessów, przykłady w łatwiej przyswajalnej formie.

2
Inne / Odp: Problem, nie moge wybudowac aplikacji na Andku - Moduł!
« dnia: Styczeń 30, 2016, 22:22:40 »
Zawsze mnie zastanawiało jak ludzie, którzy nie potrafią korzystać z Google są w stanie tworzyć gry.

3
C++ / Odp: Funkcja zwracająca.
« dnia: Styczeń 26, 2016, 00:31:22 »
std::unique_ptr<sf::TcpSocket> createSocket()
{
    std::unique_ptr<sf::TcpSocket> socket(new sf::TcpSocket());
    //...
    return socket;
}

Albo po prostu zamień
sf::TcpSocket connections()na
sf::TcpSocket* connections()i wywal * z
return *client;

4
Projektowanie kodu / Odp: c++ skill desing
« dnia: Grudzień 20, 2015, 14:31:56 »
Ja proponuje coś takiego:
enum ResistanceType
{
    Physical,
    Elemental,
    Amount
}

enum AttackType
{
    Projectile
}

struct ResistanceValue
{
    ResistanceType type;
    int value;
}

class CreatureStats
{
    int health;

    ResistanceValue resistances[ResistanceType::Amount];
}

class Attack
{
    ResistanceValue damage;
   
    AttackType type;

    std::string name;
}

Attack fireball;
fireball.name = "Fireball"
fireball.type = Projectile;
fireball.damage.type  = Elemental;
fireball.damage.value = 10;

Taka struktura pozwala bezproblemowo dodawać nowe typy ataku / skille / jakkolwiek to sobie nazwiesz i bez dodatkowych kombinacji zapisać je na dysku.

5
Dystrybucja i promocja / Odp: Strona promująca grę/prosty darmowy CMS
« dnia: Grudzień 04, 2015, 08:57:22 »
Strona na FB, to dobra myśl, ale ma jedną wadę, niezbędne jest konto, że ją poczytać.
Nie dalej jak wczoraj przeglądałem stronę warsztatowej gry Arashia Tavern, a konta na facebooku nigdy nie miałem i mieć nie zamierzam. Być może źle zrozumiałem twoją wypowiedź, ale do samego czytania konta mieć nie trzeba, polubienia to inna sprawa.

6
Silniki / Odp: Profesjonalny, komercyjny silnik
« dnia: Wrzesień 08, 2015, 00:29:36 »
To ja dam taki przykład do przemyślenia: Minecraft - java, zdekompilowany (chyba) w pełni klient. Czy autor Minecraft-a coś stracił na tym że nie obfuscował / nie pisał w c++?
Stracił bardzo wiele, fpsów.

7
C++ / Odp: Multithreading
« dnia: Sierpień 30, 2015, 02:33:41 »
W pthread robi się to poprzez pthread_setaffinity_np
Właśnie ta funkcja jest "not declared", nie ma jej w pthread.h z MGW64.

Zgaduję, że poza Windows ten problem w ogóle nie występuje, bo scheduler potrafi przydzielić wątki do innych rdzeni automatycznie.
Faktycznie wygląda to na błąd systemu, ale z drugiej strony nigdy wcześniej nie spotkałem się z podobnym problemem w innych aplikacjach. Poza tym jakoś nie chce mi się wierzyć, że goście z Microsoftu mogli odwalić (aż) taką amatorę.

8
Konfigurator / Odp: PC do 4K
« dnia: Sierpień 28, 2015, 22:32:06 »
Ta oferta to jakiś bubel, brakuje w niej wielu ważnych informacji (prędkość HDD, taktowanie RAM, ilość VRAMu, producent zasilacza).

Za 4000zł celowałbym w i5 4690k, GTX 970 (lub o 100zł tańszy Radeon R9 290X), MSI Z97, Crucial Ballistix 16GB, Corsair CX 750W. Razem wyjdzie ok. 4000zł. Warto by dorzucić z 200zł na dobre chłodzenie do procesora. Jeśli bardziej interesuje cię CPU niż GPU to i5 można zmienić na i7 i wsadzić do zestawu słabszą kartę graficzną. Warto też poczytać o nowej generacji GPU i CPU, może nie warto kupować teraz całego zestawu.

Cytuj
-czy pomiędzy gf960 i gf970 jest jakaś zauważalna różnica (warto dopłacić drugie tyle, czy może za 3 lata kupić nową kartę)
Jest zauważalna różnica, Wiedźmin w 1080p potrafi zadusić 970 po OC, a 960 jest w teorii o połowę słabsza.

9
C++ / Odp: Multithreading
« dnia: Sierpień 27, 2015, 22:09:28 »
Znalazłem rozwiązanie problemu, nie jest zbyt eleganckie, ale działa (tylko na windowsie, bo nie mogłem znaleźć odpowiednika z pthread który by nie był "not declared").

DWORD_PTR affinityMask = 0;
for(unsigned int i = 1; i < std::thread::hardware_concurrency(); i++)
    affinityMask |= DWORD_PTR(1<<i);

if(!affinityMask)
    affinityMask = std::numeric_limits<DWORD_PTR>::max();

mThreads.resize(aThreads);
for(unsigned int i = 0; i < mThreads.size(); i++)
{
    mThreads[i].reset(new std::thread(&ThreadPool::threadFunc, this));
    SetThreadAffinityMask(pthread_gethandle(mThreads[i]->native_handle()), affinityMask);
}

10
C++ / Odp: Multithreading
« dnia: Sierpień 27, 2015, 20:25:13 »
3 wątki robocze, 4 rdzenie ogółem (std::thread::hardware_concurrency zwraca 4).

Tworzenie wątków:
mThreads.resize(aThreads);
for(unsigned int i = 0; i < mThreads.size(); i++)
   mThreads[i].reset(new std::thread(&ThreadPool::threadFunc, this));

Dodatkowo threadFunc:
while(!mTerminate)
{
    Job* job = nullptr;

    {
        std::lock_guard<std::mutex> lock(mJobsMutex);
        if(!mJobs.empty())
        {
            std::cout << std::this_thread::get_id() << "\n";

            job = mJobs.front();
            mJobs.pop_front();
        }
    }

    if(job && job->mTask)
    {
        job->mWorking = true;
        job->mTask(job);
        job->mWorking = false;
        job->mDone = true;
    }
    else
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

11
C++ / Multithreading
« dnia: Sierpień 27, 2015, 19:52:13 »
W swojej aplikacji wykorzystuje wątki robocze do wykonywania różnych obliczeń. Wątki te tworzone są na początku działania programu i następnie pobierają zadania z listy chronionej mutexem. Jest to jedyny obiekt który wymaga synchronizacji - poszczególne zadania zawierają swoją własną kopię potrzebnych do obliczeń danych, więc w teorii wszystko powinno się ładnie skalować z ilością fizycznych rdzeni.  Jednak z jakiegoś powodu wszystkie wątki (niezależnie od ich ilości) wykonują się tylko na jednym z czterech rdzeni procesora*, konkretnie na tym na którym wykonuje się główna część programu.

Cuda się zaczynają gdy odpalam program z debuggerem - rdzenie są równomiernie obciążone**, a dodawanie nowych zadań nie spowalnia działania aplikacji. Krótko mówiąc, wszystko działa tak jak powinno.

Czy ktoś spotkał się z podobnym problemem? Czy może być to wina systemu operacyjnego, kompilatora, czy raczej szukać błędu w swoim kodzie?

Korzystam z MinGW W64 (posix threads), GCC 5.1.0. Obciążenie procesora mierzę za pomocą programu MSI Afterburner. Zmiana z standardowego std::thread na sf::Thread (SFML) nic nie dała. Ilość wątków roboczych nie ma żadnego znaczenia. Tryby debug / release zachowują się tak samo.

*CPU1: 100%, CPU2/3/4: ~2%. Po wykonaniu wszystkich zadań obciążenie rdzeni waha się w przedziale 20-60%.

**CPU1:80%, CPU2/3/4: ~70%. Niezależnie od ilości zadań program działa stabilnie, zero przycinek na głównym wątku, wyniki obliczeń są poprawne.

12
C++ / Odp: Odczytanie scrolla myszy - Allegro 4
« dnia: Sierpień 04, 2015, 16:45:59 »
http://www.udel.edu/CIS/software/dist/allegro-4.2.1/docs/html/alleg004.html#mouse_z

Nie mam pojęcia co ty googlowałeś, ale jednym z pierwszych znalezionych linków jest polski tutorial:
http://cpp0x.pl/dokumentacja/Allegro-4-4/mouse_z/1102

13
Szczególnie trudne wydaje się być wczytywanie gdy część potrzebnych danych jest w jednym pliku, a druga w drugim, żeby nie szukać każdego kafelka osobno  (mam litość dla mojego procesora...).

Możesz lepiej określić co masz na myśli mówiąc o szukaniu danych / kafelków po plikach? Jeśli chcesz wczytać konkretny kafelek, to nie musisz niczego 'szukać', bo znając jego położenie wiesz dokładnie co i gdzie odczytać. Jeśli przez "część" danych masz na myśli to, że potrzebujesz tyle informacji żeby symulować grę w obszarach w których nie ma gracza (coś w rodzaju A-Life w STALKER-rze?), to siłą rzeczy będziesz musiał je wczytać już wcześniej i operować na nich w pamięci, a same obliczenia możesz rozłożyć w czasie, czy nawet przerzucić na inny wątek.

Jeśli natomiast martwisz się o to, że gracz może np. bardzo szybko zmieniać położenie, albo obiekty w grze mogą potrzebować danych z odległych obszarów, to masz parę wyjść. Na przykład jeśli region nie jest potrzebny graczowi, to zamiast od razu usuwać go z pamięci, oznaczasz go jako "nieaktywny". Jeśli jakiś obiekt będzie go potrzebował to może taki obszar przywrócić do życia bez konieczności doczytywania danych z dysku. Oczywiście trzeba nałożyć jakiś limit na ilość takich regionów i usuwać z pamięci te które nie były używane przez dłuższy czas. Sposób ten można zastosować do wszystkiego - regionów, obiektów, tekstur, plików dźwiękowych itd.

Możesz też umożliwić obiektom "blokowanie" regionów - jeśli jakiś element świata który nie jest graczem potrzebuje czasu aby wykonać swoje zadanie, blokuje on swój obszar niezależnie od położenia gracza, tym samym zabezpieczając go przed przedwczesnym usunięciem.

14
Czemu chcesz mieć całą mapę w jednym pliku? Minecraft zapisuje dane mapy w "regionach" - plikach, które obejmują tylko pewien obszar mapy (np. 128x128 kafelków) i nazywane od ich współrzędnych (jeśli 128 to rozmiar regionu, to kafelek x:2 y:2 będzie w regionie r-0-0, a x:129 y:2 w regionie r-1-0). Przy wczytywaniu (streamowaniu) mapy zamieniasz współrzędne potrzebnego kafelka na współrzędne regionu i odczytujesz (lub zapisujesz) tylko plik związany z tym regionem. Regiony możesz dalej dzielić na chunki, dzięki czemu dostęp i wyszukiwanie poszczególnych kawałków będzie szybsze - przy szukaniu kafelka najpierw szukasz pętlą po regionach, których jest znacznie mniej niż 'chunków', a następnie możesz pobrać określone dane jak z tablicy dwuwymiarowej - (x)(y) lub x+y*width.

Przykład:
ChunkMap: http://pastebin.com/5ydGimJw
Region: http://pastebin.com/iCNnnkX4

Wybacz, nie chce mi się tego przerabiać na 2D, ale sam pomysł jest na tyle prosty, że powinieneś go bez problemu ogarnąć.

Dodatkowym plusem takiego rozwiązania jest fakt, iż możesz mieć nawet 10000x10000 takich segmentów - jak będziesz kompresował poszczególne pliki to miejsca na dysku Ci nie braknie.

15
Gry / Odp: Wrażenia z Wiedźmina 3
« dnia: Maj 22, 2015, 16:57:07 »
Gra jest niesamowita. Spory, żyjący świat w którym naprawdę można wczuć się w rolę łowcy potworów. "Malowane" drzewa i trawa oraz świetne efekty pogodowe sprawiają, że całość wygląda jak wizualizacja dobrej książki fantasy. Zadania, dialogi i postacie są fenomenalne, ale zdziwiłbym się gdyby było inaczej, w końcu to gra oparta na literaturze Sapkowskiego. Sterowanie nieco toporne, ale nie jest tak złe jak niektórzy piszą. Walka również na plus, można w końcu jednocześnie chodzić i blokować ciosy.

9,5/10 - moim skromnym zdaniem produkcja ta jest wzorem dla przyszłych RPG z otwartym światem. Guzik mnie obchodzi czy to polska gra czy zagraniczna - jest piekielnie dobra i tylko to się liczy.

Do osób mających problem z crashami, w GOGowej wersji wystarczy usunąć Galaxy.dll i GOG.dll, a wszelkie inne problemy wyeliminuje patch.

Strony: [1] 2