BeOS- žaidimų platforma?

 




Platformos pristatymas

Kūrimo BeOS aplinkoje nauda

autorius Joseph Mocanu

Įvadas

Pirmiausia, aš turiu galvoje, kad Jūs esate girdėję apie BeOS, kas tai yra ir t.t. Plačiau apie šios sistemos sukūrimą galite sužinoti Internet tinkle (įskaitant ir oficialųjį Be, Inc.), kur apie tai kalbama daug geriau ir detaliau, nei aš galėčiau tai padaryti. Bet kokiu būdu, kibkime į darbą.

Twilight Prophecy 3D/Multimedia SDK  veikimas BeOS aplinkoje  
Rytas, laikrodis rodo 4:51, kai baigiu pakeitimus naujausioje "Prophecy 3D for BeOS" versijoje ir pats savęs klausiu- kodėl BeOS? Kokia jėga Žemėje mane verčia kurti operacinei sistemai, kuria naudojasi mažai žmonių, kuriai sukurta keletas komercinių programų, sistemai sukurtai kompanijos, kurioje programuotojų tiek, kiek mano pusseserės pradinėje klasėje. Ne koks vaizdelis, ar ne? Ka gi, jie gerokai padirbėjo per metus, kai aš gavau R4.5 kompaktą ir aš vis dar naudoju ją kaip pagrindinę kūrimo OS - jau nekalbant apie tai, kad yra dešimtys tūkstančių individualų kaip ir aš. Aišku, tai neprilygsta milijonams Windows programuotojų, bet tai yra ženklus skaičius, kuris gali paveikti programų kūrimo ateitį. Tai ką magiško daro BeOS ir sužavi kūrėjus, kad jie lieka su ja?   

 

Kas naudinga BeOS kūrėjams?

Atsakymas sukelia ne magišką, bet tik bendrą pojūtį. Aš greičiausiai nesu autoritetas, kai kalbama apie įvairių platformų palyginimus, bet aš galiu pasakyti Jums mintis ir įspūdžius iš savo asmeninės patirties įgautos per daugelį metų programuojant įvairioms platformoms. Svarbiausia ką aš pasakyčiau apie BeOS- ji turi aiškią, logišką API, kai daugelyje kitų OS (ypač Win32) to trūksta. Pavyzdžiui, palyginkime lango sukūrimo procedūrą.

Win32 aplinkoje, Jūs tai darote šitaip:

static void RegisterWindowClass(HINSTANCE hInstance,
  bool close)
{
  WNDCLASSEX wndClass;

  wndClass.cbSize         = sizeof(wndClass);
  wndClass.style          = CS_HREDRAW | CS_VREDRAW;
  wndClass.lpfnWndProc    = WndProc;
  wndClass.cbClsExtra     = 0;
  wndClass.cbWndExtra     = 0;
  wndClass.hInstance      = hInstance;
  wndClass.hIcon          = LoadIcon(NULL,
                            IDI_APPLICATION);
  wndClass.hCursor        = LoadCursor(NULL,
                            IDC_ARROW);
  wndClass.hbrBackground  = NULL;
  wndClass.lpszMenuName   = NULL;
  wndClass.lpszClassName  = WindowClassName;
  wndClass.hIconSm        = LoadIcon(NULL,
                            IDI_APPLICATION);

  if ( close==false )
    wndClass.style |= CS_NOCLOSE;

  RegisterClassEx( &wndClass );
}

 ...

  // registruojame lango klasę
  HINSTANCE hInstance = NULL;
  RegisterWindowClass( hInstance, ws.close );

  // sukuriame langą
  mWinHandle.hwnd = CreateWindow(
    WindowClassName, name,
    mask, 0, 0, width, height,
    NULL, NULL, hInstance, NULL );

  // nustatome win32 hwnd vartotojo duomenis 
  // lango objektui
  SetWindowLong( mWinHandle.hwnd, GWL_USERDATA,
    (LONG)this );

Asmeniškai, aš niekada nebuvau vengriškos notacijos fanas- tai man atrodo, kaip nukrypimas nuo programavimo kalbų evoliucijos [Taip, BASIC bandė tai su rimtomis neigiamomis pasekmėm, bet tai dizaino klaida, o ne lingvistinė klaida]

Antra, langas turi būti užregistruotas OS tiksliai, ir daugelis iš šių išvardintų kintamųjų veikia vienkartiniame globaliame pavidale. Pats langas yra tame pačiame lygyje kaip ir jį inicializuojantis kodas ir pasikliauna įvykių cikle veikiančiame tame pačiame sraute (thread). 

