سؤال

وأنا استدعاء هذه الدالة مرة واحدة في إطار واستغرق بلدي FPS من> 400 إلى 33. لماذا؟

sw blt(const PtRect *dstRect, Texture *src, const PtRect *srcRect, RenderDevice::bltFlags flags=RenderDevice::bltDefault)
{
    assert(src);
    GL_Texture *glsrc = dynamic_cast<GL_Texture*>(src);
    if (glsrc == 0)
        return -1;

    PtRect srcRect2(0, 0, src->width, src->height);
    if (srcRect == 0)
        srcRect = &srcRect2;

    PtRect dstRect2(0, 0, srcRect->makeWidth(), srcRect->makeHeight());
    if (dstRect == 0)
        dstRect = &dstRect2;

    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, *glsrc->getTex());

    glBegin( GL_QUADS );
    glNormal3f( 0.0f, 0.0f, 1.0f );
    for (size_t i=0; i<350; i++)
    {
        glTexCoord2f( srcRect->left /src->width, srcRect->top/src->height);    glVertex2f(dstRect->left,  dstRect->top);
        glTexCoord2f( srcRect->right/src->width, srcRect->top/src->height);    glVertex2f(dstRect->right, dstRect->top);
        glTexCoord2f( srcRect->right/src->width, srcRect->bottom/src->height); glVertex2f(dstRect->right, dstRect->bottom);
        glTexCoord2f( srcRect->left /src->width, srcRect->bottom/src->height); glVertex2f(dstRect->left,  dstRect->bottom);
    }
    glEnd();
    return 0;
}
هل كانت مفيدة؟

المحلول

لأداء يجب عليك تحميل القوام الخاصة بك في وظيفة الحرف الأول واستخدام القائمة لعرض ثم في وقت لاحق على تقديم الوظيفة الرئيسية، على سبيل المثال:

// Generate texture object ID
glGenTextures(1, img);
glBindTexture(GL_TEXTURE_2D, img);

// Set Texture mapping parameters
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);

LoadBMP("texture.bmp");

وبعد ذلك على تقديم الوظيفة الرئيسية لديك شيء من هذا القبيل:

// Front face of Cube
glBindTexture(GL_TEXTURE_2D, img);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-fSize, fSize, fSize);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-fSize, -fSize, fSize);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(fSize,-fSize, fSize);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(fSize,fSize, fSize);
glEnd();

وكما ترون يمكنك لف الملمس على المعلمات بدلا من تكرار ذلك مرارا وتكرارا في حلقة.

نصائح أخرى

ومن الصعب القول من دون مزيد من التفاصيل، مشاكل محتملة يمكن أن يستخدم نسيج كبير جدا، مما تسبب في fallbacks البرامج في برنامج التشغيل الخاص بك. لك أيضا يبدو أن حلقة 350 مرة دون سبب واضح.

وأنت قد تكون قادرة على تحسين الأداء من خلال بناء مجموعة من البيانات ثم استدعاء glDrawArrays بدلا من إصدار كل زوج glTexCoord / glVertex فردي

وربما كنت لا تستخدم القوام مع من قوة 2 (على سبيل المثال 1024X768 بدلا من 1024x512)؟

ويبدو أنك رسم رباعية على الشاشة 350 مرة لسبب ما. إذا كان هذا هو وضع ملء الشاشة، ثم التركيب كل بكسل على الشاشة 350 مرة لا بد إطار الإضرار أدائك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top