Welcome, Guest. Please login or register.


Author Topic: iEP128emu (Read 50925 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: iEP128emu
« Reply #75 on: 2012.February.13. 15:03:49 »
Tehát a Spectrum mód nem gyorsabb jelentősen (PC-n legalább 1.5x a különbség Alt+W-nél). :???:

CPC 6128 konfiguráció beállítása:
Code: C++
  1.     vm.resetMemoryConfiguration(128);
  2.     vm.loadROMSegment(0x80, "cpc6128.rom", 0);
  3.     vm.loadROMSegment(0xC0, "cpc6128.rom", 0x4000);
  4.     vm.loadROMSegment(0xC7, "cpc_amsdos.rom", 0);
Elvileg az EP és a Spectrum között kellene lennie a sebességnek, de közelebb az EP-hez.

Offline Ep128

  • EP addict
  • *
  • Posts: 1849
  • Country: hu
    • Honlapom
Re: iEP128emu
« Reply #76 on: 2012.February.13. 17:12:56 »
és ez a sebesség iPhone 3G-n 10-15%, iPad 1-en pedig 86%-90% (ez utóbbi már majdnem elegendõ)

Na, akkor (ha jól értelmezem) az iPhone 4G S -en már elvileg mennie kellene viszonylag normálisan. :)
Reménykedés...

Offline varrogy

  • User
  • *
  • Posts: 76
Re: iEP128emu
« Reply #77 on: 2012.February.14. 18:38:23 »
Tehát a Spectrum mód nem gyorsabb jelentősen (PC-n legalább 1.5x a különbség Alt+W-nél). :???:

CPC 6128 konfiguráció beállítása:
Code: C++
  1.     vm.resetMemoryConfiguration(128);
  2.     vm.loadROMSegment(0x80, "cpc6128.rom", 0);
  3.     vm.loadROMSegment(0xC0, "cpc6128.rom", 0x4000);
  4.     vm.loadROMSegment(0xC7, "cpc_amsdos.rom", 0);
Elvileg az EP és a Spectrum között kellene lennie a sebességnek, de közelebb az EP-hez.


Sehogy sem akar a speccy emu gyorsabb lenni az EP-nél :)
CPC-t még nem próbáltam idő hiányában.

Már ennyire leegyszerűsítettem a kódot, de minden esetben ugyanazok az eredmények jönnek ki!
Code: [Select]
int main(int argc, char *argv[])
{
    @autoreleasepool {
             
        Ep128Emu::AudioOutput    *audioOutput    = NULL;
        Ep128Emu::VideoDisplay   *videoDisplay   = NULL;
        Ep128Emu::VirtualMachine *vm             = NULL;
        Ep128Emu::VMThread       *vmThread       = NULL;
        Ep128Emu::Timer          statsTimer;

        int32_t oldSpeedPercentage = 0;     
             
        audioOutput     = new Ep128Emu::AudioOutput();
        videoDisplay    = new Ep128Emu::OpenGLDisplay();
       
        vm = new Ep128::Ep128VM(*videoDisplay, *audioOutput);

        NSString *path = [[NSBundle mainBundle] pathForResource:@"exos21" ofType:@"rom"];
        vm->loadROMSegment(0x00, [path cStringUsingEncoding:NSUTF8StringEncoding], 0);
        vm->loadROMSegment(0x01, [path cStringUsingEncoding:NSUTF8StringEncoding], 16384);
       
        path = [[NSBundle mainBundle] pathForResource:@"basic" ofType:@"rom"];
        vm->loadROMSegment(0x10, [path cStringUsingEncoding:NSUTF8StringEncoding], 0);
       
        vmThread = new Ep128Emu::VMThread(*vm);
        vmThread->setSpeedPercentage(0);
        vmThread->pause(false);

        while (1) {
            Ep128Emu::VMThread::VMThreadStatus  vmThreadStatus(*vmThread);

            if (statsTimer.getRealTime() >= .5) {
                statsTimer.reset();
                int32_t newSpeedPercentage = int32_t(vmThreadStatus.speedPercentage + 0.5f);
                if (newSpeedPercentage != oldSpeedPercentage) {
                    oldSpeedPercentage = newSpeedPercentage;
                    printf("%i%%\n", oldSpeedPercentage);
                }
            }
            usleep(10000);
        }
    }
}


