játékfejlesztés.hu
FórumGarázsprojectekCikkekSegédletekJf.hu versenyekKapcsolatokEgyebek
Legaktívabb fórumozók:
Asylum:    5440
FZoli:    4892
Kuz:    4455
gaborlabor:    4449
kicsy:    4304
TPG:    3402
monostoria:    3284
DMG:    3172
HomeGnome:    2919
Matzi:    2519

Pretender:    2498
szeki:    2440
Seeting:    2306
Geri:    2186
Orphy:    1893
Joga:    1791
Bacce:    1783
MaNiAc:    1735
ddbwo:    1625
syam:    1491
Frissebbek | Korábbi postok
[1] [2] > 3 < [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] [30] [35] [40] [45] [46]
Viperion - Tag | 540 hsz       Online status #200116   2014.01.01 02:22 GMT+1 óra  
Mi az ami unmanaged ezt nem tudom.
Itt arra gondolsz,hogy egy managed objektumnak(milyen egy nem managed objektum? ) ha van txt dokumentumra hivatkozó referenciája akkor ezt a fájl már nekem kell törölni?

Nem értem.

Milyen egy unmanaged objekt és hogy lehet managed objektnek unmanaged függősége?



Azt sem értem.
Miért van szükség erre a függvényhívásra abban az esetben ha csinálok egy destruktort?
GC.SuppressFinalize(this);
Azért mert ha lefuttatod a Dispose függvént,akkor már nincs szükség arra a destruktorra amit te írtál ugye?

De a háttérben valamilyen destruktornak akkor is meg kell hívódnia,hogy törölje azt amire már nincs érvényes referencia nem?

Ezt a hozzászólást Viperion módosította (2014.01.01 02:37 GMT+1 óra, ---)

   
Parallax - Tag | 574 hsz       Online status #200111   2013.12.31 20:42 GMT+1 óra  
Igazi destruktor nincs C#-ban. Igazából mivel minden törlődik automatikusan így nem is lenne értelme destruktorozni,

Unmanaged környezetben viszont fontos tudni, hogy adott objektum mikor szűnik meg, mert a függőségeit is meg kell szüntetni, azok maguktól nem szűnnek meg, ha már nem hivatkozik rájuk senki.

Managed környezetben a dispose azért kell, mert előfordul, hogy van egy managed objektumnak unmanaged függősége és azt valahogy meg kell szüntetni, mivel ez már nem a .NET hatókörébe tartozik. Ehhez az ún. dispose patter-t szoktam használni. Ennek lényege kettős. Egyrészt direktben lehet hívni az objektumon a Dispose()-t ami meghívja az unmanaged rész törlését és megjelöli szemétnek a managed objektumot, másrészt, ha ezt elfelejtem, akkor van egy védelem, ami az objektum megszűnésekor aktivizálja a megfelelő unmanaged rész törlését, ez a "destruktor".

Kód:
sealed class MyObject : IDisposable
{
    bool disposed = false;

    ~MyObject()
    {
        Console.WriteLine("Finalize.MyObject");
        CleanUp(false);
    }

    void CleanUp(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                //felügyelt erőforrások takarítása
            }

            //nem felügyelt erőforrások takarítása
        }

        disposed = true;
    }

    public void Dispose()
    {
        CleanUp(true);
        GC.SuppressFinalize(this);
    }
}
.

   
Viperion - Tag | 540 hsz       Online status #200110   2013.12.31 19:50 GMT+1 óra  
Parallax így már szuperül értem. :-)
C# ben mennyire gyakran írtok destruktort vagy valósítjátok meg az IDispossable interfrészt?
És a managed és az unmanaged erőforrások közt mi a külömbség.

Ezt a hozzászólást Viperion módosította (2013.12.31 19:57 GMT+1 óra, ---)

   
Parallax - Tag | 574 hsz       Online status #200064   2013.12.29 15:33 GMT+1 óra  
Viperion, megpróbálom röviden:
Kovariancia: nem más, mint a konvertálhatóság, vagyis, adott kifejezés akkor kovariáns, ha az adott típus helyébe be lehet helyettesíteni annak a típusnak a leszármazottját

Kontravariancia: pont az ellentéte a kovarianciának, vagyis az adott kifejezés akkor kontravariáns, ha adott típus helyébe be lehet helyettesíteni annak ősét.