Dabar palyginkime ką Jūs turite daryti BeOS aplinkoje:

Paprastam langui sukurti:

BWindow *win = new BWindow(
  BRect( x, y, x+width, y+height),
  "My test window", B_NORMAL_WINDOW,
  B_NOT_CLOSABLE|B_NOT_RESIZABLE);

Sudėtingesniam:
SuperWindow *win = new SuperWindow(
  BRect( x, y, x+width, y+height),
  "My test window", B_NORMAL_WINDOW,
  B_NOT_CLOSABLE|B_NOT_RESIZABLE);

class SuperWindow : public BWindow
{
  SuperWindow(.....);

  // ...... galite įrašyti ir savas f-jas
}

SuperWindow::SuperWindow(BRect frame,
  char *title, window_type type,
  uint32 flags ) : BWindow(frame,title,type,flags)
{
  // papildomas vartotojo kodas.....
}
BeOS turi paprastą ir galingą API  

Kaip galima buvo matyti aukščiau, paprastas langas, su valdyklėmis pagal nutylėjimą, gali būti sukurtas VIENOS kodo eilutės pagalba, šaunu! Kuriant langą, jis tuoj pat persikelia į savo nuosavą srautą (thread), taigi konstruktorius neblokuoja ir įvykių valdyklė (event handler) iškviečiama naujame sraute (tread). Po to, Jūs galite keisti šiuos langus paveldėdami Window klasę savo klasėje; taip, tai tiesa- kaip Jūs greičiausiai ir manote, Window klasė, kaip ir kitos bazinės API klasės BeOS siūlomos C++ kalba, skirtingai nuo Win32 ar Unix, kurių API sukurtos C kalba. Kiekviena BeOS klasė yra lengvai paveldima, kas leidžia padidinti ir pritaikyti sau funkcionalumą, išlaikant suderinamumą su kitomis klasėmis. Faktiškai, aš pripažįstu, kad prieš pradedamas kurti BeOS, aš niekada nesivarginau aiškintis C++ galimybių, kadangi nesitikėjau jos naudoti didelio greičio grafinėse programose [pvz. žaidimuose], bet pamatęs kaip elegantiškai ji atrodo ir dirba ir, kaip paprasta praplėsti jau esantį kodą, aš neįsivaizduoju savęs nenaudojant tai.

Nesutinkate? (gerai, matyt šis straipsnis per trumpas :)
BeOS savaime palaiko MP3 ir kitus multimedia failus

BeOS remiasi Application Server'iu, programa, kuri seka visas sistemoje vykdomas programas, dauguma kurių naudoja GUI, ir atitinkamai išskiria resursus. Nors tai gali atrodyti keistokai ar nenaudingai, ji suteikia standartinę struktūrą, kurios pagalba kiekviena programa gali tvarkingai bendrauti su kitomis. Gaila, bet aš dar neištyriau šios BeOS architektūros dalies, bet aš sutinku, kad tai yra viena iš labiausiai girtina naujovė. Dažniausias tarprograminis bendravimo metodas yra BMessage, kuris neatsitiktinai taip pat yra programų viduje veikiančių objektų bendravimo metodas. BMessage sudarytas iš identifikacijos kodo ir duomenų rinkinio, kuo gali būti daugelis egzistuojančių modelių (tokie kaip taškas ekrane [BPoint klasė] arba sveikasis skaičius ir t.t.) ar vartotojo sukurti duomenys. Siuntėju ir gavėju nebūtinai turi būti ta pati programa.

BMessage pavyzdys:

Kažkoks kodas kurioje nors vietoje:

  BMessage *m = new BMessage(Q_PROMPTSHOW);
  m->AddPointer("PromptPacket",(void *)pp);
  qik->PostMessage(m);

Kur "qik" yra objektas bendraujantis su Application Server (dažniausiai pagrindiniame vykdomajame faile)

Pagrindinis Application Message Handler:

void Qik::MessageReceived(BMessage *message)
{
  switch (message->what)
  {
    case Q_PROMPTSHOW:
      qikwin->PostMessage(message);
      break;
    .....
  }
}
Tai ką tai parodo? Tai buvo tik įvykių apdorojimo pavyzdys, t.y. kodas siunčiantis įvykį (šiuo atveju) neturi priėjimo prie lango objekto (atrodytų kodas turi būti DLL pakrautame po paleidimo [matyt, taip ir buvo =)]), jis pasiūstas vienam objektui prie kurio turėjo priėjimą, t.y., pagrindinis programos objektas, kuris persiuntė šį įvykį langui arba buvo galima valdyti įvykį čia kodu:
  PromptPacket *data;
  message->FindPointer("PromptPacket",(void **)&data);
Kita įdomi BeOS savybė- vaizdų (views) naudojimas languose. Iš esmės, vaizdas yra plotas lange, kuriame piešiama ir, kur įvedimo įvykiai yra gaunami. Langas gali turėti daug vaizdų, o ir patys vaizdai gali savyje turėti kitų vaizdų. Faktiškai, daugelis BeOS GUI elementų yra tik standartinės BView klasės palikuoniai. Norint sukurti mygtuką Jums tereikia paveldėti BView::Draw metodą, kad nupiešti mygtuką ir BView::MouseDown(..), kad perimti mygtuko nuspaudimą. Neužmirškite reliatyvių/absoliučių koordinačių, viso ko Jums reikia, kad sukurti View lango plote jo koordinačių sistemoje ir, galbūt po to nukelti ar pakeisti jo dydį BView::MoveTo ir Bview::ResizeTo metodų pagalbą.
BeOS palaiko atvaizdavimo (rendering) technologiją daugeliui 3D spartintuvų, išskyrus GeForce.  
Kita svarbi API dalis- Media Kit, kurios centre ryšių tarp mazgų koncepcija- pvz. media gamintojų ir media vartotojų. Aš nenoriu įsigilinti į tai, nes tai ne šio tinklalapio tema. Panašūs dalykai vyksta failinės sistemos API, kuri taip pat yra sukurta C++, ir kuri turi tokius šaunius dalykus, kaip mazgų monitoriai, kurie praneša Jums [per BMessage], kas pasikeičia Jūsų akiratyje [pvz., failas yra pervardintas ar perkeltas į kitą vietą].

Naujoji BeOS OpenGL API yra iš esmės paprastesnė nei WGL, ypač inicializacijoje, nors aš jaučiu, kad senesnė API (matyta R4.5) buvo labiau atitinkanti OS.

Pagrinde, naujoji OpenGL Kit paveldėta iš DirectWindow klasės, pastaroji remiasi BWindow su vieninteliu tiesioginio priėjimo prie vaizdo kortos vaizdų buferio (framebuffer) skirtumu. Pradėti dirbti OpenGL yra labai paprasta [nors aš ir nematysiu dirbant su Prophecy]:
MyDirectGLWindow *window = new MyDirectGLWindow(
  BRect( 100.0, 100.0, 100+width-1, 100+height-1 ),
  "title of the game", B_NORMAL_WINDOW,
  B_ASYNC_CONTROLS);

ir MyDirectGLWindow CTR Jūs turėsite:
EnumerateDevices( BGL_MONITOR_ANY,
  BGL_ANY | BGL_DOUBLE,
  BGL_ANY, BGL_NONE, BGL_NONE );

... tam, kad sužinoti informaciją apie įrangą ir režimą, darykite taip:
if(InitializeGL( some_device, BGL_ANY | BGL_DOUBLE,
  BGL_ANY, BGL_NONE, BGL_NONE ) < B_OK )
{
  debugger( "Error from InitializeGL \n" );
    // to "crash" and invoke debugger w/ message
  return NULL;
}

Toliau Jūs turite nurodyti GL, kuri gyja (thread) vykdys atvaizdavimą (rendering). Patarčiau nustatyti atskirą gyją paišymui ir iškviesti:
  window->MakeCurrent();
  call your glXXXX(...)  commands
  window->ReleaseCurrent();
    // to allow other threads to render.
Pabaigoje iškvieskite:
  ShutdownGL();
ir štai viskas- veikianti GL programa. Aš nenorėčiau dėti čia atitinkamo Win32 kodo Jums =)

Dabar galbūt Jūs paklausite savęs [aš tikiu],"API yra šauni, bet kas iš geros API, jei nieko nežinome apie OS?

