Переход от растрового изображения к OpenGL - PullRequest
2 голосов
/ 12 апреля 2011

Хорошо, пора использовать OpenGL (gulp!) Для рендеринга спрайтов в моих приложениях (играх) и забыть Bitmap.draw и т. Д.

После просмотра сотен сайтов / блогов (ну, может быть), «объясняющих», как кодировать с помощью OpenGL, я наткнулся на кирпичную стену.

Проблема в том, что мои приложения в настоящий момент полностью работоспособны и находятся на Маркете, но мое последнее приложение было разработано на HTC Desire HD, и я получаю много сообщений о плохой производительности на менее мощных устройствах.

Очевидный маршрут - это переход на OpenGL. Все учебные сайты ориентированы на разработку с нуля. Это отлично подходит для любого, кто начинает новый проект, но мне нужно «ретро-подгонка» к моим приложениям. Я не хочу переписывать с нуля!

Кто-нибудь имел опыт этого? Любые мысли будут с благодарностью.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Недавно я сделал что-то похожее с моим приложением и получил большое преимущество в производительности.Многое из того, что вы «должны изменить», зависит от того, как структурировано ваше приложение.

Для меня самым сложным был перевод элементов пользовательского интерфейса, потому что мне пришлось заново сгенерировать всю логику «элемент управления касался» инастроить рендеринг текста.Ни одна из этих проблем не является достаточно жесткой, чтобы разбираться в сделках, но я бы избежал их, если вы можете.Поскольку ваше приложение уже только 2d, вы можете избежать самых сложных частей изучения OpenGL, связанных с трехмерным измерением!Я бы начал с настройки gl.SurfaceView.Используйте glOrtho для настройки экстентов вашего мира GL, если ваша игра уже была независимой от разрешения, она должна иметь представление о том, насколько широко экран каким-то «независимым» образом.Просто настройте glOrtho для использования тех же экстентов.

Я создал простой класс спрайтов, который я использовал для всего моего рендеринга.У Sprite был простой вершинный буфер в качестве членов, я просто сделал его прямоугольником 1 на 1, затем использовал шкалу, чтобы установить размер.(Так что если бы это было действительно 30x30, я бы установил масштаб на ScaleX = 30 ScaleY = 30).

Это выглядело примерно так

        ByteBuffer vbb = ByteBuffer.allocateDirect( mNumVerts * 2 * 4 );
        vbb.order( ByteOrder.nativeOrder() );
        mVtxBuf = vbb.asIntBuffer();

        vbb = ByteBuffer.allocateDirect( mNumVerts * 2 * 4 );
        vbb.order( ByteOrder.nativeOrder() );
        mTexBuf = vbb.asIntBuffer();

        mVtxBuf.put( -Fixed32.HALF ); mVtxBuf.put( -Fixed32.HALF ); mTexBuf.put( 0 ); mTexBuf.put( Fixed32.ONE );
        mVtxBuf.put(  Fixed32.HALF ); mVtxBuf.put( -Fixed32.HALF ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( Fixed32.ONE );
        mVtxBuf.put(  Fixed32.HALF ); mVtxBuf.put(  Fixed32.HALF ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( 0 );

        mVtxBuf.put( -Fixed32.HALF ); mVtxBuf.put( -Fixed32.HALF ); mTexBuf.put( 0 ); mTexBuf.put( Fixed32.ONE );
        mVtxBuf.put(  Fixed32.HALF ); mVtxBuf.put(  Fixed32.HALF ); mTexBuf.put( Fixed32.ONE ); mTexBuf.put( 0 );        
        mVtxBuf.put( -Fixed32.HALF ); mVtxBuf.put(  Fixed32.HALF ); mTexBuf.put( 0 ); mTexBuf.put( 0 );

        mVtxBuf.position( 0 );        
        mTexBuf.position( 0 );

(Fixed32.HALF просто 0,5 вс фиксированной точкой, вы можете просто использовать 0.5 и изменить вызовы Draw на FLOAT вместо FIXED)

С кодом рисования ...

        gl.glMatrixMode( GL10.GL_MODELVIEW );
        gl.glLoadIdentity();
        gl.glEnableClientState( GL10.GL_VERTEX_ARRAY );                 
        gl.glEnableClientState( GL10.GL_TEXTURE_COORD_ARRAY );

        gl.glColor4f( 1.0f * thing.getAlpha() , 1.0f * thing.getAlpha() , 1.0f * thing.getAlpha() , thing.getAlpha() );  

        gl.glTranslatef( thing.getX(), thing.getY(), thing.getZ() );
        gl.glScalef( thing.getXScale(), thing.getYScale(), thing.getZScale() );

        gl.glFrontFace( GL10.GL_CW );
        gl.glVertexPointer( 2, GL10.GL_FIXED, 0, mdl.getVtxBuf() );

        gl.glTexCoordPointer( 2, GL10.GL_FIXED, 0, mdl.getTexBuf() );
        // gl.glColorPointer( 4, GL10.GL_FLOAT, 0, mColorBuffer );
        gl.glDrawArrays( GL10.GL_TRIANGLES, 0, mdl.getVtxCount() ); 
0 голосов
/ 12 апреля 2011

Ну, я бы посоветовал вам заменить столько, сколько вам нужно, пока вы не закончили (= достаточно быстро).

Следовательно, очень важно знать, точно где ваша производительностьнеприемлемый.Профиль, профиль, профиль.

Конечно, есть некоторые вещи, которые вам всегда нужно будет реализовать, даже если вы просто хотите использовать Opengl для крошечной части игры.Создание контекста, загрузка текстур и т.д ...

...