VC6 GetTime() vs ::QueryPerformanceCounter – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

VC6 GetTime() vs ::QueryPerformanceCounter – C / C++ – Fórum – Programujte.comVC6 GetTime() vs ::QueryPerformanceCounter – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
CZIvo0
Newbie
2. 8. 2016   #1
-
0
-

Dobrý den,

po slouhé době se na vás obracím s žádostí o pomoc..

Problém je následujicí..

Má aplikace - exe a dll dedikovaného serveru jedné hry má "problém" s časováním..

v aplikaci i dll jsem původní prastarý "GetTime()" nahradil novým systémem co používá "::QueryPerformanceCounter()", což vyřešilo drtivou většinu problémů s časem, například na serveru kde je 64bit OS neběží čas odpočítávání 10x rychleji, než by měl..

To je fajn, ale teď jsem narazil na problém s rychlostí projektilů, zkoušel jsem nový timer použít v celém projektu, bohužel to nepomohlo, a vývojář, který se před lety věnoval tomu samému, mi řekl že problém s v server.dll .. BOHUŽEL od server.dll neexistují zdrojové kódy, mám jen už vykompilovaný server.dll a server.lib v projektech aby šel zbytek přeložit..

Moje otázka zní:

1 - je možné nějakým způsobem upravit již zkompilovaný server.dll a nahradit tu starou funkci GetTime() její novější verzí? Pokud ano.. Jak? (vím, že by to nejspíš mělo jít v diassembleru, ale já strojovému kódu absolutně nerozumím a nemám tucha co s tím..)

2 - pokud nelze už přeložené DLL změnit, nebo by to bylo natolik komplikované, že to prostě nestojí za tu námahu.. Existuje způsob, jak třeba do toho procesu za běhu z nadřazené exe aplikace ten nový timer injektovat? Na úrovni paměti..

Budu vděčný za jakoukoliv pomoc, nebo radu.

Nahlásit jako SPAM
IP: 217.66.164.–
3. 8. 2016   #2
-
0
-

Možná to bude znít hloupě.... Napsat novou dll? Nějaká dokumentace jaké obsahuje funkce a co dělají snad existuje...

Snažit se to nějak "zlomit" bude stát hodně úsilí a nejspíš nepovede ani k uspokojivým výsledkům

hu

Nahlásit jako SPAM
IP: 195.178.67.–
CZIvo0
Newbie
3. 8. 2016   #3
-
0
-