Gerai, pati OS buvo sukurta turint galvoje- media greitis. Turėjome apie 20 metų "malonaus" programavimo Unix ir Win32 palikimą, turėjome atbulinio suderinamumą. OS yra gryna GUI, čia NĖRA tekstinio režimo, tuo pat metu čia yra POSIX suderinamumo sluoksnis, tai tik tarnauja kaip apsiaustas BeOS sisteminėms (native) funkcijoms, ir tai būdas perkelti daugelį Unix programų į BeOS aplinką, nors tai ir CLI[bash], bet jis lange, kaip ir XTerm. Dažnai, daugelis žmonių mano, kad BeOS branduolys (kernel) remiasi Linux branduoliu (kernel), nors iš tikrųjų visas branduolys parašytas nuo nulio.

BeOS branduolys, nors ir turi seno kodo, yra vienintelis, mano žiniomis, kuris specialiai optimizuotas SMP [tai todėl, kad BeOs iš pradžių buvo kuriamas dirbti Be, Inc. kompanijos BeBox sistemose (SMP PPC sistema) su novel galimybėmis, kaip belaidžios jungtys (wireless ports) [tai buvo 1991].

BeOS turi originalią failinę sistemą, kurią giria daugelis programų inžinierių. Ji yra viena iš nedaugelio tikroji žurnalinė failų sistema (true journaling file system) (kita, apie kurią aš žinau, yra Aurora [naujausioje OS/2 versijoje]). Jums nebereikia rūpintis duomenų praradimo ar fragmentacijos problemomis. Nelaimei, ji buvo sukurta valdyti labai didelius failus (video ar garso įrašus), todėl mažų failų valdymas joje nėra pats geriausias.

Gerai, Jūs išgirdote įprastus žodžius apie šį bei tą. Taigi, kodėl aš naudoju ją?

Iš esmės, tai greičiausia OS, kuria aš naudojausi, ji atrodo solidžiai [nulūžo galbūt 5 kartus per 1.5 metų ir tai dėl beta tvarkyklių], API yra didi, ji atrodo šauniai, jokio bjauraus konfigūravimo [a la Linux] ir, kas geriausia, paskutinė jos versija nemokama (BeOS 5 Personal Edition)! Ar aš minėjau, kad ji startuoja per 15-20s?

Taigi, kokia nauda?

Kadangi yra mažai kūrėjų, Jūs neturite daugelio programų, nors čia ir yra keletas labai šaunių- Gobe Productive teksto redagavimui (MS-Word dalinai palaikomas), Easel ar Artpaint- grafikai (Easel gali naudoti GIMP priedus), ir Digital Tracker garso apdorojimui. Taip pat yra ir žaidimų- Corum III (korejietiško stiliaus animacinė RPG), Civilization: A Call to Power, ir daug perkeliamų- Quake III, Outcast ir Black and White. Man atrodo, kad BeOS yra gera OS žaidimams dėl savo multimedia architektūros. Aš girdėjau kalbas, kad "Jei tai media-OS, tai kodėl aš negaliu matyti šio .AVI failo", ir viskas dėl to, kad nėra koderio (codec), bet juk tai nieko neturi bendro su esamos OS architektūra. Jūs pabandykite pilnaekraninį vaizdą (full screen raw video) redaguoti Win32, o po to- BeOS- ir Jūs tuoj pat pajusite skirtumus! Komp. įrangos (hardware) tvarkyklės taip pat yra problema, jei Jūs turite senesnę įrangą, tai beveik 100% šansų, kad ji neveiks BeOS aplinkoje. Tai labiau priklauso nuo įrangos gamintojo, kurie rašo tvarkykles Win32 platformai, ne pati Microsoft firma. Suprantu, kad jie nerašys tvarkykles BeOS sistemai, kadangi dar yra labai mažai vartotojų, bet tai smarkiai pasikeis, kai nemokama R5 paplis. Aš tikiuosi, kad BeOS populiarumas išaugs ir žmonės galės išbandyti pirmąją vartotojui patogią Windows alternatyvą Intel platformoje.

Daugiau informacijos apie BeOS rasite:

http://free.be.com/ ..R5 atsisiuntimui ir pagrindiniai FAQ
http://www.benews.com/
..BeOS pasaulio naujienos
http://www.beoscentral.com/
..kitas naujienų šaltinis
http://www.bebits.com/
..pagrindinė BeOS programų saugykla
http://www.betips.net/
..daug įvairiausių patarimų apie BeOS.

Joseph Mocanu BeOS Development Coordinator

Parengta pagal Twilight3D Entertainment tinklalapį.

Į viršų
 

 

Atnaujinta: gruodžio 03, 2000.