Offline varrogy

  • User
  • *
  • Posts: 76
Re: iEP128emu
« Reply #78 on: 2012.March.28. 18:33:26 »
Tehát a Spectrum mód nem gyorsabb jelentősen (PC-n legalább 1.5x a különbség Alt+W-nél). :???:

IstvanV:
Az OpenGL ES lett a szūk keresztmetszet,
 az lenne a kérdésem, hogy tudnál-e nekem segíteni abban, hogy a
drawFrame_quality1(Message_LineData **lineBuffers_,
                                         double x0, double y0,
                                         double x1, double y1, bool oddFrame_)
hogyan lehetne módosítani, hogy minél kevesebb textura rajzolassal tudjon lefutni (glTexSubImage2D sor).
Ugyanis úgy láttam, hogy minden képernyõ renderelés (double buffer, display quality 1 esetében) 21db texturát rajzol!
Sajnos ez az iOS-en iszonyat sok processzort megeszik, viszont ha mondjuk a generaált textura magasságát (GLsizei txtHeight = 48;) ra emelneém akkor mindehez csak 7 textura kellen ami 3x gyorsabb renderelést eredményezne.
De akár lehet, hogy egy textura segítségével is meg lehetne oldani, ezt nem tudom.
Szerinted megoldhato lehet a fent leirtak valahogy?

Koszi
Gyuri

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: iEP128emu
« Reply #79 on: 2012.March.28. 20:12:57 »
Valószínűleg megoldható, akár 1 textúrával is, ami egyszerűsítene is a kódon. A textúra "darabolását" egyébként eredetileg azért építettem be, mert (legalábbis 5-10 évvel régebbi PC hardveren) javította a sebességet.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: iEP128emu
« Reply #80 on: 2012.March.28. 23:59:15 »
Módosított verzió (nem biztos, hogy hibátlan):
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]
  [ Guests cannot view attachments ]

Offline varrogy

  • User
  • *
  • Posts: 76
Re: iEP128emu
« Reply #81 on: 2012.March.29. 11:33:25 »
Módosított verzió (nem biztos, hogy hibátlan):
  (Attachment Link)
  (Attachment Link)
  (Attachment Link)


Tökéletesen mūködik és gyors lett köszi szépen!!
Az alábbi módosítást tettem még bele, a glBegin(GL_QUADS); ... glEnd(); sorok helyett.
így az openGL és openGL-ES1 is megeszi. 
Esetleg ezt a mostani emuba is lehetne használni, de a kompatibilitáson kívul megsporolhatunk vele egy plusz haromszoget :)


Code: [Select]
void OpenGLDisplay::drawFrame_quality1(Message_LineData **lineBuffers_,
                                         double x0, double y0,
                                         double x1, double y1, bool oddFrame_)
  {

.
.
.
      GLfloat textureCoords[] = {
          GLfloat(0.0), txtycf0,
          GLfloat(384.0 / 512.0), txtycf0,
          GLfloat(0.0), txtycf1,
          GLfloat(384.0 / 512.0), txtycf1,
      };
     
      GLfloat vertices[] = {
          x0, ycf0,
          x1, ycf0,
          x0, ycf1,
          x1, ycf1,
      };

      glEnable(GL_TEXTURE_2D);
      glEnableClientState(GL_VERTEX_ARRAY);
      glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
      glVertexPointer(2, GL_FLOAT, 0, vertices);
      glTexCoordPointer(2, GL_FLOAT, 0, textureCoords);
      glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
     
      glEnableClientState(GL_VERTEX_ARRAY);
      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
      glDisable(GL_TEXTURE_2D);
     
.
.
.
}