Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 17:09:04 Předmět: Návrh interface 2D/3D enginu - obrázky a textury |
|
|
Chtěl bych se zeptat na radu. Chci si naprogramovat nějaké jednoduché rozhraní ke 2D a 3D grafice a chtěl bych se zeptat, jak by se to mělo řešit. Nejprve čeho chci dosáhnout: nejde mně o grafické super-hi-tech záležitosti, ale naopak, chci dělat hry nenáročné - i na starší stroje. Umím (jestli se to tak dá říct) OpenGL a pracuji v SDL. Právě kvůli starším strojům chci, aby aplikace plně podporovala OpenGL 1.1. A i když mým dalším cílem je kompatibilita s jinými systémy (Windows, Linux) tak si chci nechat otevřené dveře i pro jiné knihovny, jako je DirectX. Zároveň plánuji ve středně daleké budoucnosti (to je definice, co? :3) programování na NDS a hodně tříd a algoritmů lze s pěkným interfacem udělat obecně (hlavně GUI - to je můj hlavní problém). Tedy potřebuji něco obecného. Z mého popisu se může zdát, že by na to (kromě NDS konzole) seděl Irrlicht engine. A chvíli jsem si s ním i hrál - líbí se mě. Bohužel, jsou zde dvě věci, které mě odrazují - jednak OpenGL podporuje až od cca 1.3 (už mám za sebou jednu neplodnou diskuzi na toto téma v rámci jiného engine na jejich IRC kanálu) a jednak jako řetězce používá 16bitové znaky. Osobně dělám vždy v UTF-8 a ze všech UTF kódování právě 16bitové nemohu vystát. Když už, tak 32, ale to by zas zabíralo moc místa...
Rozhodl jsem se tedy, že si naprogramuji něco svého, pokud možno jednoduchého. Tedy nějaké interface IVideoDriver2D, IVideoDriver3D (dědí od 2D), IImage a ITexture. Průšvih, na který jsem narazil byl, když jsem si začal dělat GUI - pro tvorbu GUI prvků potřebuji kreslit do obrázku, generovat jej. Např. když dělám nějaké orámování, ohraničení, mám zdrojový obrázek, který se dá rozdělit na 3x3 čtverce. Jejich kraje vložím do rohů a zbytek vydlaždicuji. A zde narážím - jak mám navrhnout interface tak, aby to řešilo teto problém, co nejefektivněji? Jedna z možností je renderování do obrazovky (v zadním bufferu) a pak data vyjmout (v podstatě renderování do textury "postaru"). Nicméně na druhou stranu mohu použít SDL surface a renderovat do jiného surface - na obrazovku ani nešáhnu. Mohu tedy např. vykreslit složitou scénu (jak víme, úkon neskočí po skončení volání dané funkce, ale vloží se do fronty) a než grafická karta dokončí, co má, mohu generovat prvky. Nebo v jiném vlákně. Zároveň ovšem potřebuji, aby objekty typu IImage byly renderovatelné, jako 2D obrázky (ve 2D módu). Pokud tedy budu mít sadu tříd založenou na OpenGL, IImage bude vlastně textura s informacemi o původních rozměrech. Navíc takovou třídu mám navrhnutu tak, že umožní načíst obrázky, jejichž rozměry nejsou mocninou 2: při tvorbě textury se zbylé místo doplní např. bílou barvou a při vykreslení jen upravím texturovací koordináty. Takže další řešení, které mě napadlo je, vytvořit nové rozhraní a to IRenderImage či tak nějak. Pak by IRenderImage byl nezávislý na ovladači grafiky (např. takto by se načítal ze souboru, vytvářel, generoval, ...) a ovladač grafiky by pak z něj generoval IImage a ITexture. Ale nikdy jsem se s tímto návrhem nesetkal. Takže, prosím vás, jak se tohle řeší? Nejsem si jist, co z toho je nejlepší a zda neexistuje ještě něco lepšího. |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 21. listopad 2009, 18:07:54 Předmět: |
|
|
Ani jsem to nečet celý:
- Tlačítka s orámováním: ve 3D ti stačí mesh s 3x3 obdélníky namapovanými na texturu, kde je ten obrázek s 3x3 dlaždicema. Pak v tom meshi roztahuješ podle velikosti tlačítka jen ten vnitřek (pozice vertexů), okraje zůstanou stejně široké resp. vysoké (texturové souřadnice vertexů neměníš)).
- Na co potřebuješ ve 3D verzi enginu, aby obrázky IImage byly renderovatelné ve 2D módu?! Šlo by to jedině tak, že bys je měl 2x, jednou v paměti aplikace a jednou nahranou do 3D API (textura).
- Jak moc staré stroje chceš podporovat? OpenGL 1.1 jsou grafiky s rokem výroby tak 1996. Obvykle není důvod podporovat starší stroje než 4-5 let. Pokud je aplikace free, může běžet, na čem si zamaneš (klidně jen SM 4.0). Pokud má být komerční, targetuj jen cílovou skupinu, která je ochotna za takovou aplikaci zaplatit (tj. zjisti si, jaké mají stroje ti, co občas za něco zaplatí).
_________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 18:33:23 Předmět: |
|
|
Ladis napsal: |
Ani jsem to nečet celý:
- Tlačítka s orámováním: ve 3D ti stačí mesh s 3x3 obdélníky namapovanými na texturu, kde je ten obrázek s 3x3 dlaždicema. Pak v tom meshi roztahuješ podle velikosti tlačítka jen ten vnitřek, okraje zůstanou stejně široké resp. vysoké.
- Na co potřebuješ ve 3D verzi enginu, aby obrázky IImage byly renderovatelné ve 2D módu?! Šlo by to jedině tak, že bys je měl 2x, jednou v paměti aplikace a jednou nahranou do 3D API (textura).
- Jak moc staré stroje chceš podporovat? OpenGL 1.1 je rok 1993, grafiky s rokem výroby tak 1996. Obvykle není důvod podporovat starší stroje než 4-5 let.
|
Ah, sorry, mám takový nepříjemný zvyk psát dlouhé věcí...
- Pokud jsem tě pochopil správně, pak se bude rámování vlastně generovat pokaždé, když jej vykreslím. Tj. 9 polygonů na tlačítku + X polygonů nad ním (text, obrázek, ...). Kvůli starším strojům se snažím vyhnout i tomuto, i když se to asi dá nazvat "předčasná optimalizace". Budiž. Problém je v tom, že zároveň chci, aby bylo možno napsat 2D driver (jen by dědil od IVideoDriver2D). Zde už bych to musel dlaždicovat ručně a navíc bych musel napsat dva různé kódy v GUI pro tvorbu rámu. Čímž bych porušil některá pravidla OOP - GUI by přeci nemělo řešit, jestli zobrazuji skrz 3D nebo 2D. A navíc je to právě ta komplikace, které se snažím vyhnout.
- Pro 2D grafiku. Klasický případ - 3D hra, 2D informace o bodech, statu apod. Ano, je to vlastně textura, ale - jak už jsem psal - IImage mám jako texturu s přidanými daty - uložím info o původních rozměrech obrázku (např. 20x40) a texturu přetransformuji na mocninu dvou (32x64, v případě větších obrázků jejich menší verze, pokud daný rozměr grafika nepodporuje) a pak se vykreslí adekvátně velký polygon s adekvátními koordinátami. Kdežto ITexture obsahuje jen informace o svých rozměrech. 2x v paměti nic nepotřebuji.
- Hm... to máš asi pointu, nicméně mám jeden drobný protiargument - jak jsem psal, chci dělat na handlend NDS, jehož homebrew 3D API vypadá (skoro) stejně jako OpenGL, takže udělat driver 3D pro NDS by bylo prosté zkopírování OpenGL PC driveru a jeho pár drobných úprav (v podstatě by od něj stačilo dědit a přepsat metody, kde se API liší). A i když jsem to moc nezkoumal, jsem si jist, že to API bude právě na základě 1.1. Vždyť to ani neumí mipmapy :3.
Příklad ke druhému bodu:
ITexture:
- obsahuje texturu (v případě OpenGL její ID)
- skrz ni lze získat rozměry (glGetInteger...)
- "2D vykreslení": vykreslím obdélník o rozměrech textury, koordináty jsou klasicky osa x: 0-1, osa y: 0-1.
IImage
- obsahuje texturu (v podstatě může dědit od ITexture)
- info o původních rozměrech
- info o texturovacích koordinátách, které mapují celý obrázek
- 2D vykreslení: vykreslím obdélník o rozměrech uložených v instanci třídy neřešíc skutečné rozměry textury, koordináty jsou uloženy, tedy osa x: 0 - u, y: 0 - v
ITexture tedy reprezentuje texturu, nic víc. Tu používají 3D modely při vykreslení, takže např. nepotřebují informace o původních rozměrech, mají vlastní texturovací koordináty apod.
IImage reprezentuje 2D obrázek. Mohou jej normálně používal algoritmy pracující se 2D obrázky nezávisle na tom, že rozměry textury musí být mocniny dvou apod. Využít tak lze snadno k dynamickému uspořádání objektů na obrazovce v závislosti na rozlišení obrazovky. Např. mohu do nějakého menu mohu nahrávat různě velké ikony v závislosti na rozlišení a mezera mezi nimi a posun jednotlivých objektů je závislý na jejich šířce a výšce (které se snadno mohou změnit editací obrázku, i když v tomto případě je to blbý příklad) a není napevno daný nějakou konstantou v programu. |
|
Návrat nahoru |
|
 |