Én mondjuk már azon is elfilóznék, hogy egyáltalán egy script nyelvnél van e értelme statikusan tipizálni, mert ilyen célokra inkább a lua-t, vagy javascript-et szokták használni és akkor nem magával a nyelvi elemekkel kell küzdeni, hanem a magasabb szintű script feladatokkal lehet foglalkozni.

   
Tunyu - Tag | 444 hsz       Online status #200040   2013.12.26 18:49 GMT+1 óra  
Viperion ne haragudj , de szerintem te olyan ember lehetsz mint a Csodabogár című filmben John Travolta akit játsz ha első olvasatra mindent megértesz egy programozásról írt szakkönyvben ami valószínűleg elég szárazan írja le a dolgokat. Ha ilyen ember vagy akkor viszont nagyon irigyellek!

   
Viperion - Tag | 540 hsz       Online status #200039   2013.12.26 17:56 GMT+1 óra  
Nemértelek Pretender.
Egyébként próbálgatom de nem veszem észre a külömbséget a sima és az out,in közt.

   
Pretender - Törzstag | 2498 hsz       Online status #200038   2013.12.26 17:41 GMT+1 óra  
Ilyen ez, ha az ember segíteni akar... :/

   
Viperion - Tag | 540 hsz       Online status #200037   2013.12.26 17:32 GMT+1 óra  
Tunyu
Viperion szerintem ezt így nem fogod megérteni,nem véletlenül jártak / járnak évekig egyetemre.

Szerintem nagyon eltúlzod amit írtál.Én már túl vagyok 2 nagy c++ szakkönyvön úgy,hogy minden benne leírtat megértettem és alkalmazni is tudom és nem kellett hozzá egyetem.

De ebben a c# nyelvben vannak olyan nyelvi fogalmak amikre nem találok könnyen érthető magyarázatot.

Ennyi az egész nem kell ezt eltúlozni.Én csak egyszerűem nem értem azt a pár dolgot amit lentebb írtam.És ahhoz hogy ezt megértsem nem kell hozzá egyetem meg évek sem.
Inkább segítsetek.Ha ti értitek ezt akkor inkább elmagyarázni próbáljátok ne pedig lebeszélni róla.


   
Pretender - Törzstag | 2498 hsz       Online status #200035   2013.12.26 15:38 GMT+1 óra  
Mellesleg szerintem jól bevált taktika, hogy próbálgatod... Kit érdekel, hogy hogy működik legbelül, ha tudod, hogy mire kell / lehet használni. De szerintem sem érdemes foglalkozni ilyenekkel addig, amíg nem jön elő. És jó eséllyel nem is fog.

   
Tunyu - Tag | 444 hsz       Online status #200032   2013.12.26 15:10 GMT+1 óra  
Viperion szerintem ezt így nem fogod megérteni,nem véletlenül jártak / járnak évekig egyetemre. Itt szerintem több olyan dologgal kéne tisztában lenned amit se általános se középiskolában nem sajátítasz el túlzottan nagy mértékben.Legalább is én nem emlékszem hogy nagyon sokat foglalkoztunk volna statisztikai vagy valószínűség számítással.De egyébként sem hiszem hogy valaha is írnál olyan scriptet amihez ilyesfajta számítás szükséges és ezt a lehető legjobb indulatból írom. Felesleges olyan dolgon agyalnod aminek soha nem fogod hasznát venni.

   
Viperion - Tag | 540 hsz       Online status #200030   2013.12.26 13:54 GMT+1 óra  
Nem értem.
Elmagyarázná valaki hozzáértő. Pls.

   
Pretender - Törzstag | 2498 hsz       Online status #200029   2013.12.26 13:45 GMT+1 óra  
Google első találat a kovarianciára

   
Viperion - Tag | 540 hsz       Online status #200028   2013.12.26 13:33 GMT+1 óra  
Parallax a te magyarázatodat nem értem mert nem találom a kovariáns és kontravariáns szavak jelentését sehol.

Szerintem érthetőbben is meg lehete fogalmazni azt amit leírtál.

:-)

   
Viperion - Tag | 540 hsz       Online status #200027   2013.12.26 13:33 GMT+1 óra  
Parallax a te magyarázatodat nem értem mert nem találom a kovariáns és kontravariáns szavak jelentését sehol.

Szerintem érthetőbben is meg lehete fogalmazni azt amit leírtál.

:-)

   
Parallax - Tag | 574 hsz       Online status #199985   2013.12.19 11:29 GMT+1 óra  
Értem, akkor tessék:
public delegate TResult myDel<out T1,TResult>(T1 obj);
T1 típus kovariánssá tétele

public delegate TResult myDel<ref T1,TResult>(T1 obj);
ilyen nincs

public delegate TResult myDel<in T1,TResult>(T1 obj);
T1 típus kontravariánssá tétele


   
Viperion - Tag | 540 hsz       Online status #199972   2013.12.18 19:03 GMT+1 óra  
Idézet

Jó, de most ha megkérdezem mi az class, meg interface azt, hogyan válaszolod meg egy mondattal?

Interfészek metódusok és property-k implementálását írhatja elő az őket megvalósító osztályoknak.Ez teljesen érthető.
A class az egy új típus definíciója.Ez is érthető és rövid voltam.:-)

   
Parallax - Tag | 574 hsz       Online status #199968   2013.12.18 17:48 GMT+1 óra  
Idézet
Viperion :
Azért mert vagy megtanulok rendesen valamit vagy sehogy.
Képzeld el hogy pl mondtad valakinek,hogy programozol c# ben már egy jó ideje aztán ha rákérdez egy bizonyos dologra ami a c# ről szól aztán nem tudod megválaszolni neki.


Jó, de most ha megkérdezem mi az class, meg interface azt, hogyan válaszolod meg egy mondattal? Ilyen mélyebb elméleti kérdéshez inkább csak az utat lehet és érdemes megmutatni. Amúgy eddig nekem még éles céges munka során nem jött elő az in meg out a generikusoknál valószínűleg nem lesz annak se álmatlan éjszakája, aki egy unity script-hez ezt még nem tudja.

   
Matzi - Szerkesztő | 2519 hsz       Online status #199962   2013.12.18 16:14 GMT+1 óra  
Viperion:
Ez egy teljesen természetes dolog. Senki sem tud mindent. Pláne hogy a programnyelvek nem csak hogy bonyolultak, de még folyamatosan fejlődnek is, így nem lehet elvárás, hogy minden apró nüansszal előre tisztában legyél.

Ahogy az ősi kínai közmondás is tartja:
"Ezt a hidat majd csak akkor gyújtjuk fel, ha majd odaértünk."
Vagy ilyesmi.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
   
Viperion - Tag | 540 hsz       Online status #199960   2013.12.18 15:49 GMT+1 óra  
Azért mert vagy megtanulok rendesen valamit vagy sehogy.
Képzeld el hogy pl mondtad valakinek,hogy programozol c# ben már egy jó ideje aztán ha rákérdez egy bizonyos dologra ami a c# ről szól aztán nem tudod megválaszolni neki.

   
Parallax - Tag | 574 hsz       Online status #199956   2013.12.17 23:13 GMT+1 óra  
Olyan dolgokat feszegetsz, amit nem lehet egy félmondattal elintézni. Megint felmerül a kérdés, hogy miért kell ez neked?

   
Viperion - Tag | 540 hsz       Online status #199954   2013.12.17 20:27 GMT+1 óra  
Nem értem Parallax.
Nekem nem több oldalas irományokra van szükségem hanem egy jól megfogalmazott válaszra,hogy mik ezek a módosítók a sablonparaméterekben: in, out, ref.
De amúgy kösz a linket.Átnéztem de túl van ott bonyolítva az egész.

Ezt a hozzászólást Viperion módosította (2013.12.17 20:42 GMT+1 óra, ---)

   
Parallax - Tag | 574 hsz       Online status #199946   2013.12.17 10:46 GMT+1 óra  
Ez talán megvilágít 1-2 dolgot.

   
Viperion - Tag | 540 hsz       Online status #199904   2013.12.14 20:35 GMT+1 óra  
Eltudná magyarázni nekem valaki,hogy ha ezeket a kulcsszavakat ha generikusokban használom akkor mit jelentenek mire jók mivel lesz másabb ha használom ezeket a kulcsszavakat a sablon paraméterekben.
Például:
public delegate TResult myDel<T1,TResult>(T1 obj); Ez a normális.

Ezek pedig mivel külömböznek tőle?
public delegate TResult myDel<out T1,TResult>(T1 obj);
public delegate TResult myDel<ref T1,TResult>(T1 obj);
public delegate TResult myDel<in T1,TResult>(T1 obj);

   
Viperion - Tag | 540 hsz       Online status #199719   2013.12.04 10:20 GMT+1 óra  
Csak érdekelt,hogy lehetséges e megcsinálni.
De utánnanéztem és nem lehet.

   
Parallax - Tag | 574 hsz       Online status #199715   2013.12.04 09:49 GMT+1 óra  
Ilyet még C++ nál se lehet, talán nem véletlenül. De ha már felhoztad neked ez mire is kell?

   
Viperion - Tag | 540 hsz       Online status #199713   2013.12.04 08:44 GMT+1 óra  
Nem találok rá példát.
A feltételes operatort ami három operandús azt,hogyan kell túlterhelni?
Public static string operator ? ()

Rájöttem nem lehet.

   
Parallax - Tag | 574 hsz       Online status #199700   2013.12.03 10:39 GMT+1 óra  
Viperion - Tag | 540 hsz       Online status #199699   2013.12.03 10:28 GMT+1 óra  
Az,hogyan lehet,hogy az indexbe egy stringet adnak meg és nem számot?Ugy tudtam,hogy oda csak numerikus értékek kerülhetnek.
Példa:
http://docs.unity3d.com/Documentation/ScriptReference/Animation.Index_operator.html
Nem értem,hogy hogyan van ez megvalósítva mert ha rámegyek az Animation típusra és leglent az operátoroknál nem látok olyan indexelő operátort ami stringet várna.
Hogyan van ez?

   
Pixi - Tag | 205 hsz       Online status #199222   2013.11.18 12:08 GMT+1 óra  
Találtam egy nagyon egyszerűen használható "NetworksApi.dll"-t. Szó szerint üzenetet kell küldeni, a Server oldalon használva a "using NetworksApi.TCP.SERVER;"-t, Kliens oldalon pedig a "using NetworksApi.TCP.CLIENT;"-t. Már csak arról nem találok semmi infót, hogy kell-e hozzá külön licensz (ha 1x komolyabban fel szeretném majd használni):

