Pereiti prie turinio

DevBlox

Patvirtinti nariai
  • Pranešimai

    19
  • Užsiregistravo

  • Lankėsi

  • Atsiliepimai

    0%

DevBlox Pranešimai

  1. Kodėl rašai c++ kodą, bet naudoji c bibliotekas? Suprasčiau jei būtų konkreti ir rimta priežastis, bet dabar nematau tikslo, nes c++ bibliotekos ne ka blogesnės, tikrai patogsnės ir aiškesnės nei c bibliotekos. O dabar viskas labai maišosi, bloga praktika taip daryti, geriau palaikyti vientisumą.

  2. Kad kurti app'sus reikia tikrai neblogai išmokti pagrindų visų progamavimo, nes prasidės visokių bibliotekų naudojimas ir tt, o jei tų pagrindų neturėsi tai užsikasi.

     

    Manau gerai kad C++ renkiesi, išmoksi ir low-level ir high-level programavimo, tik gali maišytis viskas pradžioje, nes visko labai daug, kalba plati. Jei viskas maišosi per daug tai gali nuo C pradėt, nes nuo pačio žemiausio lygio pradėti gal pravers tada, nes išmokti smulkiausius dalykus yra naudingiau, išmoksti suprasti kaip viskas "po kapotu" dirba, o po to gali eiti toliau, į vis abstraktesnes kalbas (todėl ir C++ gerai, nereiks keisti kalbų ir kaip kažkas sakė kad c-style kalbos yra visur, tai jau daug mokėsi kai judėsi į kitas kalbas) jau turėamas tą supratimą. Va tuomet tai prasidės moderni kūryba :).

  3. Dėkui už išsamų atsakymą. Gal kur matėte kokių tutorial'ų panašia temą, kad būtų už ko užsikabinti?

     

    Pamislijau kiek ir manau jog geriausia būtų naudoti OpenMAX kartu su OpenGL ES (arba dar geriau su OpenVG, bet su juo neteko susidurti tai ir informacijos jokios nedrįstu pateikti), pavaizduotą lentelėje. Paguglinęs radau keletą šaltinių kuriais naudotis galėtum.

     

    Apie OpenMAX: http://ccppcoding.blogspot.com/2012/09/openmax.html

    Taip pat tame puslapyje daug naudingos info apie Linux galima rasti, visai naudingas puslapis.

     

    Dekodavimo tutorial: http://www.raspberrypi.org/forums/viewtopic.php?f=33&t=57721

    Tau tektų atlikti dekodavimą, paversti .svg į tekstūrą ir per OpenGl ES ant ekrano nupiešti, tai manau į temą čia, tik pats kodo to neskaičiau žinoma, tau teks pasinagrinėti ;)

     

    Apie OpenGL: http://www.opengl-tutorial.org/

    Tik čia ne OpenGL ES, kuris RPi ir mobiliose platformose yra naudojamas, taigi gana sunku perprasti skirtumus yra, čia yra panašiausios funkcijos į tai ką OpenGL ES naudotum, daugiausia tutorialų kuriuos buvau radęs buvo ne c++ arba nepakankamai detalūs. Nepamiršk ir niuansų su hardware acceleration.

     

    Kaip sukurti fullscreen langą gali rasti mano varikliuko void Renderer_EGL_GLESv2::init_egl_context() metode, kuris yra src/Renderer_EGL_GLESv2.cpp

     

    Ištrauka tau svarbaus kodo:

    	static EGL_DISPMANX_WINDOW_T native_window;
    
    DISPMANX_ELEMENT_HANDLE_T dispman_element;
    DISPMANX_DISPLAY_HANDLE_T dispman_display;
    DISPMANX_UPDATE_HANDLE_T dispman_update;
    VC_RECT_T dst_rect, src_rect;
    
    dst_rect.x = 0;
    dst_rect.y = 0;
    dst_rect.width = screen_w;
    dst_rect.height = screen_h;
    
    src_rect.x = 0;
    src_rect.y = 0;
    src_rect.width = screen_w << 16;
    src_rect.height = screen_h << 16;
    
    dispman_display = vc_dispmanx_display_open(0);
    dispman_update = vc_dispmanx_update_start(0);
    
    dispman_element = vc_dispmanx_element_add(dispman_update, dispman_display, 0, &dst_rect, 0, &src_rect, DISPMANX_PROTECTION_NONE, 0 , 0, DISPMANX_NO_ROTATE);
    
    native_window.element = dispman_element;
    native_window.width = screen_w;
    native_window.height = screen_h;
    vc_dispmanx_update_submit_sync(dispman_update);
    
    egl_surface = eglCreateWindowSurface(egl_display, config, &native_window, NULL);
    if (egl_surface == EGL_NO_SURFACE)
    	except->error("eglCreateWindowSurface");
    
    if (eglMakeCurrent(egl_display, egl_surface, egl_surface, context) == EGL_FALSE)
    	except->error("eglMakeCurrent");
    
    if (eglSwapInterval(egl_display, true));

     

     

     

    Na o daugiau gali arba dar tutorialą kokį rasti arba/ir dokumentacija naudotis :).

  4. Gali bandyti naudotis SDL bibliotekomis. SDL turi labai daug naudingų funkcijų, labai patogiai galima žaidimukus programuoti, nes turi gerą sąryšį su OpenGL. Šiuo atveju tau užteks SDL rendererio manau, jei gerai pamenu galima tiesiogiai įkrauti .svg failus.

     

    Yra tik vienas labai rimtas niuansas su grafika ant RPi: X desktope nėra hardware acceleration, nes X neveikia per EGL, o RPi GPU tik per EGL ir gali, todėl reikia atitinkamai programuoti per specialias bibliotekas, kad ekraną sukurti. Todėl paprastai per SDL padarius gali neveikti tiesiog, o aš pats niekad nebandžiau RPi desktope SDL rendereri naudot, tai nieko pasakyt tuo atveju negaliu. Tuomet gali tekti OpenGL naudoti, bet tada tai sudėtinga labai bus rašyti.

     

    Kadangi nesusidūręs su linuxais pasigooglink mano naudojamus pavadinumus bibliotekų ir programų, visko nepaaiškinsiu. Įkeliu darbo su RPi GPU lentelę, paprasčiau bus suprasti kaip ten visi tie API veikia. http://www.recantha.co.uk/blog/wp-content/uploads/2012/10/Architecture-and-Source-266x300.png

     

    Buvo klausimas kaip perkėlinėti failus į RPi. Galima per usb, galima per interneta (mano naudojamas variantas darbui). Darbui per internetą (tuo pačiu ir failų perkėlimui) galima naudoti remote desktop ir ssh. Ant RPi reikia įsirašyti xrdp ir is kito kompo galesi su juo dirbti. Kadangi ir kitam mano kompe yra linuxai (Debian), tai as naudoju programa Remmina, galiu naudoti ten atskirus kanalus file transfer, ssh, ir remote desktop. Dėl windows nieko patart negaliu, neteko naudot remote desktop ten.

     

    EDIT:

     

    Gali pasinagrinėti mano bandymą OpenGl pasirašyt varikliuką, gal kadanors daugiau parašysiu jo, dabar tiesiog nėra kada, egzai ant nosies. Mano nedidlelė svajonė padaryti tai neblogu open source projektu :).

     

    Gali atsisiųsti per svn: https://xp-dev.com/svn/Engine_RPi/trunk

     

    Jei neleidžia siūstis tai parašyk man AŽ arba atsakyk temoje, gal nustatymuose kažką blogai būsiu padaręs.

  5. Pavojus prarasti duomenis egzistuoja visada, tai, kad nebepalaikoma xp, nepaveiks tikrai to. Vieną kartą windowsai gali neuzsikrauti dėl disko gedimo arba nepriežiūros (greičiau jau nuo netvarkos darymo su softu). Na tavo tėvukai nemanau kad su tuo kompu daug kanors darys apart bankų, mokesčių mokėjimų, emailų ir pan. Tuomet užteks gerai sutvarkyto softo, antivirusinės ir tas xp kompas dar tiek pat laikys drąsiai jei nenusprogs silikonai nuo amžiaus.

     

    Iš esmės nepalaikomi xp reiškia: daugiau jokių update ir saugumo skylių lopymu (tik reikia atminti, jog virusus 90% įsileidžia patys vartotojai, o ne saugumo sragos, kurių net palaikomuose windowsuose yra), naujas softas nebepalaikys šių windosų (bet tavo tėvukams vistiek tokio softo nereikės, pagrindinės programos veiks kaip veikusios, o jei vis dėlto reiks - nieks netrugdo senesnę versiją susirast ir parsipūst).

     

    Tai tiek. Gal dar kokį point'ą būsių praleidęs. Tik nereikia pergyventi dėl neplaikomų windowsų, nusipiratavę windowsus irgi ramiai gyvena, o jie yra irgi nepalaikomi, neturi galimybės updatintis ir tt.

  6. Kadangi pc skirtas daugiau editinimui, tai sakyčiau verta investuoti ne į 4770k, o 4970k cpu. Jis turi smarvės multithreaded darbams. Grajų irgi nenuskriausi, o ir greitai išeis nauji grafikos API (pvz DirectX 12), tai tas cpu dar geriau pasitarnaus. To cpu socketas berods kitas, tai ir motininę kitokią reikės imti.

     

    Aušintuvas geras, dar gali pasižiūrėti Be Quiet! Shadow Rock 2 (arba 3), tie turi masyvius radiatorius, tai gali užsimesti pora galingesnių aušintuvų (pvz kurie dedasi ant jau paminėto Noctua NH-D14), manau gera kombinacija gautųsi.

  7. Linuxai man asmeniškai visiškai pakeitė Windowsus, kadangi nelabai geiminu ir nedaug dirbu su tokiom programom kaip after effects. Bet ir ant linuxu pagrajinti neblogų žaidimų galima ir pakaitalus daugeliui programų rasti nėra sunku. Todėl jei neturi rimtų priežaščių likti prie Windowsų, vien Ubuntu turėti bus tikrai pilnavertis variantas. Viskas priklauso nuo poreikių :).

     

    Jei vis dėlto planuoji dual boot darytis tai procesas labai paprastas: pirma įsirašai Windowsus, paskui Ubuntu, leidi Ubuntu perrašyti boot sektorių, o bootloaderis turėtų aptikti Windowsus automatiškai, kurią os norėsi paleisti galėsi pasirinkti užsikraunant kompiuteriui :).

  8. Antras variantas daug paprastesnis, tiesiog pasidaryk tą langa ir su mygtuko paspaudimu išsikviesk CreateWindow(); ar kažką tokio. Tik tiek galiu patart, nes jokios info nedavei, nei API nei ko panašaus ir tikiesi, kad magiškai sprendimą pateiks kasnors :D.

  9. /facepalm

     

    Dar kartą kartoju - kurioje vietoje sunku surasti klaidą su keliais konstruktoriais? Debuginimo metu next step numes į kviečiamą konstruktorių. 'Go to definition' ar pan. IDE funkcija numes į reikiamą konstruktorių. Dievaž, du tokie patys konstruktoriai negali būti, tai bent jau akytes turi ir pasižiūrėsi - aha, čia su vienu char kviečiamas konstruktorius, einam į klasės failą - aha, šitas konstruktorius su dviem char tipais, tai ar čia man reikalingas konstruktorius? GUESS NOT LOL MY DEDUCTION CAPABILITIES SAVED ME ONCE AGAIN LOL!

     

    Nevisada naudojamas kodas yra tavo kodas, todėl debuginti nevisada yra variantas, kartais tiesiog negali, būna tokių situacijų sočiai. Manau implementerio atveju explicit panaudoti ir užkirsti kelią tokioms klaidoms yra būtinybė, klientas nežinos kuom skiriasi tie konstruktoriai, jei dokumentacija ir prototipas nieko nepasakys (nors tikrai turėtų). Implementerio uždavinys visada yra rašyti funkcionalų ir paprastai naudojamą kodą. Išleisi tarkim closed source API, ir planuoji debug simbolius įkompiliuoti, kad pažiūrėtų klientas kuris konstruktorius iškviečiamas? Nemanau. Taigi prieš įžūliai atsakydamas, pagalvok apie daugiau atvejų. Kadangi programuotojas esi, pasuk smegeninę outside the box, taip pat manau žinai, kad yra daug būdų apeiti problemą, nebūtinai explicit, nebūtinai koks kitas sprendimas, tik nebūk įsitikinęs, kad surasti kuris konstruktorius iškviečiamas absoliučiai visada paprastas, nes taip tikrai nėra.

  10. Gelbėja nuo ne to konstruktoriaus iškvietimo, kurio nereikia, neleisdamas tau iškviesti to konstruktoriaus atitinkamomis sąlygomis. Manau sunkoka būtų rasti klaidą, jeigu iš dviejų panašių konstruktorių iškviestum ne tą, o tada kodas lyg ir veikia, bet lyg ir ne :).

     

    pvz.

    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Obj
    {
       public:
           explicit Obj(int a)
           {
               eilute = "int";
           }
           explicit Obj(char a)
           {
               eilute = "char";
           }
           string eilute;
    };
    
    
    int main()
    {
       Obj a = 's'; // Mes errora, bet jeigu nuimtum explicit nuo Obj(int), tai iškviestum Obj(int), nes tai būtų leidžiama.
       Obj a ('s'); // Obj(char). Šitaip iš viso geriausia inicijuoti objektus, nebus sunkiai surandamų klaidų, jei jų pasitaikys
       cout << a.eilute;
    }
    
    
    

  11. Serverių nuoma manau variantas geras. Jeigu kompanijos serveriuose taip sparčiai auga duomenys ir neįmanoma vytis patiems tai reikia galimybės plėsti serverio pajėgumą pagal poreikį, savo serverį turėdamas taip nepadarysi, nebent patinka žiūrėti kaip pinigai dideliais kiekiais eina serverių klasės hdd (paprasti desktopo hdd palūš nuo tokių apkrovų) ir cpu pirkimui, o ir hdd tokie ir Xeonai, kaip žinia nėra pigus reikalas :).

  12. Kai iškvieti fstream::open() arba fstream'o kontruktoriu kodo bloke, tai jis liks atidarytas iki pat to bloko galo, tada iškviečiamas destruktorius. Atidarydamas faila tu informuoji OS, kad failas yra naudojamas, todėl OS neleidžia su tuo failu nieko daryti niekam išskyrus tam fstream'ui, kol tas failas nėra uždaromas. Todėl visada, net kai ir nebūtina, patariu priprasti iškarto iškviesti fstream::close(), kad nebūtų tokių netyčiukų :).

  13. #include <iostream>
    
    using namespace std;
    
    const int sk = 58;
    const char A[] = {'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd',
                     'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h',
                     'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l',
                     'M', 'm', 'N', 'n', 'O', 'o', 'P', 'p',
                     'Q', 'q', 'R', 'r', 'S', 's', 'T', 't',
                     'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x',
                     'Y', 'y', 'Z', 'z'};
    const char B[] = {'E', 'e', 'F', 'f', 'G', 'g', 'H', 'h',
                     'I', 'i', 'J', 'j', 'K', 'k', 'L', 'l',
                     'M', 'm', 'N', 'n', 'A', 'a', 'B', 'b',
                     'C', 'c', 'D', 'd', 'S', 's', 'T', 't',
                     'U', 'u', 'V', 'v', 'W', 'w', 'X', 'x',
                     'Y', 'y', 'Z', 'z', 'O', 'o', 'P', 'p',
                     'Q', 'q', 'R', 'r'};
    
    void Sifruoti(char *seka)
    {
       int simboliu_skaicius = 0;
       while (seka[simboliu_skaicius] != '\0') simboliu_skaicius++;
    
       for (int i = 0; i < simboliu_skaicius; i++)
       {
           for (int j = 0; j < sk; j++)
           {
               if (seka[i] == A[j]) {seka[i] = B[j]; break;};
           }
       }
    }
    
    void IsSifruoti(char *seka)
    {
       int simboliu_skaicius = 0;
       while (seka[simboliu_skaicius] != '\0') simboliu_skaicius++;
    
       for (int i = 0; i < simboliu_skaicius; i++)
       {
           for (int j = 0; j < sk; j++)
           {
               if (seka[i] == B[j]) {seka[i] = A[j]; break;};
           }
       }
    }
    
    int main()
    {
       char seka[] = "Pasikiskiakopusteliaudamasis";
       cout << seka << endl;
       Sifruoti(seka);
       cout << seka << endl;
       IsSifruoti(seka);
       cout << seka << endl;
       return 0;
    }
    

     

    Čia pats paprasčiausias variantas turbūt, bet kas nulaužtų, bet principas toks. Yra žymiai sudetingesnių būdų, ypač saugūs tie, kur bankuose naudoja :).

×
×
  • Pasirinkite naujai kuriamo turinio tipą...