bolejt

Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 21. listopad 2009, 18:45:24 Předmět: |
|
|
ad UTF16 nebo UTF8: Windows nativně používá UTF16, Java UTF16, o Linuxu se říká, že UTF8, ale Qt a tím pádem i KDE používá UTF16, wxWidgets mám dojem taky UTF16.
takže proč to nemáš rád? UTF16 je oproti UTF8 imho skvělá věc.
když se implementující programátor vykašle na hieroglify a klingonštinu (tj. bude podporovat jen UCS2), má s docela běžnou prací se stringem konstatní složitost.
a myslím si, že tvá starost o paměť je zbytečná pro UTF32. kolik textu hry bude mít engine v paměti v jeden okamžik?
já se omlouvám, že se v tom hrabu, ale nechápu tvůj odpor k UTF16... _________________ Ball ball8; |
|
Návrat nahoru |
|
 |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 18:56:18 Předmět: |
|
|
bolejt napsal: |
ad UTF16 nebo UTF8: Windows nativně používá UTF16, Java UTF16, o Linuxu se říká, že UTF8, ale Qt a tím pádem i KDE používá UTF16, wxWidgets mám dojem taky UTF16.
takže proč to nemáš rád? UTF16 je oproti UTF8 imho skvělá věc.
když se implementující programátor vykašle na hieroglify a klingonštinu (tj. bude podporovat jen UCS2), má s docela běžnou prací se stringem konstatní složitost.
a myslím si, že tvá starost o paměť je zbytečná pro UTF32. kolik textu hry bude mít engine v paměti v jeden okamžik?
já se omlouvám, že se v tom hrabu, ale nechápu tvůj odpor k UTF16... |
No, hlavně proto, že když už chci dělat multijazyčnou aplikaci, tak pořádně. Hlavně proto, že se nechci vybodnout na tu klingonštinu, tedy v mém případě Japonštinu. Dalším důvodem je to názor, který jsem se dočetl na internetu, když jsem se o unicode prvně zajímal, že vlastně UTF-16 nemá výhodu UTF-8 - kompatibilita s ASCII, ani výhodu UTF-32 - pevná délka znaku. Hlavní výhodou je, že při použití UTF-8 mám texty ve stejném kódování pro názvy adres/souborů i pro normální texty. Používám pro to tu samou třídu a ty samé metody. Třeba když mám v nějakém XML (bohužel se mě nepodařilo uspokojivě rozjet nějaký xml parser, tak jsem si napsal vlastní - ano vím, su blbý :3) data o adrese i nějaké texty. Např. kdybych měl GUI v XML, mohu tam mít adresu k obrázku a popisek ke tlačítku. No, ohledně toho, co píšeš o UTF-32 a paměti... asi máš pravdu... I když bych chtěl dělat adventuru (ne klik & point, spíš něco mezi akční adventurou alá Japonský hry, klik & point a visual novel, tak s těmi texty a pamětí by neměl být problém. To už je spíš psychická záležitost (cože? ze 4bajtového znaku budu průměrně používat cca 1 a 1/2 bajtu?). |
|
Návrat nahoru |
|
 |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 19:02:14 Předmět: |
|
|
Mimochodem, i když tento problém vlastně řeším už dlouho (takže mám už udělané dva funkční základy GUI a asi tak 3 různé třídy návrhu grafiky), dneska mě napadlo ještě jedno řešení. Možná trochu ve stylu Javy... IVideoDriver2D by měl metodu CreateImageRenderer(), která by vytvářela objekt nového typu IImageRenderer a tato třída by měla na starosti tvorbu obrázku. V případě třeba takového SDL by vnitřně používala SDL_Surface a nakonec na výstup by generovala objekt typu IImage. Pochopitelně, takový návrh jsem taky ještě neviděl, tak bych se chtěl zeptat, zda si myslíte, že to je dobrý nápad. Kdyby jo, tak bych asi měl udělat i metodu DestroyImageRenerer(), protože tu mám vlastně dva samostatné balíky "video" a "GUI" a tak GUI neví nic o tom, jak se vlastně objekty vytváří, že? (Tudíž, jestli má použít free, delete nebo delete[] a jestli třeba není nějaká třída, která sleduje paměť a chce jí to zahlásit. Osobně mám teď třeba přetížený operátor new a tak sleduji pamět a její úniky.) |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 21. listopad 2009, 22:06:40 Předmět: |
|
|
Nepotřebuješ vedle sebe ITexture a IImage, měj jen IImage (bude se používat místo ITexture). Kreslení pak můžeš mít takt, že IImage bude mít metody beginPaint a endPaint, kterými obalíš 2D kreslení do obrázku. beginPaint vytvoří v paměti surface pro kreslení, endPaint jej doplní na rozměry mocniny dvou (pokud karta neumí now-power-of-two textury) a nahraje do OpenGL. beginPaint jeste může mít optimalizaci, že bude mít parametr, zda má být obsah obrázku při začnutí kreslení nedefinovaný nebo dosavadní. Dosavadní znamená přečíst si data textury z OpenGL, nedefinovaný znamená tohle přeskočit.
Obecně pokud chceš softwarově kreslit do textury, jediné řešení je kreslit si to v system-RAM, a pak jako celek poslat do 3D API (a moje navrhované řešení tak funguje; bylo to tak i v Direct3D v dobách Lock/Unlock - nevím, jak je to tam teď). _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
JohnyDog

Založen: 17. 08. 2007 Příspěvky: 66
|
Zaslal: 21. listopad 2009, 22:29:17 Předmět: |
|
|
Laethnes napsal: |
No, hlavně proto, že když už chci dělat multijazyčnou aplikaci, tak pořádně. Hlavně proto, že se nechci vybodnout na tu klingonštinu, tedy v mém případě Japonštinu. Dalším důvodem je to názor, který jsem se dočetl na internetu, když jsem se o unicode prvně zajímal, že vlastně UTF-16 nemá výhodu UTF-8 - kompatibilita s ASCII, ani výhodu UTF-32 - pevná délka znaku. Hlavní výhodou je, že při použití UTF-8 mám texty ve stejném kódování pro názvy adres/souborů i pro normální texty. Používám pro to tu samou třídu a ty samé metody. Třeba když mám v nějakém XML (bohužel se mě nepodařilo uspokojivě rozjet nějaký xml parser, tak jsem si napsal vlastní - ano vím, su blbý :3) data o adrese i nějaké texty. Např. kdybych měl GUI v XML, mohu tam mít adresu k obrázku a popisek ke tlačítku. No, ohledně toho, co píšeš o UTF-32 a paměti... asi máš pravdu... I když bych chtěl dělat adventuru (ne klik & point, spíš něco mezi akční adventurou alá Japonský hry, klik & point a visual novel, tak s těmi texty a pamětí by neměl být problém. To už je spíš psychická záležitost (cože? ze 4bajtového znaku budu průměrně používat cca 1 a 1/2 bajtu?). |
No kdyz uz mluvime o japonstine tak UTF16 se pouziva prave proto ze drtiva vetsina CJK znaku se v UTF16 porad vleze do dvou bajtu, v UTF8 je to na 3. (I kdyz jestli teda mluvime o japonsku, tam se na nejake Unicode vesele kasle a vsichni porad pouzivaji shift-jis ) _________________
 |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. listopad 2009, 22:33:19 Předmět: |
|
|
Laethnes napsal: |
To už je spíš psychická záležitost (cože? ze 4bajtového znaku budu průměrně používat cca 1 a 1/2 bajtu?). |
jedna textura ti zabere v pameti vic nez vsechny texty v cele aplikaci ve vsech jazycich dohromady
a jak rekl JohnyDog - je dobre vedet jak to vlastne je - UTF-16 opravdu postacuje i jako wide-char varianta nikoliv jako plne UTF-16 |
|
Návrat nahoru |
|
 |
bolejt

Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 21. listopad 2009, 22:50:29 Předmět: |
|
|
Laethnes: klingonština a hieroglify = umělé a prastaré jazyky. pokec o unicode byl tady.
to, že zatracuješ Irrlicht engine kvůli OpenGL > 1.1, to ještě s lehkým nepochopením beru, ale UTF16? to ne. vždyť je ve věcech, které se vsadím i ty používáš: Windows, Linux s KDE nebo Java. _________________ Ball ball8; |
|
Návrat nahoru |
|
 |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 23:00:01 Předmět: |
|
|
rezna napsal: |
Laethnes napsal: |
To už je spíš psychická záležitost (cože? ze 4bajtového znaku budu průměrně používat cca 1 a 1/2 bajtu?). |
jedna textura ti zabere v pameti vic nez vsechny texty v cele aplikaci ve vsech jazycich dohromady
a jak rekl JohnyDog - je dobre vedet jak to vlastne je - UTF-16 opravdu postacuje i jako wide-char varianta nikoliv jako plne UTF-16 |
No, s tou první hláškou bych si nebyl tak jistý vzhledem k tomu, že si loguju skrz gettext kdejakou potenciální chybu :3. Ale s mipmapama by to už možná šlo :3. A záleží na tom, kterou texturu taky máš na mysli :333.
No... Já se o to kódování zajímal. V podstatě proto, že když zapnu překládání kláves v SDL - kdy k eventu stisku klávesy se přidá i její UTF-16 kód - jsem si udělal kód, který UTF-16 dekóduje na UTF-8. Právě tehdy jsem si mohl zvolit, že si budu všechno ukládat v UTF-16 a neřešit to. Dělal jsem na prvním pokusném GUI a přišel jsem na textové vyplňovací pole a chtěl jsem i diakritiku. Tak jsem musel nastudovat jak to s unicode je a vybrat si z UTF-32, UTF-16 a UTF-8. (a naučit se to dekódovat a zpětně zase zakódovat) V podstatě se mi stále UTF-8 zdá být nejlepší volbou. Už jenom díky té kompatibilitě s ASCII. Díky tomu píšu zdrojáky v UTF-8 a zároveň vůbec neřeším to, kdo si je po mě potencielně bude číst - vzhledem k tomu, že se držím komentářů bez diakritiky (a přemýšlím, že je budu psát anglicky), může si to kdokoli otevřít v jakémkoli programu a jediné, co hrozí je, že v řetězcích bude mít občas divné znaky. Takže si zachovám poměrně dobrou čitelnost v rámci uživatelů bez podpory unicode jak v případě zdrojáků, tak v případě textů ke hře a zároveň obojí mám ve stejném kódování. Navíc v jednom XML souboru (to už jsem psal) mohu mít texty do hry/programu a adresy k souborům (doprovodným obrázkům) bez toho, aniž bych musel řešit buď to, že v jednom souboru budu mít povícero kódování, nebo že bych musel mít nějaký dekodér v programu, nebo že bych musel udržovat soubory s adresami k jiným souborům v jiném kódování, než soubory s texty do hry. Prostě si nemůžu pomoct, ale v UTF-16 vidím víc problémů, než řešení i za předpokladu, že se vybodnu na jazyky, kterým UTF-16 nestačí. |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. listopad 2009, 23:07:17 Předmět: |
|
|
WTF? proc bys musel michat vicero kodovani v jednom souboru kvuli cestam k externim filum - proste nactes XML ktere je v UTF-16 a zavolas odpovidajici systemovou funkci OpenFile - bud OpenFileA kdyz jedes v ANSI nebo OpenFileW kdyz jedes v UNICODE (UTF-16 bez viceznaku).
navic nemuzes michat vic kodovani v jednom souboru ze
mel by sis jeste uvedomit rozdil mezi kodovanim souboru, kodovanim dat v pameti, a vubec to ze to neni nijak zavisle na tom jak si to interne uklada filesystem - to za tebe resi funkce filesystemu - preci proto, ze filesystem uklada nazvy souboru v HATLA-PATLA-41 nebudu delat celou aplikaci v HATLA-PATLA-41 ne? |
|
Návrat nahoru |
|
 |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 23:11:40 Předmět: |
|
|
bolejt napsal: |
Laethnes: klingonština a hieroglify = umělé a prastaré jazyky. pokec o unicode byl tady.
to, že zatracuješ Irrlicht engine kvůli OpenGL > 1.1, to ještě s lehkým nepochopením beru, ale UTF16? to ne. vždyť je ve věcech, které se vsadím i ty používáš: Windows, Linux s KDE nebo Java. |
Ale mě nevadí používat programy, které mají UTF-16. S tím už jsem se popral a je mi úplně jedno, v čem píšu (dokud to nedělá čtverečky :3). I když taky hodně díky PS-Padu, který je na toto prostě dokonalý a pořeší mi snad jakékoli kódování. (I když fakt je ten, že mě štve, že od poslední reinstalace Windows mi nejede japonština :3). Ale přijde mi značně nepohodlné v tom dělat. Jóóóóóóó, kdybych dělal nějaký PS-Pad-for-Linux, neřeknu ani ň a jdu se pustit do učení všech kódování a způsobů jejich rozpoznávání. Ale zbytek aplikace by stejně měl jednotné kódování (a u mě by to bylo UTF-8 :3).
Mimochodem, beru, že různé aplikace mají různé kódování a neřeším je, ale tvůj poslední argument jde trošku mimo mě. Používám sice Windows i Linux, ale ve Windows XP se setkávám spíš s CP1250 a v Linuxu s UTF-8 (v něm si můžu dovolit psát do konzole v UTF-8, narozdíl od Windows). O KDE a Javě si myslím totéž - že je to něco, co má na můj vkus moc velké nároky. Ke KDE se dále nevyjadřuji, moc jsem to nepoužíval, mám zkušenost se 3 programy (v Gnomu) a chvíli KDE desktopem. Javu naopak se musím učit do školy a i když ji mám radši, než PL/SQL, vyhýbám se aplikacím v Javě. V podstatě jsem nenarazil na aplikaci v Javě pro koncové uživatele (jakým jsem), které by byly rychlé a nenáročné. To jen tak naokraj :3. |
|
Návrat nahoru |
|
 |
Laethnes
Založen: 14. 02. 2008 Příspěvky: 38
|
Zaslal: 21. listopad 2009, 23:20:29 Předmět: |
|
|
rezna napsal: |
WTF? proc bys musel michat vicero kodovani v jednom souboru kvuli cestam k externim filum - proste nactes XML ktere je v UTF-16 a zavolas odpovidajici systemovou funkci OpenFile - bud OpenFileA kdyz jedes v ANSI nebo OpenFileW kdyz jedes v UNICODE (UTF-16 bez viceznaku).
navic nemuzes michat vic kodovani v jednom souboru ze
mel by sis jeste uvedomit rozdil mezi kodovanim souboru, kodovanim dat v pameti, a vubec to ze to neni nijak zavisle na tom jak si to interne uklada filesystem - to za tebe resi funkce filesystemu - preci proto, ze filesystem uklada nazvy souboru v HATLA-PATLA-41 nebudu delat celou aplikaci v HATLA-PATLA-41 ne? |
Musím říct, jsem zaskočen. Používám C++ streamy (tedy fstream - ifstream a ofstream) a popravdě řečeno mě absolutně uniklo, že tam něco takového je, nebo že to jde nějak obejít. *jde si sednout a přehodnotit situaci*
Jo, to vím :3. Dělal jsem si srandu.
No, popravdě řečeno na téma názvy souborů + file system + programování jsem toho moc nečetl. Moje osobní zkušenosti jsou takové, že různé systémy to dělají různě a že to není dobré ignorovat. A taky jsem zjistil, že když budu požívat ASCII názvy souborů (pokud možno bez mezer), jsem za vodou (a pak se mohu dopustit ignorace, jenže pokud právě kvůli tomu, že to není dobré ignorovat budu používat jen základní znaky a písmena, pak se vlastně o ignoraci nejedná :3). V podstatě snad všechny kódování mají do 127 znaku vše společně. A kvůli tomu se vyhýbám názvům souborů v UTF-16 a UTF-32, protože v tomhle se liší (ano, kód znaku je stejný, ale již na více bytů, takže se liší řetězce). |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 21. listopad 2009, 23:27:32 Předmět: |
|
|
Laethnes napsal: |
V podstatě snad všechny kódování mají do 127 znaku vše společně. A kvůli tomu se vyhýbám názvům souborů v UTF-16 a UTF-32, protože v tomhle se liší (ano, kód znaku je stejný, ale již na více bytů, takže se liší řetězce). |
mno takze znovu - mozna si vsichni nadzvedneme prdele at nesedime tady panovi na vedeni
o tom v jakem kodovani budou nazvy souboru nerozhodujes ty, ale pouzity filesystem - to ze v tom ma linux bordel a umoznuje zapisovat UTF-8 nedejboze ruzne jine zvrhlosti je pouze jeho problem - to te nenuti to pouzivat.
filesystem muze kodovat treba v mnou uvedenem HATLA-PATLA-41 ve kterem se nazev souboru rezna.txt zapise jako XXXxxx.OOO
to ale nemeni nic na tom ze ty to takto musis nekde ukladat.
ty mas funkci filesystemu a ta to poresi.
mimojine na WIN platforme mas hned dve funkce na otevreni souboru OpenFileA a OpenFileW - prvni bere ASCII cestu druha cestu v UNICODE - a co myslis? musim kvuli funkci OpenFileW vsechny soubory prejmenovat na unicode nazvy aby je umela otevrit a potom az budu chtit otevirat pomoci OpenFileA tak zase vsechno predelat zpatky na ASCII - no to asi ne co?
P.S. kdyz uz pouzivas to STL tak k vetsine veci je i 'w' verze a nemusis nejaky UTF-16 resit  |
|
Návrat nahoru |
|
 |
|