A kész sablon Server/Client projekt (mivel az nem volt feltöltve készen):
Networking_Chat_Example.zip

Videó ezekről:
Kliens: C# Multi Threaded Networks Api Library Client Implementation Tutorial
Szerver: C# Multi Threaded Networks Api Library Server Implementation Tutorial

Az API forrása:
C# Networks Api Library

Ha valaki tud bármit is arról, hogy ingyenes-e vagy sem, az jelezzen felém.

   
Parallax - Tag | 574 hsz       Online status #199176   2013.11.16 18:30 GMT+1 óra  
Idézet
Viperion :
Es igaz az,hogy a statikus osztalyok nem lehetnek bazis es gyerek osztalyok?


Gyakorlatilag egyik következik a másikból. Ha a statikus osztály őse lenne mondjuk egy másik statikus osztály, akkor lehetne örökölni tulajdonképpen a semmit, mert példányt úgyse lehet belőlük létrehozni. Ha pedig nem statikus az ős, akkor meg méginkább értelmetlen lenne az egész.

   
Pixi - Tag | 205 hsz       Online status #199170   2013.11.16 17:55 GMT+1 óra  
Matzi:
Köszönöm a kimerítő választ és a linkeket is Hát így elolvasva az írásod eléggé összetettnek tűnik a dolog egyelőre (nekem), szóval majd ezzel is szép lassan haladok mint minden mással. A linkeknek köszönhetően, ami így hirtelen ránézésre nekem hasznosnak tűnik, talán ez:

C# Tutorial - Simple Threaded TCP Server

Még annyit szeretnek tudni, hogy mit gondoltok a lidgren network-ról? Miért jó ez? Valaki próbálta már?

lidgren network gen3

Ez egy egyszerűsített forma az üzenetek küldésére és fogadására? Természetesen kipróbálgatom ezeket a sablonokat, csak szeretném tudni meg éri-e foglalkozni vele.

   
Viperion - Tag | 540 hsz       Online status #199134   2013.11.15 16:35 GMT+1 óra  
Bocs az ekezetekert maserol irok es nem tudom hogyan kell ekezeteket irni.
Igen koszi a valaszodat.
Engem az erdekelne a leginkabb,hogy ez,hogyan valosul meg a hatterben a static konstruktor.

Es igaz az,hogy a statikus osztalyok nem lehetnek bazis es gyerek osztalyok?

   
Matzi - Szerkesztő | 2519 hsz       Online status #199124   2013.11.15 13:34 GMT+1 óra  
Viperion:
A statikus konstruktor egyszer fut le, és nem is kell többször lefusson. Nem az a célja. Ha ilyet szeretnél, akkor minden funkcionalitást rakj be egy statikus függvénybe, és azt hívd meg a statikus konstruktorból is és onnan is ahonnan még akarod. Az nem egy valódi konstruktor, ne próbáld úgy kezelni.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
   
Viperion - Tag | 540 hsz       Online status #199116   2013.11.15 04:59 GMT+1 óra  
Kössz a segítséget már értem.
De lenne még 2 kérdésem amire szerintem tudom a választ de megerősítésre van szükségem tapasztaltabbaktól.

Egyik dolog:
A statikus osztályok nem örökölhetnek adatokat más osztályoktól kivéve System.Object-ből és más nem statikus osztályok sem örökölhetnek adatokat a statikus osztályoktól.Ezt jól mondtam?

Másik dolog:
A statikus konstruktor nem része az osztálynak ugye?

A this-el nem tudtam meghívni azt.
Példa:
Kód:
using System;

class A {
    static void Main()
    {
        System.Console.WriteLine(B.i);
    }
}

public class B {
    public static readonly B b = new B(10);
    public static int i;
   
    static B()
    { i=5; }
   
    B(int s): this() // Itt a hiba(nem hívja meg a static konstruktort).
    {i+=s;}
}


A hibaüzenet az,hogy nem talál olyan konstruktort ami nem várna egy paramétert sem.
Akkor a statikus konstruktor nem része az osztálynak?Ha igen,akkor hogyan működik ez valójában?

A static konstruktor csak egyszer fut le a legelején legelső konstruktorként.
Később miért nem tudom meghívni ezt a static konstruktort úgy mint pl. egy privátot?

Ha nem része az osztálynak,akkor minek a része?
Ha pedig az osztály része,akkor miért nem tudom azt meghívni még egyszer?

Köszi szépen a segítségeket.

   
Matzi - Szerkesztő | 2519 hsz       Online status #199060   2013.11.13 10:46 GMT+1 óra  
A nullable egy olyan struktúra, ami a becsomagolt értékén túl tartalmaz egy flaget arra vonatkozóan, hogy null e. Ennek akkor van szerepe, ha valamilyen különleges esetben nem tudod megoldani, hogy egy értéktartományt külön kezelj. Például egy dátum típus ha jól rémlik nem lehet null, így viszont tudod jelezni, hogy az értéke lényegtelen. Vagy ha van egy számod, akkor annak is minden értéke érvényes, de így jelezheted, hogy ez mégsem.

Pixi:
No, a peer-to-peer megoldásnak van pár komoly korlátja. Például sosem lehet az összes gép állapota azonos, gyakorlatilag kizárt a teljes szinkron, szóval erőteljesen dolgoznod kell azon, hogy ez ne okozzon gondot. Meg ha kiesik egy node, akkor mindegyiknek detektálnia kell, illetve bárki nyugodtan csalhat, mert nem tudod felügyelni rendesen. Persze megoldható, de rettentő sok munka. Ráadásul peer-to-peer esetén mindenkinek kell legyen forwardolt portja ha router mögött van, különben két ilyen rejtőzködő játékos között sosem jön létre kapcsolat.

Ha meg tudod oldani, akkor sokkal egyszerűbb a szerver, ami mondjuk nagyobb teljesítményt és sávszélet igényel.

A külön szálon futtatásra vannak egyéb tutorialok, mert az teljesen más téma. Amúgy ez az egyik gyengesége a TCP-nek, hogy blokkol, szóval külön szálon kell futtatni gyakorlatilag az összes adatfogadást és küldést. Meg persze a streameléssel is lehetnek gondok, illetve könnyen elévülhet az adat, mire megkapod. Ennek ellenére lehet használni, vannak játékok, amik csak TCP-t használnak, de az UDP némileg fájdalommentesebb. Vagyis annak is vannak trükkjei, de talán kicsit könnyebben kezelhetőek.

TCP-nél amúgy külön futni kell egy kört, szóval a csatlakozás úgy megy, hogy egy ismert portra csatlakozol, és utána elkéred hogy hová tudsz csatlakozni rendesen, onnantól az eredetit bontod, amit meg megkaptál használhatod akármeddig. Csak ugye minden portot ki kell forwardolni, amin kommunikációt szeretnél fogadni, ami egy szervernél nem olyan fájó, de p2p esetben akadnak ezzel problémák.

Az üzenetküldősdi meg úgy van, hogy van két postafiókod, egy kimenő és egy bemenő (mindez persze minden aktív kapcsolatra). A worker threadek szépen feldolgozzák a bemenőt, és aszinkron fogadod a bejövő és küldöd a kimenő üzeneteket mindenfelé. Innentől mindent neked kell megcsinálnod. Tipikusan lesz valami sajátos protokollod, amiben megmondod mi mit jelent. Pl egy üzenet struktúra, id-vel, és azzal, hogy mit csináljon. C#ban amúgy van elvileg lehetőség RPC-re, de az elég veszélyes, és lassúcska is. Illetve lehet szerializálni automatikusan, ami kissé bőbeszédű lesz, de legalább tuti működik. Ez alatt értsd, hogy egy 50 byteos structból bármikor generál neked 250byteos csomagot, ami sokat ront a kommunikáció sebességén. Jobban jársz, ha magadnak optimalizálod, legalábbis amikor már a sebesség a kérdés, addig jó az automatikus is.

No szóval lesz egy struktúrád, valami amivel le tudod írni, hogy mit szeretnél. Például: akció kód (pl: mozgass egységet), azonosítók (pl: mi az egység id-ja), meg egyéb paraméterek (pl honnan hová), ezen felül idő bélyegek (pl ha két másodperce küldted el a csomagot, az egység a másik gépen már rég elindult, ezért korrigálni kell a pozícióját). A legtöbbször lehet inkrementálisan küldeni az adatokat (pl: az egység elindult vagy megállt), de időről időre érdemes teljes szinkront is bevetni (pl: az egység pont itt van), különben elmásznak a gépeken az állapotok az időbeli eltolódások miatt.

Ez az általam látott eddigi egyik legjobb tutorial és magyarázat a témában. Igaz nem C#, de az elmélet jó benne.
Egy kis C# multithreading. (Csak átfutottam, de kb jónak tűnik.)
Stackoverflow kérdés és válaszok a témában.

Remélem sikerül elindulnod.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
   
Parallax - Tag | 574 hsz       Online status #199049   2013.11.13 07:40 GMT+1 óra  
@Viperion: A nullable adatbázis kezeléshez való, mert ott lehet null egy szám is. Nem hiszem, hogy játéknál ennek van különösebb jelentősége az meg, hogy pontosan hogy működik a háttérben nem tudom mire kell neked. Ilyen mélyen egy scripteléshez szerintem fölösleges beleásni magad, inkább az erős alapokkal legyél tisztában.

   
Pixi - Tag | 205 hsz       Online status #199042   2013.11.12 21:43 GMT+1 óra  
Hali mindenkinek.

Kicsit belemélyedtem a hálózatkezelésbe. Fogalmam sincs, hogy nekem melyik lenne a legideálisabb és legkönnyebb megoldás/módszer. Igazából valamilyen szinten valós idejű adatátvitelre lenne szükségem, mivel kisebb 2D-s alapú játékhoz szeretném használni majd. Ezt még nem tudom előre hogyan fog kinézni, lehet hogy több player is játszhat benne (de ebben az esetben max olyan 10), vagy pedig egy szimpla 2-4 személyes mód lesz benne (talán ez a biztosabb).