#2 hlucheucho
Bohužel, taková dokumentace neexistuje :( :( a vzhledem k tomu, že je to dll o velikosti přes půl MB, tak pochybuju, že se tam stará jen o pár základních věcí :D

Nahlásit jako SPAM
IP: 217.66.164.–
q
~ Anonymní uživatel
219 příspěvků
4. 8. 2016   #4
-
0
-

Napiš o co přesně jde a kde to seženu. Mrknu na to.

Nahlásit jako SPAM
IP: 213.211.51.–
CZIvo0
Newbie
4. 8. 2016   #5
-
0
-

#4 q
Jedná se o hru Aliens vs. Predator 2, rok vydání 2001, zdojové kódy server.dll vůbec neobsahují, posílám vše relevantní co se ve zdrojákách vyskytuje (je to vlastně jen server.lib ze složky Shared) + samotnou dll, případně můžu poslat kompletní čisté zdrojáky..

http://upload.mujmail.eu/public/server.7z

Popis problému:

jsou zde 3 faktory serveru.. AvP2Serv.exe, OBJECT.LTO a Server.dll

od exe a LTO mam zdrojove kody a zmenil jsem timer z původního widláckýho GetTime() (kterej způsoboval, že odpočítávání třeba 10 minut hravě uběhlo za minutu :D) na

NewTimer::NewTimer()
{
    QueryPerformanceFrequency(&liFrequency);

    ::QueryPerformanceCounter(&liStart);

}

float NewTimer::GetTime()
{
    float LithTime=(float)g_pLTServer->GetTime();

    if(LithTime<LastLithTime)
    {
        ResetTimeStart();
        LastLithTime=0.0f;
    }
    else
        LastLithTime=LithTime;

    LARGE_INTEGER liCurrent;

    QueryPerformanceCounter(&liCurrent);

    LONGLONG llTimeDiff = liCurrent.QuadPart - liStart.QuadPart;

    return (float) llTimeDiff / (float) liFrequency.QuadPart;
}

který se volá "(LTFLOAT)g_myNewTimer.GetTime()", namísto "g_pLTServer->GetTime()" (nejspíš ho to volalo z toho server.dll, ale nejsem si jistej, zdroje struktury "g_pLTServer" tu taky nejsou, nebo spíš jsou nic neříkající - je to jenom header)

Ovšem nejsem schopný téhle úpravy i v server.dll, protože nemá zdrojové kódy, a absence tohodle novýho timeru způsobuje těžké problémy na x64 serverech a nebo celkově na serverech s více než jedním processorem.. Například na našem dedikovaném serveru ve francii, což je sestava s 64GB ram a 2 Intel Xeon processory (každý procesor po 3.7ghz a 4 jádrech) to způsobuje extrémně rychlý pohyb projektilů - například vystřelená raketa přeletí celou mapu ve zlomku sekundy (nebo například granát z pulsní pušky detonuje milisukundu po vystřelení na druhém konci mapy, prostě ve stejném okamžiku, kdy ťukneš na vystřelení, bouchne na místě kam míříš, normálně má letět relativně pomalu, prostě jako hozenej šutr), případně granát místo plynulého letu prostorem "warpuje" z hlavně zbraně na nejvyšší bod své dráhy, odkud odwarpuje na místo určení, je to šílený..

Otevřel jsem server.dll v assembleru a vidim tam to ve výpisu funkcní GetTime(), ale absolutně nemám tušení co s tím.. Zkoušel jsem nějaký primitivní návod pomocí Hallo World pro assembler, ale vůbec jsem to nepochopil, je to mimo moje schopnosti..

V případě, že mi můžeš pomoct, můžu ti nabídnout credit v projektu a jsem ochotnej zajít i tak daleko že za to zaplatím, bohužel nejsem milionář :D tak bych to viděl třeba na kredit, neco tak něco :). Ale budu rád i za radu, nebo prostě nějaký postřeh :(

Nahlásit jako SPAM
IP: 217.66.164.–
q
~ Anonymní uživatel
219 příspěvků
4. 8. 2016   #6
-
0
-

Hm, v té DLLce celkem nic není. Předpokládám, že g_pLTServer inicializuje přes CreateServer. Pošli i ten header, podle toho by mělo jít najit tu funkci GetTime.

Nahlásit jako SPAM
IP: 213.211.51.–
CZIvo0
Newbie
4. 8. 2016   #7
-
0
-

#6 q
Děkuju.. Budu rád, když na to mrkneš..

Tady je kompletní mnou ani nikým jiným nemodifikovaný kód, který šel před lety stáhnout..

http://upload.mujmail.eu/public/kod.zip

proj/avp2 tam jsou jednotlive projekty

v proj/LT2 jsou headery, liby a podobné kolem Enginu

Proj/avp2/shared jsou sdílené soubory, které když se změní, tak musí být znovu zkompilované ObjectDLL, ServerApp a ClientShellDll

Ještě jednou díky za jakoukoliv pomoc :)

Nahlásit jako SPAM
IP: 217.66.164.–
q
~ Anonymní uživatel
219 příspěvků
8. 8. 2016   #8
-
0
-

Hele, chvíli jsem na to koukal, ale nebudu to buildovat a nemám to jak spustit.

Dej tam někam toto:

void *vtable = ((void**)g_pLTServer)[0];
void *fnGetTime = ((void**)vtable)[0xD4/4];

A napiš mi, co se načetlo do fnGetTime a na jaké adrese je loadnutá server.dll.

Nahlásit jako SPAM
IP: 213.211.51.–
CZIvo0
Newbie
10. 8. 2016   #9
-
0
-

#8 q
Když se pokusím to přeložit, tak 

void *vtable = ((void**)g_pLTServer)[0];
void *fnGetTime = ((void**)vtable)[0xD4/4];

projde, ale když se pokusím zavolat fnGetTime() tak v tom řádku mi překladač oznámí 

.cpp(7455) : error C2064: term does not evaluate to a function
Nahlásit jako SPAM
IP: 217.66.164.–
q
~ Anonymní uživatel
219 příspěvků
11. 8. 2016   #10
-
0
-

Nevolej to jako funkci, jen se podívej, jakou má ta proměnná hodnotu.

Nahlásit jako SPAM
IP: 78.156.159.–
CZIvo0
Newbie
11. 8. 2016   #11
-
0
-

#10 q
AhA , no bohužel taky neúspěch, když se to pokusím vložit "někam" do ObjectDll, tak to zabrání jejímu načtení - server hodí error, že nemůže přečíct OBJECT.LTO

Podívám se na to ještě o víkendu, jestli by to nešlo hodit do jiné části kódu, třeba do GameServerShell, teď jsem to zkusil v MultiplayerMgr.cpp

Nahlásit jako SPAM
IP: 217.66.164.–
q
~ Anonymní uživatel
219 příspěvků
12. 8. 2016   #12
-
0
-

OK, a napiš mi pak obě hodnoty vtable i fnGetTime.

Ale čím dál víc mi to připadá, že ta GetTime nebude v server.dll, takže kdyby ty adresy byly v jiném modulu, tak mi pošli i jeho binárku a adresu.

A co jsem zatím našel různé počítání času, tak to nevypadá, že by to mělo mít vliv na ty projektily.

Nahlásit jako SPAM
IP: 213.211.51.–
CZIvo0
Newbie
29. 6. 2017   #13
-
0
-

Omlouvám se za oživení mrtvolky, nakonec jsme to vyřešili úplně jinak, protože tohle bylo bezvýchodný, 

a to pomocí asm kódu, který injektuje QueryPerformanceCounter a všechna nastavení hned při startu programu přímo do nadřazené DLL (server.dll) knihovny a výsledkem je že ten fixnutý timer běží VŠUDE a není potřeba žádné modifikace, volá se původní g_pLTServer->GetTime() a už vrací správné hodnoty toho timeru s vysokým rozlišením :)

vyřešilo to i spoustu problému v MP, jak jsem popisoval třeba ty šílený rychlosti projektilů, tak to je už ok (DOKONCE když nastavím třeba raketu na 100.0f, tak letí tak krásně a dokonale plynule jako v matrixu :D), všechno běží hladčeji než kdy předtím, dokonce můžu používat i announcery třeba s odpočítáváním, aníž by announcer by u "Six, Five" ale aplikace už smyčku díky tomu šílenýmu času ukončila :D

Sice je to prasárna (tohle vnucení něčeho pomocí asm tý nadřazený dll), ale FUNGUJE to a běží to spolehlivěji než předtím :). Kdo mi tu s tím pomáhal, pokud chcete vidět ten výsledný kód toho ASM, napište SZ, rád ukážu, nemůžu to tu zveřejnit, protože se obsah tohohle vlákna zobrazuje na google a řekněme že konkurence je až moc nenechavá (už teď se marně pokouší vydolovat ze zkompilované binárky jak je to uděláno, naštěstí díky Themidě jim to bude trvat pár let :D)

Nahlásit jako SPAM
IP: 77.48.132.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 63 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý