•  

    Hej,

    Chciałem się pochwalić moim pierwszym w życiu silnikiem gier o ciekawej nazwie CLUSEK. Przez ostatnie półtora miesiąca po pracy i w weekendy pisałem sobie silnik oparty od DirectX 11 w C++. Na obecną chwilę mam już zaimplementowane:
    - UI Edytora;
    - Podstawowy silnik renderujący oparty od DirectX 11;
    - Możliwość wczytywania modeli i tekstur z pliku (format JSON);
    - Możliwość wczytywania map z pliku (format JSON);
    - Architekturę opartą o czystego ECS;
    - Logger z możliwością zapisu logów do pliku lub na konsolę;
    - Plik konfiguracyjny (własny format).

    W planach mam jeszcze wiele elementów takich jak na przykład:
    - Obsługa terenu z teselacją;
    - Fizyka z użyciem PhysX;
    - Obsluga audio;
    - PBR;
    - Lepsza obsługa materiałów/shaderów (obecnie jest masakra i mam to w planach zrefaktorować);
    - Cienie;
    - AO;
    - Obsługa kontrolera;
    - Lepsza obsługa myszki;
    - Rozbudowa edytora;
    - i wiele wiele innych...

    Jeżeli ktoś ma jakieś pytania lub opinię na temat postępu to chętnie odpowiem. Cały kod źródłowy można znaleźć na Github. Jeżeli znalazł by się ktoś kto się zajmuje się profesjonalnie tworzeniem gier oraz silników mógłby coś jeszcze dopowiedzieć na temat silnika, albo co w nim poprawić (na pewno jest w nim dużo takich elementów) to byłoby po prostu ekstra! Nie mniej super będzie usłyszeć każdą opinię.

    #programowanie #gamedev #gry #directx #grafikakomputerowa

    źródło: CLUSEK.jpg

    •  

      @bilek993: FAJNE ALE NIE RÓB WIĘCEJ

      pokaż spoiler nie no serio fajne

    •  

      @bilek993: kurła niektórzy piszą sobie na przykład gry i już jest to dla nich osiągnięcie a niektórzy piszą... kurwa całe silniki do tworzenia gier no kurła (╯°□°)╯︵ ┻━┻, szacuneczek pozdrawiam

    •  

      @MrFisherman: Przez to, że tyle osób chce pisać gry, a prawie nikt nie chce pisać silników wytworzyła się dość dziwna sytuacja, że do takiego Unity, czy Unreala jest pełno książek, filmików na YT i masa stronek z tutorialami. Natomiast co do silników... nie ma praktycznie nic.

    •  

      @bilek993: fajnie to teraz przepisz na #rust xD a tak na serio to gratki. Dalbym stara na gh ale stalku stalku

    •  

      @sp3cooland: Każdy mówi o Rust, ale jednak największe studia twardo siedzą na C++. Myślę, że Rust nie zdominuje rynku gier tak szybko, ponieważ biblioteki takie jak DirectX, czy PhysX musiałby zostać do tego w pełni dostosowane, a na to się nie szykuje. Więc pisanie w Rust własnych projektów tym bardziej w nim nie jest tego warte.

    •  

      @bilek993: Czy to takie dziwne? Mimo wszystko większość osób nie ma potrzeby wynajdowania koła na nowo i pisania wlasnego silnika.

    •  

      @bilek993 zajrzałem. C++ nie jest moim ulubionym językiem, a już dla Windowsa tym bardziej. Plus za standard > 98.

      Kod mi się średnio podoba, przykładowo:

      AdapterReader::PrintAdapterData(DXGI_ADAPTER_DESC description, int id){
      char charsDesc[128];
      auto defChar = ' ';
      WideCharToMultiByte(CP_ACP, 0, description.Description, -1, charsDesc, 128, &defChar, nullptr);
      const std::string convertedDescription(charsDesc); Logger::Debug("[" + std::to_string(id) + "] " + convertedDescription + " (" + std::to_string(description.DedicatedVideoMemory / 1000000) + ...

      Mało to dla mnie czytelne, usiane takimi "magic numbers". Include w stylu '#include "../Utils/Logger.h"' (czyli relatywne ścieżki). Zwracanie wektora zbudowanego na stosie, tzn. pewnie kompilator zrobi na nim std::move ale jakoś...
      A zajrzałem tylko do dwóch plików.

      Natomiast bardzo podoba mi się zrzut ekranu który wrzuciłeś, ładne.

    •  

      @bilek993: No to moja opinia jest taka, że spaprałeś. Ograniczając się do DirectX, ograniczasz się do jednej platformy i jednego systemu operacyjnego.
      Powoli Vulkan wchodzi i z tego powinno się korzystać. Albo z OpenGL w najgorszym razie.

      No a poza tym to standardowo i spoko wygląda.

    •  

      @bilek993: myslisz ze dasz rade to wykorzystac komercyjnie, czy bardziej tak dla skilla / portfolio ? Szacun ogolnie.

    •  

      @WykresFunkcji: Racja i pewnie dlatego nie ma tych zasobów. Problemem jest co innego, rozwój grafiki jest ogromny, a prawdziwych specjalistów z krwi i kości mało na świecie. Nowych nie będzie dużo przybywać, co w pewnym momencie moim zdaniem może spowodować patową sytuacje w rozwoju grafiki komputerowej, a to już bardzo słabo.

      @Antyradek: Vulkan fajna sprawa i dobrze, że to poruszyłeś. Długo zastanawiałem się jakie API wybrać i to nie była pochopna decyzja jak mogło by się wydawać. Więc wracając do Vulkan, jest to tak zwane "Expert API" i to określenie nie jest bez powodu. Pisanie w Vulkanie jest cholernie trudne, szczególnie projektów open source. Vulkan jest tak niskopoziomowy, że trzeba pisać nawet własne alokatory pamięci dla przechowywania buforów, czy obrazów w pamięci. To jest w teorii fajne, ale nie gdy pisze się silnik w wolnym czasie po 2-3h dziennie, ponieważ tzw. "Time to Hello World" jest bardzo wysoki, gdyż trzeba napisać kilka tysięcy linii kodu zanim uda się wyświetlić cokolwiek na ekranie. OpenGL natomiast jest dość starutkim API i ma on swoje problemy przez które w gamedev nie jest popularny tak bardzo (jeżeli będziesz zainteresowany to Ci mogę wypisać w innym komentarzu kilka z nich). DirectX natomiast mimo swoich wad jest dość... dobry. Powiedziałbym, że nawet bardzo dobry. Microsoft ładuje kupę kasy, żeby DirectX był na topie. DirectX jest spójny w ma wiele "ficzerów", które no... robią wrażenie. DirectX 12 na przykład ma wsparcie dla sprzętowego ray tracingu. Chociaż DirectX 12 to też "Expert API" to jednak jest na tyle podobne do wersji 11, że da się z niego łatwiej przesiąść, niż z OpenGL do Vulkana. Zamknięcie tylko na Windowsa jest słabe, ale ma też wiele zalet. Zresztą tak jak pisałem, chciałbym kiedyś zaimplementować sobie PhysX, a jego zbudowanie np. na takiego Linuxa to nie jest tak przyjemna rzecz jak mogło by się wydawać w moim odczuciu. Dodatkowo jedna platforma to mniej testowania, czy wszystko jest okej. Ogólnie temat jest dość wielopoziomowy i skomplikowany.

      @Rasth: Chciałem sobie napisać silniki do portfolio i może kiedyś uderzyć do gamedev jako programista silników.

    •  

      @Oo-oO: Po pierwsze dzięki za przejrzenie kodu, bo to dość ważne dla mnie. Masz rację, kod związany z renderem jest do solidnej przebudowy. To co znalazłeś w metodzie PrintAdapterData jest złe, ale są niestety jeszcze gorsze. Masz rację, powinienem zmienić zwracanie wartości, czy magiczne wartości na jakieś stałe, niestety ten kod jest inspirowany dość mocno oficjalną dokumentacją M$, a tam pojawiają się też takie rzeczy i niestety nie pomyślałem wtedy, żeby to zmienić, ale tak jak mówię ostry refaktor jest potrzebny, bo podczas pisania tego zależało mi dość mocno na efekcie w miarę szybko. Natomiast ścieżki do include to zasługa ReSharpera C++, który takie tworzy. Niby można to poprawiać z palca, ale pokusa jest dość silna, żeby kliknąć CTRL + ..

    •  

      @Oo-oO: A i lepiej nie zaglądaj do RenderSystem, bo tam jest dramat to jest w pierwszej kolejce do przebudowy całkowitej.

    •  

      @bilek993 prawdę mówiąc później zajrzałem jeszcze w dwa miejsca. Reinterpret cast<void**>... i drabinka ifów przy budowie menu. No nic, uczymy się całe życie, fajne że masz tyle motywacji, mi już raczej brak.

    •  

      @bilek993: Na jakich silnikach się wzorowałeś tworząc swój?
      Nie chciałeś ulepszyć już znajdującego się na rynku silnika(np. Godot Engine, Panda3d czy GDevelop)?
      Masz zamiar stworzyć w nim jakąś prostą gierkę?

      Z tego co kojarzę, to niektórzy ludzie chcą przygotować taką nakładkę na Vulkana, która ułatwi tworzenie kodu by użytkownicy mogli tworzyć aplikacje podobnie jak się je tworzy w OpenGL, ale nie pamiętam gdzie jest ta informacja.

    •  

      @Oo-oO: Z drabinką if'ów się zgadzam, że to dramat, ale nie bardzo wiem jak to zmienić. Jakieś makro? Trochę strach dodawać makro, bo drabinka ifów wygląda na pierwszy rzut oka źle, ale makro może być jeszcze gorsze. Masz może jakiś pomysł, chętnie bym go poznał, bo chciałbym się nauczyć jak zrobić to dobrze. Co do "reinterpret_cast<void* *>" to trzeba podziękować M$ za przygotowanie takiego pięknego API, które to przyjmuje jako parametr void* *.

      Przykład z ich dokumentacji na użycie metody "CreateDXGIFactory":
      IDXGIFactory * pFactory = NULL;
      CreateDXGIFactory(__uuidof(IDXGIFactory) ,(void * *)&pFactory)


      Zrobienie tego w taki sposób nie jest, ani lepsze, ani nic. Raw pointery na com objectach w dokumentacji to dopiero jazda bez trzymanki. Jak człowiek zapomni zrobić Release to wyciek pamięci.

      @qarmin: Wzorowałem się trochę na UE4 i trochę na Unity, jednakże one są oparte na zupełnie innych architekturach. Unity składa się z typowego Component System i dopiero powoli wprowadza Entity Component System, co też im nie idzie tak szybko, gdyż nie jest niestety to takie proste przebudować cały silnik Unity do zupełnie nowej architektury. Nie chciałem udoskonalać instniejącego już silnika, bo chciałem zbudować sobie dość mocne podstawy w tym temacie i najlepiej było to zrobić właśnie przez napisanie własnego silnika od zera. Na tym silniku mam zamiar napisać grę w której to jeździ się po bezdrożach samochodem terenowy, ale do tego jeszcze daleka droga. Co do nakładek na Vulkana to się w to nie zagłębiałem na tyle, żeby powiedzieć jak to z tym jest niestety.

    •  

      @bilek993 niestety, na szybko to nic nie podrzucę, bo bez wczytania się to mógłbym gorzej doradzić. Ogólnie, myślę że o ile architektura wygląda na przemyślaną, to potrzeba przemyśleć ją jeszcze raz (biorąc pod uwagę co wiesz już teraz, jakie Microsoft rzeczy wystawia itd). Brakuje jej abstrakcji która by takie brzydkie rzeczy ukrywała niżej.

    •  

      @Oo-oO: Dzięki, tak zrobię. Przerobię kod z większą ilością abstracji i z wiedzą jakie to M$ lubi zostawiać pułapki na programistów ( ͡° ʖ̯ ͡°)

    •  

      @bilek993: Kod wygląda nawet spoko, ale mógłbyś dawać chociaż jedną linijkę komentarza do deklaracji w nagłówku.
      Mam fobię po grzebaniu w pracy w czyimś kodzie w C w stylu jądra Linuksa. Większość roboty to dodawanie komentarzy i zmienianie nazw na czytelne.
      Ale brawo za porządne klamry.

      +: Zashi
    •  

      @bilek993: co znaczy, że jest oparty o Directx 11?

    •  

      @Antyradek: Dzięki! Dodam sobie to do mojej listy rzeczy do zrobienia. Nie mniej starałem się i tak dawać do wszystkiego długo i czytelne nazwy (czasem nawet za długi), aby od razu było w miarę wiadomo co dana klasa/metoda/pole robi. Nie jestem fanem kodu jądra linuxa, czy nawet biblioteki standardowej, bo jak ktoś pierwszy raz zobaczy "stoi" to nie bardzo wie o co chodzi. Szczególnie, że poznaje to na samym początku nauki i ma takie "Wut? Dlaczego taki mnemonik jak w assemblerze?!".

    •  

      @lguodwznkoi_e: Znaczy, że zarówno system odpowiedzialny za renderowanie obrazu, jak i generowanie dźwięku jest (w przypadku audio będzie) wykorzystywał DirectX. Dość ważne jest to, że DirectX nie odpowiada tylko za obraz, ponieważ to dość duża kobyła.

      +: Akirra
    •  

      @bilek993: Ciekawe, interesuje mnie to co konkretnie robisz, w sensie zaczynałeś od komplentych podstaw tworząc macierze projekcji i macierze obrotu? Polecasz jakieś książki do nauki/?

      +: Akirra
    •  

      @bilek993 ja nie w temacie, ale w pierwszej chwili pomyślałam "jaki dziwny Crysis..." :P

    •  

      @lguodwznkoi_e: Zacząłem od potwórzenia całej matematyki ze studiów. No dobra... może nie całej, ale mocno wektorzy, macierze i analizę. Potem stworzyłem sobie po prostu kwadrat na ekranie bez macierzy widoku, świata/modelu, czy projekcji. Potem krok po kroku dodawałem kolejne elementy, czyli dodałem do mojego silnika kamerę (macierz widoku oraz projekcji), następnie zmieniłem go w sześcian. Potem dodałem wczytywnie model, a potem kolejne i kolejne elementy. I w półtora miesiąca dotarłem do tego co widzisz na screenach. Polecam przejrzeć sobie opisy commitów na github'ie co kiedy powstawało. Wiem, że jest ich ponad 200, ale można przez to przelecieć w miarę szybko wzrokiem. Co do źródeł nauki. Ech.... bolący mnie temat. One nie istnieją. Możesz kupić książkę Franka D. Luny, ale ja mam co do niej mieszane uczucia. Jest to zdecydowanie najlepsze źródło wiedzy. Jednakże raczej dla osób co dużo umieją. Na przykład świetnie umiałem kiedyś matmę, więc z tą książką ją sobie przypomniałem, ale przy rzeczach z DirectX jest strasznie szybko tłumaczone. To raczej taki pokaz różnych rzeczy, niż wytłumaczenie jak co zrobić. Podam przykład, to bardziej obrazowo to wytłumaczy. Nie potrafiłem zrobić nieba (skybox/cubemapping) i w książce jest na to poświęcone dosłownie kilka stron z chaotycznie rzuconym kodem. Oczywiście po przeczytaniu tego nie działało mi to. Po pewnym czasie doszedłem, że shader, który napisałem źle sampluje teksture, ponieważ brakowało jednej osi. Czy w książce to było? Tak. Czy było to wyszczególnione? Nie. Pełno tam jest takich elementów i szczerze trudno mi ją rekomendować. Zapytasz w takim razie co? Hmmm, dużo ludzie poleca rastertek i jest on spoko, ale ta strona jest wstrętna i odrzuca od samego wejścia co utrudnia analzę przykładów. Tak, przykładów, ponieważ to bardziej zbiór przykładów z krótkimi opisami. W sumie to... tyle. Jest jeszcze dokumentacja M$ i jest ona najlepsza i najbardziej kompletna, ale ma miny czekające na programistów w postaci kodu, który bez dogłębnej wiedzy C++ (oraz M$ bibiotek) będzie powodował niekontrolowane wycieki, o czym zresztą pisałem kilka komentarzy wyżej. Tak więc przygotuj się na dobrą zabawę przy pisaniu swojego silnika.

    •  

      @bilek993: dzięki za informacje, aktualnie mój silnik jest w stanie wyświetlić sześcian (lub inny obiekt typu obj) i można go obracać za pomoca przycisków hehe

    •  

      @lguodwznkoi_e: To dobry początek, dodanie wczytywania .fbx to zasadniczo biblioteka, która to za Ciebie zrobi. Większe problemy zaczynają się z shaderami moim zdaniem. Piszesz w opengl, czy directx?

    •  

      @bilek993: Nie używam żadnej specyfikacji póki co (jeśli o to chodzi), chodziło mi raczej o poznanie zasady działania ale zobacze jak sie rowinie temat. Na początku znałem tylko IDE "Processing" i używałem ich funkcji 2d to implementacji moich 3d (wszystko jest w javie) Potem przerzuciłem się na "Open frameworks" bo wole c++.

      +: Akirra
    •  

      @bilek993: Kurde półtora miesiąca i już lepsze od Torque3D, co za lenie tam siedzą ( ͡° ͜ʖ ͡°).
      A tak serio to szanuję, tak trzymaj!

    •  

      @PrzemekWolw: Zamierzam to rozwijać i raz na jakiś czas wrzucą postęp na wykop postępy w tym projekcie. Jednym słowem #clusek górą!

    •  

      @bilek993: Będziesz wrzucał info na tym tagu? Chętnie bym pooglądał.
      A tymczasem czekam na implementacje lepszego edytora do T3D w imgui bo to co teraz już mocno denerwuje w 2019 roku.

      źródło: cdn.discordapp.com

    •  

      @PrzemekWolw: Tak, myślałem by wrzucać na tag #clusek nowe info, ale też na te tagi co oryginalnie napisałem, żeby inni, którzy nie będą tego obserwować też mogli to zobaczyć. Natomiast imgui nie jest taki idealny, używam jego wersji beta i uważam, że jest lepiej, ale nadal nie idealny. Po pierwsze dopiero w wersji beta wspiera dockowanie, a i tak jego implementacja jest trudna i pisałem z osobą odpowiedzialną za tworzenie imgui, aby to zaimplementować poprawnie, tak jak na zdjęciu.

    •  

      @bilek993: gratuluje samozaparcia, pewnie ostro klepiesz kod w pracy. Skąd bierzesz siłe, żeby jeszcze bawić się w to po pracy? Dla laika jak ja wygląda to imponująco, ogólnie ucze się frontend ale czasem mam dni że nie dam rady nic więcej wbić do tego łba.. a uczyłem się z 4h? Robie przerwy itd. ale nadal nie posiadam takiego samozaparcia do robienia czegos nawet jak czasem mi się nie chce. Nie chodzi w sumie o samo programowanie ale ogólnie do wszystkiego :/ zazdroszcze i jeszcze raz gratuluje

      +: Zashi
    •  

      Komentarz usunięty przez autora

    •  

      @to_ja_dzik: masz jakieś codzienne nawyki, "rytuał" że udaje ci się zgrać prace + swój projekt + życie osobiste itd. ? Próbowałem kiedyś wszystko zgrać ale po dłuższym czasie coś się posypało i inne leciało :/ ciężko jest dobrze zorganizować dzień zwłaszcza np. jak ucze się jednej rzeczy, nauka zajmuje mi dłużej niż przewidywałem a już planuje co dalej się nauczyć

    •  

      @MrFisherman: Jak byłem młody to napisałem własny język programowania. W basicu (choć były krótkie wstawki assemblera). A prędkość? Na atari 800xl śmigał jak rakieta xddd

    •  

      @bilek993: jest bodajże taki silnik o nazwie celelej engine który też jest tworzony przez jednego polaka. Są nawet filmy na youtubie więc może coś cię tam zaciekawi.

    •  

      @NickciN: Ja jeszcze odpowiem, że kluczem jest robić to co się kocha. Dla mnie pisanie gier, czy elementów obok nich jak silniki to samo życie. Nie męczę się jak to robię, tylko odpoczywam. Polecam znaleźć taką pasję i w niej znaleźć pracę, a nie przepracujesz ani jednego dnia.

    •  

      @biliard: Też kiedyś pisałem własny język programowania. Fajna zabawa, chociaż dość trudna. Szczególnie tokenizacja i inne tego typu procesy kompilacyjne. Moim zdaniem trudna rzecz, ale daje satysfakcje. Myślałem nawet by do silnika dodać programowanie graficzne jak w UE4.

    •  

      @bilek993: niby tak, jednak na początku ciężko ze względu że człowiek już by chciał tworzyć rzeczy takie "WOW" a zaczyna od "Hello World". Lubie kodzić, poznawać nowe rzeczy jednak ta ilość, dodatkowo goni mnie czas ze względu na sytuacje. Mam tyle pomysłów, fajnych rzeczy które chciałbym sam stworzyć ale jak człowiek myśli ile musi się najpierw nauczyć aby coś zrobić jest to troche przytłaczające

    •  

      @vCertus: Dzięki, ale szybki research pokazał, że to już chyba martwe, ale był dość zaawansowany.

    •  

      Komentarz usunięty przez autora

    •  

      @bilek993: Piszę o sytuacji jako malolat. I jeszcze raz, sam język pisałem przede wszystkim w basicu, który już jest językiem wysokiego rzędu ;) Do tego niemiłosiernie wolnym...
      To na 8bitowcu. ( ͡° ͜ʖ ͡°)

    •  

      Komentarz usunięty przez autora

    •  

      @bilek993: Swietne podejscie! Trzymam kciuki

    •  

      Komentarz usunięty przez autora

    •  

      @to_ja_dzik: @bilek993: dzięki za rady, a Cortex postaram się ogarnąć

      pokaż spoiler dałem do zakładek kiedyś przejrzeć ( ͡° ͜ʖ ͡°)


      pokaż spoiler nie no żartuje, odpale sobie po filmie :D

    •  

      Tak poza tym, widzę, że minęły 3h i zaraz dobije do 175+. Super, że stworzenie czegoś cieszy się takim zainteresowaniem. To daje siłę do rozwoju tego silnika. Jeżeli będą chętni to mogę nawet kiedyś w ramach rozwoju tego silnika zacznę tłumaczyć jak działają niektóre elementy w silnikach gier, jak normal mapping, PBR, czy macierze MVP.

    •  

      @bilek993:
      Parę rzeczy:
      - masz błędy w README (pisownia głównie)
      - trzymasz binarki 5MB w repo
      - wszędzie zwykłe pointery, nie używa się teraz jakiegoś wrappera na to?
      - drawMenu mogłoby skorzystać z jakiegoś pliku konfiguracyjnego albo mapy (tylko trzeba dorzucić jakąś warstwę abstrakcji)
      - używasz floatów, czemu?
      - czasem masz magic numbers w kodzie
      - obsługa kamery w camerasystem: funkcja i wywalić ify do mapy / switcha jak już musisz
      - używaj consta gdzie się da, szczególnie w petlach
      - ResourcesLoader::Load - stream zamknie się sam?
      - nie macie w cpp jakiegoś string.format?
      - czemu logger korzysta z printf?

    •  

      @bilek993: ja pierdole, a moim osiągnięciem dzisiaj jest rozpierdolenie starej myszki i rozwalonego głośnika kombinerkami. Pora się zabić chyba xd

    •  

      @bilek993: Ogólnie to działaj dalej i wrzucaj info na jakiś tag. Widać, że masz fajną zajawkę i szanuję, że łapiesz się takiego ambitniejszego tematu

    •  

      @NickciN: ja też tak mam że pomysły mam tylko jest tego tyle że zawsze zdąże stracić motywacje zanim coś do końca napisze (ale można powiedzieć że nadal jestem na początku tej pięknej drogi związanej z programowaniem ( ͡° ͜ʖ ͡°) (xd jak to brzmi))

    •  

      @bilek993: To Twoje pierwsze podejscie do pisania silnika? Ja zaczalem swoj klepac 2 miesiace temu na potrzeby magisterki i juz wiem, ze bede pisal jeszcze jeden od nowa XD

    •  

      @bilek993: Jak jesteś programistą to poradzisz sobie z DXem (。◕‿‿◕。)

    •  

      @bilek993: jak dajesz radę jeszcze coś dziubac po pracy? Ile h udaje Ci się posiedzieć w tygodniu?

    •  

      @bilek993: Chciałbym odnieść sie do tego co napisałeś o Rustcie. To że inne silniki "mocno stoją na C++" wynika z tego że Rust jest relatywnie młodym językiem, a większość z popularnych silników rodziło się dużo wcześniej niż ten język powstał.

      Stwierdzenie że nie wartym jest pisanie projektów w tym języku jest troche nad wyrost, wszystko zależy w co sie celuje. Właśnie przez rozwijanie projektów "rustowych", rozwija się również community co zwiększa popularność języka, a co za tym idzie - wzrost bibliotek dedykowanych, wrapperów lub portów rozwiązań popularnych bibliotek z innych języków.

      Anyway, fajny silniczek wyszedł, polecam skupiać się przy rozwijaniu ficzerów które dają frajdę, inaczej można się szybko wypalić ( ͡° ʖ̯ ͡°)

    •  

      @bilek993: Aż wzięła mnie chęć na crysisa 3

    •  

      @bilek993 no to majster robisz tutorial, wszyscy to kupują i jesteś mega bogaty. Może frytki do tego?

      A tak na serio to szanuje i podziwiam. Moje dwa projekty przepadły dzięki problemom rodzinnym, dzięki którym nie mam czasu po dupie się podrapać. Wszystkie moje starania padły w pizdziec, bo "zajmij się pracą a nie gry robisz".

      Jak wyjdę z alkoholizmu po rozwodzie, to pierwsze co zrobię, to właśnie napisanie i zoptymalizowanie takiegoż silnika. Gdzieś jeszcze miałem projekty na dyskach, więc pół roku i dojdę do ładu, chyba że wcześniej padnie mi wątroba...

    •  

      @bilek993: ziom, ale daj obsługę fbx/obj oraz tekstury w png

    •  

      @bilek993: Czyżbyś się wzorował na CryEngine, że masz postacie z Crysisa?
      Co było podstawą tego silnika (jaki engine)?

    •  

      @bilek993: w czym pisales swoj wlasny jezyk programowania?

    •  

      @bilek993: https://youtu.be/Db43ajHVzlU?t=1550 hm? postacie bardzo podobne( ͡º ͜ʖ͡º)

    •  

      @bilek993 postacie z Crysisa
      Ahhh a bym sobie w jedyneczkę pograł

    •  

      @bilek993: ile robiłeś ten projekt? :P Pisanie gier na gotowym silniku to nic w porównaniu do stworzenia własnego. Pewnie jesteś matematycznym zabijaką.

    •  

      niektórzy piszą... kurwa całe silniki

      @MrFisherman: a niektórzy piszą sobie kompilatory, do kompilacji takich silników. Co kto lubi...

    •  

      @inzynier_dusz: Nie ten poziom shaderów, może kiedyś.

      @Wuszt: Tak, pierwsze, ale dużo korzystałem z Unity i UE4. To dużo daje jak masz pogląd na takie gotowe i myślę, że lepiej Ci pójdzie to jak się oswoisz z nimi.

      @FantaZy: Staram się codziennie po ~2h, ale wychodzi to różnie. Jak wejdziesz na moje konto na github to zobaczysz historię, jak często robiłem commity w ciągu roku.

      @Pawkrol: Na pewno masz rację. Nawet kiedyś słyszałem, że ludzie od Uncharted chcieli pisać swoje gry w Rust. Co z tego wyszło to nie wiem.

      @Danteo2: Jest już obsługa wielu formatów w tym png dla tekstur oraz fbx dla modeli. Chociaż lepszy jest format dds dla tekstur.

      @m0rgi: Nie nie. Postacie z crysisa są bardzo popularne w internecie, przy pokazywaniu jak działa Assimp. Nie wiem dlaczego tak jest, ale też używam tego modelu. Do podmiany jak wymodeluje coś własnego. Podstawy tego silnika trudno szukać to zbiór doświadczeń.

      @janekhe: pisałem go w c#, tutaj masz link do repo.

      @WTF_1: Postacie są takie same, ponieważ większość osób używa tego modelu przy korzystaniu z Assimp. Ja korzystałem ze strony o opengl by to zrobić i też był ten model. Link do tej strony.. Co do samej serii tego kolesia, to kiedyś próbowałem to oglądać, ale bardzo mi się nie podobało w jaki sposób coś pokazywał.

      @JakTamCoTam: Projekt powstaje od 1.5 miesiąca. Czy zabijajaką z matmy to nie wiem, ale mam mocne podstawy z uczelni.

      +: janekhe
    •  

      @WTF_1: Po dłuższej chwili doszedłem, że może warto obejrzeć tą serię, bo najdzie mnie jakiś pomysł na refaktor (ʘ‿ʘ)

    •  

      @Jumpererer: Po kolei będzie najłatwiej, a więc w punktach:
      - Do ponownego zredagowania.
      - Nie bardzo wiem co z tym zrobić, a też o tym myślałem na samym początku. Tylko co? Git LFS?
      - Można używać smart pointery, tylko po co? Raw pointery są spoko i powinno się ich jak najbardziej używać. Problemem jest zarządzanie pamięcią, a z tym nie ma tutaj problemu, bo w kodzie jest zasada "Zero new/delete".
      - Świetny pomysł!
      - Hmmm, zawsze ich używałem, nie wiem co w nich złego.
      - Racja, trzeba wyciągnąć do stałych.
      - Nie bardzo widzę tutaj zastosowanie mapy/switcha. Możesz dokładniej opisać o co chodzi?
      - 100% racji, przez moje niedopatrzenia.
      - I tutaj jest coś co zaskakuje wiele osób. Strumień zamyka się sam, ponieważ projektanci fstream stworzyli go zgodnie z zasadą RAID. Dzięki temu automatycznie po sobie sprząta przy końcu bloku.
      - Mamy, nie używam go przez moją głupotę.
      - Jest to najbardziej wydajny sposób. Jeżeli myślisz o std::cout to niestety nie jest to dobry wybór. Jest on wolny, niewydajny i problematyczny.

    •  

      @Danteo2: Po chwili do mnie dotarło, dlaczego tak napisałeś. Otóż używam json do opisywania zasobów jako takich. Te zasoby mogą zaś być ładowane z dowolnego formatu. Znaczy... Plus minus dowolnego. Z tych które wspiera Assimp w przypadku modeli oraz tych, których wspiera DirectX w przypadku tekstur.

    •  

      @kenay: Mam nadzieję, że wszystko się uda. Problemy rodzinne to masakra i rozumiem, że jest Ci ciężko. Pamiętaj, że jak już będzie lepiej, a na pewno będzie, to wrzucaj na wykop postępy. Ja zawsze chętnie zobaczę pracę innych, szczególnie, że mało ludzi na świecie się tym zajmuje niestety.

    •  

      @bilek993:

      - Hmmm, zawsze ich używałem, nie wiem co w nich złego.
      W sumie to nic. Precyzja najczęściej wystarczająca, a przy "code vectorization" ( w szczególności przy macierzach ) będzie szybsze od double.

      - Nie bardzo widzę tutaj zastosowanie mapy/switcha. Możesz dokładniej opisać o co chodzi?
      Pewnie chodziło mu o to żeby zrobić switcha na "InputOutputData->KeyboardState". Kompilator sobie zrobi jumptable i powinno być szybciej.Tylko nie wiem czy "DirectX::Keyboard::State" umożliwia zwrócenie enuma czy coś z wciśniętym klawiszem ¯\_(ツ)_/¯. A używanie mapy ( w szczególności z stl ) w hot loop to nie jest dobry pomysł xd

      - Mamy, nie używam go przez moją głupotę.
      O czymś nie wiem? std::format ma być dopiero w c++20

      zasadą RAID
      RAII :P

      - Jest to najbardziej wydajny sposób. Jeżeli myślisz o std::cout to niestety nie jest to dobry wybór. Jest on wolny, niewydajny i problematyczny.
      Wydaje mi się że wydajność jest praktycznie ta sama.

    •  

      @to_ja_dzik nie pisałeś przypadkiem o jakimś Cortex? Chciałem dzisiaj to obejrzeć, ale nie wiem jak to znaleźć. Chodzi o to coś motywującego

    •  

      @bilek993 Super! Ja piszę swój silnik tak od kilku lat, chyba też się muszę pochwalić :)

    •  

      @bilek993: usiądź mi na klawiaturze skarbie ( ͡° ͜ʖ ͡°) super

    •  

      @Damiann19:

      W sumie to nic. Precyzja najczęściej wystarczająca, a przy "code vectorization" ( w szczególności przy macierzach ) będzie szybsze od double.

      Dokładnie. Skoro jest szybciej, a do tego nie potrzebuję precyzji to po co przepłacać, jak nie widać różnicy?

      Pewnie chodziło mu o to żeby zrobić switcha na "InputOutputData->KeyboardState". Kompilator sobie zrobi jumptable i powinno być szybciej.Tylko nie wiem czy "DirectX::Keyboard::State" umożliwia zwrócenie enuma czy coś z wciśniętym klawiszem ¯_(ツ)_/¯. A używanie mapy ( w szczególności z stl ) w hot loop to nie jest dobry pomysł xd

      A co, jeżeli ktoś trzyma kilka klawiszy? Moim zdaniem to nie zadziała, ale mogę nie mieć racji.

      O czymś nie wiem? std::format ma być dopiero w c++20

      Chodziło mi o to, że w loggerze mogę dopisać ładny formatter, bo i tak używam printf, który mi to zrobi.

      RAII :P

      Odpisywanie w drodze do pracy to nie jest dobry pomysł. XD Tak, RAII XDDDDD

      Wydaje mi się że wydajność jest praktycznie ta sama.

      Nie jest niestety. Wystarczy rzucić okiem na kod asseblera prostego printf oraz cout. Jadę do domu, więc wykorzystam stackoverflow.

      int main razem z printf
      main: @ @main
      @ BB#0:
      push {lr}
      ldr r0, .LCPI0_0
      ldr r2, .LCPI0_1
      mov r1, #2
      bl printf
      mov r0, #0
      pop {lr}
      mov pc, lr
      .align 2
      @ BB#1:


      int main z cout

      main: @ @main
      @ BB#0:
      push {r4, r5, lr}
      ldr r4, .LCPI0_0
      ldr r1, .LCPI0_1
      mov r2, #6
      mov r3, #0
      mov r0, r4
      bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
      mov r0, r4
      mov r1, #2
      bl _ZNSolsEi
      ldr r1, .LCPI0_2
      mov r2, #2
      mov r3, #0
      mov r4, r0
      bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
      ldr r1, .LCPI0_3
      mov r0, r4
      mov r2, #14
      mov r3, #0
      bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
      ldr r1, .LCPI0_4
      mov r0, r4
      mov r2, #1
      mov r3, #0
      bl _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
      ldr r0, [r4]
      sub r0, r0, #24
      ldr r0, [r0]
      add r0, r0, r4
      ldr r5, [r0, #240]
      cmp r5, #0
      beq .LBB0_5
      @ BB#1: @ %_ZSt13__check_facetISt5ctypeIcEERKT_PS3_.exit
      ldrb r0, [r5, #28]
      cmp r0, #0
      beq .LBB0_3
      @ BB#2:
      ldrb r0, [r5, #39]
      b .LBB0_4
      .LBB0_3:
      mov r0, r5
      bl _ZNKSt5ctypeIcE13_M_widen_initEv
      ldr r0, [r5]
      mov r1, #10
      ldr r2, [r0, #24]
      mov r0, r5
      mov lr, pc
      mov pc, r2
      .LBB0_4: @ %_ZNKSt5ctypeIcE5widenEc.exit
      lsl r0, r0, #24
      asr r1, r0, #24
      mov r0, r4
      bl _ZNSo3putEc
      bl _ZNSo5flushEv
      mov r0, #0
      pop {r4, r5, lr}
      mov pc, lr
      .LBB0_5:
      bl _ZSt16__throw_bad_castv
      .align 2
      @ BB#6:

    •  

      @qbranchmaster1: Wygląda świetnie. Jest on dużo bardziej zaawansowany od mojego z tego co widzę. Widać, że poświęciłeś na niego sporo czasu (prawie rok). Jednakże opengl wydaje mi się trochę łatwiejszy, aby coś w nim napisać, bo na necie jest dużo materiałów. Przykładem jest GENIALNY zbiór tutoriali learnopengl. Nie można jednak umniejszać Twojej pracy, którą w to włożyłeś, bo jest na prawdę duża.

      @kadbery: Okej, kiedy i gdzie? ( ͡€ ͜ʖ ͡€)

      @memoryglimpse: Koniecznie! Zawsze warto zobaczyć rzeczy innych, bo się można dużo nauczyć.

      @ampap: (ʘ‿ʘ)

      +: ampap
    •  

      Patrząc na ilość komentarzy, to może zainteresuje się mną jakiś CD Projekt Red lub Techland i trafię do Gamedev przez wykop. W sumie byłoby to ciekawe doświadczenie, taki wykop effect.

    •  

      @bilek993: nawet nie wiesz chłopie jak ci zazdroszczę, całe dzieciństwo marzyłem o programowaniu gier, ba, nawet miałem zajęcia prywatne programowania od jakiegoś studenciaka, ale cały misterny plan idzie w pizdu bo nie jestem dobry z matematyki(nie mylić z brakiem logicznego myślenia), powiedział mi że bez matmy to ani rusz i tak moja wiedza o C++ stoi na miejscu cin cinout czy jakoś tak ( ͡° ʖ̯ ͡°)

    •  

      @TOMXT: Zamierzam się trochę nie zgodzić. Matematyka jest prosta, tylko potrzeba, żeby ktoś Ci to dobrze wytłumaczył. Zasadniczo macierze i wektory powinny Ci wystarczyć by zacząć i napisać coś prostego. Oczywiście całki, czy pochodne są potrzebne przy efektach typu PBR (np. przy wyliczeniu irradiance map). Nie mniej tak jak mówię to są zaawansowane rzeczy. Umiejąc tylko podstawy algebry liniowej możesz zrobić niesamowite rzeczy. Więc koniec z wymówkami i do nauki! ( ͡° ͜ʖ ͡°)

      +: TOMXT
    •  

      @PostironicznyPowerUser: Na obecną chwilę jeden, ale w najbliższym czasie zostanie to zmienione. Ponieważ posiadam architekturę ECS o czym już kilka razy wspomniałem, która jest wprost idealna to zrównoleglenia. Jednakże nie mam tego jeszcze, ponieważ jest to krok, którego nie zdecydowałem się jeszcze wykonać.

    •  

      @bilek993: to chyba największy problem obecnych silników, obsługa 1-2 wątków w 2019...

    •  

      @PostironicznyPowerUser: Tak jest i dlatego właśnie przepisują na architekturę ECS. Dzięki takiemu podejściu można obsłużyć wszystkie, czyli zarówno jeden, jaki i trzydzieści dwa.

    •  

      @bilek993:

      A co, jeżeli ktoś trzyma kilka klawiszy? Moim zdaniem to nie zadziała, ale mogę nie mieć racji.
      Fakt, ale nie wydaje mi się żeby to był jakiś duży problem ¯\_(ツ)_/¯

      Nie jest niestety. Wystarczy rzucić okiem na kod asseblera prostego printf oraz cout. Jadę do domu, więc wykorzystam stackoverflow.
      Zrobiłem benchmarka, wydajność praktycznie ta sama,assembler w sumie też.
      Na milion powtórzeń:
      std::cout 57904 us
      printf 53407 us
      kod

    •  

      @Damiann19:

      Fakt, ale nie wydaje mi się żeby to był jakiś duży problem ¯_(ツ)_/¯
      Moim zdaniem to jest dość kluczowy element. Co jeżeli ktoś chce skręcać i dodawać gaz jednocześnie?

      Zrobiłem benchmarka, wydajność praktycznie ta sama,assembler w sumie też.
      Na milion powtórzeń:
      std::cout 57904 us
      printf 53407 us
      kod

      Prosty przykład, na bardziej skomplikowany, gdzie masz kilka "<<" w porównaniu do printf z parametrami jest różnica. Wiem, nie robię tak jeszcze, ale mam w planach to zmienić w najbliższym czasie.

    •  

      @bilek993:

      Moim zdaniem to jest dość kluczowy element. Co jeżeli ktoś chce skręcać i dodawać gaz jednocześnie?
      To już problem użyszkodnika ( ͡° ͜ʖ ͡°) Ale fakt, w ecs ciężej. W takim UE4 to sobie zbindujesz funkcję do eventu i gitara xd Na obecną chwile będąc szczerym nie mam pomysłu jak można by było to fajnie rozwiązać.

      Prosty przykład, na bardziej skomplikowany, gdzie masz kilka "<<" w porównaniu do printf z parametrami jest różnica. Wiem, nie robię tak jeszcze, ale mam w planach to zmienić w najbliższym czasie.

      No to fakt, ale imho to i tak nie jest duży problem jak na loggera, a std::cout bezpieczniejsze.

    •  

      @Damiann19: Da się zrobić bindowanie do funkcji, ale to jest taka ogromna ilość kodu z delegatami oraz makrami, że nie wiem, czy nie iść za zasadą KISS. Czy warto wytwarzać setki linii kodu, żeby to zmienić na sposób UE4? Moim zdaniem nie. Dodatkowo nie wiem, jak będzie wyglądać sprawa wielowątkowości, którą chciałbym za niedługo dodać w takim modelu. Natomiast co do std::cout to co kto lubi, czasem bezpieczeństwo warto poświęcić w imie szybkości, nawet niewielkiej.

    •  

      @bilek993: Bardziej mi chodziło o styl w jakim się to robi w UE, a nie żeby zrobić to samo co w UE xd
      Delegaty imho nie mają sensu z ecs. Więcej to problemu zrobi niż pożytku + dodatkowy overhead. Lepszy prosty parallel for przez komponenty i gitara. :p

      Wiadomo, każdy ma tam swoje priorytety, ale tak jak pisałem. Moim zdaniem przy loggerze to nie jest jakiś duży problem.

    •  

      @bilek993: Jeżeli dorzucisz parę rzeczy to cout jest porównywalny z printfem: https://repl.it/repls/RevolvingGoodGlitches

      std::ios_base::sync_with_stdio(false);
      std::cin.tie(NULL);

    •  

      @Jumpererer: Pewnie masz rację, ale ja po prostu lubię printf, bo jest szybszy od cout bez żadnych hacków.

    •  

      @bilek993: jakieś 10 lat temu tworzył swój silnik też Wojciech Toman. Opisywał to na devlogu (http://web.archive.org/web/20130720121843/http://ngenetech.blogspot.com/ - niestety już tylko w archiwum).
      Wrzucał też filmiki, np.: http://www.youtube.com/watch?v=qevGm_8wMJk

      Mnie bardzo to ciekawiło.

    •  

      @siepan: Dzięki!
      Jego silnik jak na 10 lat temu wygląda na wyjątkowo zaawansowany. Myślę, że Crysis, który wychodził w tamtych czasach nie powstydził by się takiego silnika.
      Poza tym twój komentarz dał mi do myślenia. Myślę, że jak będę wrzucał postęp prac na wykop to przy okazji będę opisywał co było proste, z czym miałem problemy, a co poszło bez problemów i przy okazji, jeżeli ktoś zapyta w komentarzu jak zrobiłem jakąś konkretną rzecz to będę odsyłał do konkretnego miejsca w kodzie i jeżeli będzie to potrzebne danej osobie to będę omawiał w teorii jak działa dana rzecz.

Gorące dyskusje ostatnie 12h

  • avatar

    Dajcie parę plusów dla smutnego pieseła ♥

    odpowiedzi (27)

  • avatar

    Ja pierdole co mój kumpel z pracy wczoraj odjebał xDDDD

    bądź uber ważny w korpo
    pojedź do helmuta uzgadniać kontrakt
    wszystko przebiega gut
    korpo czuje miliony
    kumpel czuje duza premie
    coś musi się spierdolić XD
    kolega zauważa że zapomniał telefonu
    wraca się z lotniska
    wszyscy niemcy wkurwieni XDD
    jeden z nich zadzwonil do bo zapomnial o czyms ważnym
    hure, coś tutaj wibruje
    polak zostawil telefon
    patrzy na telefon a tam eichmann (nazwisko miał zupelnie inne XD)
    o hui chodzi
    wola innych
    dzwonia do niego po kolei
    himmler
    goering
    hitler
    mengele
    kontrakt tak bardzo rozjebany
    premia stracona tak szybko jak praca xD
    a ja siedze i nic nie robię, bo bez tego kontraktu i tak mnie zwolnią ( ͡° ͜ʖ ͡°)

    #pracbaza #praca #heheszki #truestory
    pokaż całość

    odpowiedzi (34)

  • avatar

    ja się zaśmiałem

    #piterwjuhumor

    odpowiedzi (9)