Amit tudok biztosan (elméletben):

-nem high FPS-vel kell kommunikáljanak a kliensek egymással és/vagy a szerverrel
-az adatfrissítést/átvitelt mádospercenként elég lenne 5-10x elvégezni
-az üresjáratokat (amikor éppen nincs frissítés/adatátvitel) kliens oldalról vezérelném, tehát pl. ha valaki halad X koordinátán egy bizonyos tempóval, akkor 5 FPS-nél nem akadozva mutatná azt, hanem ha a kliensnél az volt az utolsó adat pl, hogy halad X-en 3F-el azzal a meghatározott képkockákkal + még ami statikusan meg van határozva, akkor a következő frissítésig ezt látja a kliens, hogyismondjam offline vezérelné azt az objektumot a saját programjában, és igy az összes kliens ezt tenné, és 5-10x küldene és kérne le adatot.

Nem tudom ezt mások hogyan szokták megoldani, és hogy az általam felvázolt módszer marhaságnak minősül-e, vagy pedig van valami haszna egyáltalán (sávszélesség kímélés céljából és hogy többen tudjanak kommunikálni a ritkább frissítési rátának köszönhetően).

Amit nem tudok, hogy pontosan mit és hogyan használjak, egyáltalán elég-e nekem a PeerToPeer (a mindenki mindenkinek egyenrangúan küld adatot módszer) vagy jobb a SzerverKliens? Eddig ezt az 1 darab példát tudtam úgy ahogy értelmezni és elsajátítani:

Kommunikáció TCP/IP-n keresztül

A legfőbb problémám ezzel, amikor ez a rész van, hogy:

"Indítás után, ha meghívjuk az AcceptSocket függvényt, akkor ezzel a programunk futása felfüggesztésre kerül, amíg nem érkezik kapcsolatfelvétel az adott porton keresztül. Ezért célszerűbb ilyen esetben egy külön szálon futtatni a TCP port figyelését és kiszolgálást, hogy alkalmazásunkat a felhasználó ettől függetlenül is használhassa."

1. Hogyan tudom én ezt külön szálon futtatni?

2. Egyidőben nem tudnak többen csatlakozni egy porthoz ez ok. Ezt eddig úgy tudtam megoldani, hogy a kliens minden pillanatban amikor csatlakozni szeretne új csatlakozást létesít és indít a szerverrel, megkapja a szükséges adatot Byte formában (ezt utána átalakítja), majd bezárja a csatlakozást. Ez így szép és jó, csak hát barbár megoldás gondolom, hogy mindig "ki-be" járkálni egy ajtón.

3. Maga az üzenet/adat felhasználása, vagyis ez az egész hálózatosdi rendszer tényleges felhasználása az elemeknél/objektumoknál. Hogy is van ez?

Én eddig ezt tudtam megcsinálni:
Van a szerver és a kliens. Mindkét oldalon van egy darab statikus label1, semmi több. A Form bal felső sarkában vannak startban. A kliens az egyszerűség kedvéért nem küld a label állapotáról semmit, csak fogad üzenetet a szervertől. A szerveren azt csinálja a program, hogy a label1 halad X koordinátán jobbra, majd ha eléri a Form szélét, akkor visszaugrik 0-ra. A szerver is és a kliens is használ az egyszerűség kedvéért most egy-egy Timer-t, ez tickel 100-as intervallumon (A fenti probléma adott, hogy nem külön szálon fut a port figyelése, ezért legalább egy darab kliens applikációt meg kell nyissak). Ezután ha kap lekérést a klienstől elküldi neki a label1 X koordinátáját üzenetben mint Byte. A kliens ezután a fent említett barbár módon mikor megkapta az adatot, azt átalakítja majd átadja a label1-nek mint X pozíció, majd ugyanezt az értéket átadja mint label1.Text. Ez így szépen működik, de édeskevés a boldogsághoz.

A kérdésem eléggé tág...ezen infók tudatában ti mit ajánlanátok a fent említett igényeknek megfelelően, és hogy lehetőleg könnyű is legyen megérteni/elsajátítani? Ez kicsit hosszúra sikeredett. Természetesen ha ez így 1x összejön, akkor XNA/MonoGame-ban szeretném alkalmazni.

   
Viperion - Tag | 540 hsz       Online status #199041   2013.11.12 20:56 GMT+1 óra  
pretender így már értem.
Egyébként tisztában vagyok az interface-kkel meg a többivel csak pár dolgot nem értek.
Ja igen még nem szoktam érteni a szándékosan csavaros magyarázatokat sem.

Már csak azt nem értem,hogy a nullable típus ami egy struct(értéktípus) miért lehet null.
Ha jól tudom,akkor az érték típusok nem lehetnek null-ok.

De viszont a nullable ami egy struktúra igen.
Miért?

int? i = null; Ez miért működik miért rendelhető hozzá a null ha a struct egy érték típus?

Szerintem:
Van neki egy olyan operator= metódusa ami bemenő paraméterként egy referenciát vár?Ez a megoldás?Vagy hogy van ez?

   
Parallax - Tag | 574 hsz       Online status #199033   2013.11.12 13:04 GMT+1 óra  
Idézet
Viperion :
A property-t értem már.

De ezt nem értem még mindig.
Nem lehetne még egyszerűbben?

"A T típus megszorítására szolgál."
Ennek semmi értelme.Mi az,hogy megszorítnai egy típust?


A típusok puhányok, addig kell szorongatni őket, amíg el nem kékülnek, vagy zöldülnek attól függően, hogy értékesek, vagy csak referálnak.
Egyébként itt érdemes szétnézni van sok okosság: C# pdf és videók

   
Pretender - Törzstag | 2498 hsz       Online status #199024   2013.11.12 06:03 GMT+1 óra  
Az a lényeg, ha azt mondod ott a T-re, hogy "where T : IComparable", akkor a T típus helyére nem írhatsz be olyan típust, ami nem valósítja meg az IComparable interfészt. Ennél egyszerűbben nem lehet elmondani... Tisztában kell lenni néhány alapfogalommal, pl. mi az, hogy típus, öröklés, interface megvalósítása, stb.

   
Viperion - Tag | 540 hsz       Online status #199020   2013.11.11 21:27 GMT+1 óra  
A property-t értem már.

De ezt nem értem még mindig.
Nem lehetne még egyszerűbben?

"A T típus megszorítására szolgál."
Ennek semmi értelme.Mi az,hogy megszorítnai egy típust?

Ezt a hozzászólást Viperion módosította (2013.11.11 21:33 GMT+1 óra, ---)

   
Pretender - Törzstag | 2498 hsz       Online status #199012   2013.11.11 05:50 GMT+1 óra  
A where egy minimális angol tudással és hozzáértéssel pedig kitalálható... A T típus megszorítására szolgál. Annyit mond, hogy a Stack olyan típusú elemeket tárol, amik IComparable-k (pontosabban ezt az interfészt megvalósítják).

A property meg lehet getter, vagy getter és setter. Nagyjából csak annyi, mintha lenne egy függvényed, amivel le tudod kérni az értékét / tudod módosítani. Annyival több a getter-setter property, mintha public lenne a változó, hogy (mivel a függvényekhez hasonlít a viselkedése) egyéb utasításokat is végre tudsz hajtani előtte.

Keress példákat a neten, rengeteg van, abból jól meg lehet érteni ezeket.

   
Viperion - Tag | 540 hsz       Online status #199011   2013.11.11 04:48 GMT+1 óra  
Eltudná nekem valaki hozzáértő magyarázni azt,hogy a "where" kulcsszót mire használják c# ben?
És azt is,hogy a propetyk azok micsodák?

Ebből nem sikerült megértenem,hogy mire van a where:
Alapértelmezésben a generic server kódjában csak az Object típuson való metódusok és property-k engedélyezettek. Ha más metódusokat is szeretnénk használni, akkor a generic fejlécében jeleznünk kell, hogy a paraméter típusnak milyen osztály vagy leszármazottja, esetleg milyen interfészek felelnek meg, ezt a where kulcsszó segítségével tehetjük meg.

pl: public class Stack<T> where T : IComparable

----
Ebből pedig az nem sikerült,hogy mi az a property:
A 'Property' egy komponens névvel ellátott értéke. Például, egy gomb rendelkezhet a „text” property-vel, ami a megjelenítendő szövegre utal.


Egyszerűbben megtudnátok őket fogalmazni?

   
Matzi - Szerkesztő | 2519 hsz       Online status #198729   2013.11.01 10:31 GMT+1 óra  
Olvasnivaló, avagy a string miért immutable.
Nem olyan nehéz megérteni. Referencia típus, mivel osztály, de írásvédett, mert az hasznos.
If your game idea starts with the story it’s not a game idea.
Stories in games are optional.
   
Pretender - Törzstag | 2498 hsz       Online status #198726   2013.11.01 08:24 GMT+1 óra  
Miért olyan nagy pain in the ass ez? Ha paraméterként kell átadni, és nem akarod, hogy copyzza, akkor megjelölöd referenciaként: (úgy rémlik, hogy lehet ilyet )
Kód:
void foo(ref string str);

   
Viperion - Tag | 540 hsz       Online status #198724   2013.10.31 19:31 GMT+1 óra  
m4 ha úgy van ahogy írtad akkor a string nem is referencia típus.
És mégis annak nevezik.Kezdem felhúzni magamat ezen.

Pretender:
Az érték szerintieknél az hiszem mindig copy constructor vagy ahhoz hasonló van mert egy másolatot mindenképp létre kell hozni ahhoz,hogy bele lehessen rakni az valamibe.
Úgyhogy ha a stringnél és az Object típusnál másoló konstruktor van ami egy másolatot ad vissza méghozzá az értékről az nem mondható ref típusnak.

Úgy,hogy hiába a bedobozolás is mert nem tudom másképp kezelni őt mint egy érték típust.
Csak class oknál működött nekem eddig többit még nem próbáltam az Object és a Stringen kívül.

Ezt a hozzászólást Viperion módosította (2013.10.31 20:21 GMT+1 óra, ---)

   
Pretender - Törzstag | 2498 hsz       Online status #198723   2013.10.31 19:22 GMT+1 óra  
Gondolom c#ban is van valamiféle copy-constructor. Gondolom a String a kevés olyan osztályok közé tartozik, amikor ha azt mondod, hogy a = b, akkor nem csak rámutat, hanem lemásolja az eddig b-ben lévő string tartalmát. De amúgy fogalmam sincs.
Itt beszélgetnek róla.

   
Viperion - Tag | 540 hsz       Online status #198720   2013.10.31 18:41 GMT+1 óra  
Ezt nem értem.
Ha a stringek referencia típúsok,akkor ebben az esetben:
string s1 = "QJ", s2 = "PL";
s1 = s2; //Ha referencia típús,akkor itt s1 nek ugyanarra a memóriaterületre kellene,hogy mutasson mint az s2.De nem ez történik,akkor most miért van az,hogy a stringet referencia típúsnak nevezik?
Akkor most mi a külömbség a érték típúsok és a referencia típúsok között?

   
M4 - Tag | 187 hsz       Online status #198701   2013.10.31 09:58 GMT+1 óra  
"most s1 nek arra a memóriaterületre kell,hogy mutasson amire s2 is mutat"
Nem, hanem a "ppppp" string memóriaterületére. A stringek amúgy sem változnak (az értékek), mert immutable-ek (megváltoztathatatlanok) javaban legalábbis. Szóval nem is lehetne gond ebből.
A "ppppp" azt jelenti, hogy létrejön egy string objektum ezzel az értékkel. És értékadáskor ennek a címét kapja meg az s1.

   
Viperion - Tag | 540 hsz       Online status #198696   2013.10.31 03:59 GMT+1 óra  
Van egy c# jegyzet azért tanulom a benne írtakat mert c++ ról át akarok szokni c# re az unity miatt.

Azt írta a jegyzet,hogy a referencia típúsok és az érték típúsok közti külömbség az,hogy ha egy érték típúshoz ha hozzárendelek egy másik érték típúst,akkor azok nem fognak egy memóriaterületre mutatni de referencia típúsok esetében igen.

Például:
Kód:
int x = 5, y = 10;
x = y;

Mivel ezek érték típúsok ezért nem lesz az,hogy x ugyanarra a memóriaterületre fog mutatni mint az y; Csak az értékük lesz ugyanannyi.

Példa2:
Kód:
using System;

class MyClass {
    public int x;
}

class Program {
    static void main(string[] args) {
        MyClass s, p;
        s.x = 5;
        p.x = 10;
       
        p = s;
        Console.WriteLine(p.x);
    }
}

Ebben a példában azért fog 5 lenni a kimenet mert a class-ok referencia típúsokat hoznak létre ez miatt az történik,hogy p arra a memóriaterületre fog mutatni amire s.A p egy alias lesz s re.

Amit én nem értek az az,hogy a jegyzet szerint a string típús is referencia típús de mégis úgy viselkedik mint egy érték típús.

Példa:
Kód:
String s1 = "kkkk", s2 = "qqqq";
s1 = s2;
s1 = "ppppp";                     
Console.WriteLine(s2);

most s1 nek arra a memóriaterületre kell,hogy mutasson amire s2 is mutat,
mert a string referencia típús.Ha most megváltoztatom s1-et,akkor s2 nek is változnia kell.

Ha a stringek referencia típúsok lennének,akkor most s2 nek egy alias-a kellene,hogy legyen s1.
De nem az mert s2 értéke nem változott s1 hatására.

Akkor most,hogy van ez?

Vagy itt van ez:
Kód:
using System;

namespace PracticeConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 5;
            int y = 10;
            object objx = x;
            object objy = y;
            objy = objx; //Itt objy ahelyett,hogy megkapná az objx referenciáját csak az értékét kapja meg.
            objy = 100;
            Console.WriteLine(objx); //Itt látszik a kimenetből ugyanis objx nem lett 100.
            Console.WriteLine(objy);
            Console.ReadKey();
        }
    }
}


A bedobozolás arra van,hogy megengedjük egy érték típúsnak,hogy referencia típúsként viselkedjen.
Ez hülyeség!Meg a stringeknél is.Ez csak class oknál működik.

Ezt a hozzászólást Viperion módosította (2013.10.31 04:45 GMT+1 óra, ---)

   
Frissebbek | Korábbi postok
[1] [2] > 3 < [4] [5] [6] [7] [8] [9] [10] [15] [20] [25] [30] [35] [40] [45] [46]