我一直在使用OpenGL和SDL基於瓷磚繪製地圖的方法。最後,我編寫了代碼,但是當我執行繪製25x16瓦片地圖的基本程序時,我檢查了CPU的使用情況,它表示消耗25%,但沒有繪製地圖消耗CPU的1%。瓷磚地圖使用OpenGL和SDL的CPU很多
因此存在另一種繪製地圖的方法,或者爲什麼使用CPU這麼高。
這是繪製地圖的代碼。
void CMapManager::drawMap(Map *map)
{
vector<ImagePtr> tempImages = CGameApplication::getInstance()->getGameApp()->getImages();
GLuint texture = tempImages.at(1)->getTexture();
glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
for (int i = 0; i < map->getHeight(); i++)
{
for (int j = 0; j < map->getWidth(); j++)
{
ImagePtr imgDraw = tempImages.at(map->getMapTiles()[i][j]->getTypeTile());
glTexCoord2i(0, 0);
glVertex3f(imgDraw->getPosX() + (imgDraw->getWidth()*j), imgDraw->getPosY() + (imgDraw->getHeight()*i), 0.f);
//Bottom-left vertex (corner)
glTexCoord2i(1, 0);
glVertex3f(imgDraw->getOffsetX() + (imgDraw->getWidth()*j), imgDraw->getPosY() + (imgDraw->getHeight()*i), 0.f);
//Bottom-right vertex (corner)
glTexCoord2i(1, 1);
glVertex3f(imgDraw->getOffsetX() + (imgDraw->getWidth()*j), imgDraw->getOffsetY() + (imgDraw->getHeight()*i), 0.f);
//Top-right vertex (corner)
glTexCoord2i(0, 1);
glVertex3f(imgDraw->getPosX() + (imgDraw->getWidth()*j), imgDraw->getOffsetY() + (imgDraw->getHeight()*i), 0.f);
}
}
glEnd();
glDisable(GL_BLEND);
}
而且在這個方法我調用該函數:
void CGameApplication::renderApplication()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
vector<ImagePtr> tempImages = GApp->getImages();
vector<ImagePtr>::iterator iterImage;
for (iterImage = tempImages.begin(); iterImage != tempImages.end(); ++iterImage)
{
CImageM->drawSprites((*iterImage)->getTexture(), (*iterImage)->getPosX(), (*iterImage)->getPosY(),
(*iterImage)->getOffsetX(), (*iterImage)->getOffsetY());
}
vector<TextPtr> tempTexts = GApp->getTexts();
vector<TextPtr>::iterator iterText;
for (iterText = tempTexts.begin(); iterText != tempTexts.end(); ++iterText)
{
CTextM->drawFonts((*iterText));
}
CMapM->drawMap(GApp->getCurrentMap());
glDisable(GL_TEXTURE_2D);
}
我已經設置了定時,這個功能後:
GameApplication->getCKeyboardHandler()->inputLogic();
GameApplication->renderApplication();
SDL_GL_SwapBuffers();
GameApplication->getGameApp()->getTimer()->delay();
和延時功能:
void Timer::delay()
{
if(this->getTicks() < 1000/FRAMES_PER_SECOND)
{
SDL_Delay((1000/FRAMES_PER_SECOND) - this->getTicks());
}
}
const FRAMES_PER_SECOND現在是5點。
併爲轉換圖像GL紋理的功能是:手的幫助之前
GLuint CImageManager::imageToGLTexture(std::string name)
{
GLuint texture;
SDL_Surface *surface;
GLenum texture_format;
GLint nOfColors;
if ((surface = IMG_Load(name.c_str()))) {
// Check that the image's width is a power of 2
if ((surface->w & (surface->w - 1)) != 0) {
printf("warning: image.bmp's width is not a power of 2\n");
}
// Also check if the height is a power of 2
if ((surface->h & (surface->h - 1)) != 0) {
printf("warning: image.bmp's height is not a power of 2\n");
}
// get the number of channels in the SDL surface
nOfColors = surface->format->BytesPerPixel;
if (nOfColors == 4) // contains an alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGBA;
else
texture_format = GL_BGRA_EXT;
}
else if (nOfColors == 3) // no alpha channel
{
if (surface->format->Rmask == 0x000000ff)
texture_format = GL_RGB;
else
texture_format = GL_BGR_EXT;
}
else {
printf("warning: the image is not truecolor.. this will probably break\n");
// this error should not go unhandled
}
SDL_SetAlpha(surface, 0, 0);
// Have OpenGL generate a texture object handle for us
glGenTextures(1, &texture);
// Bind the texture object
glBindTexture(GL_TEXTURE_2D, texture);
// Set the texture's stretching properties
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// Edit the texture object's image data using the information SDL_Surface gives us
glTexImage2D(GL_TEXTURE_2D, 0, nOfColors, surface->w, surface->h, 0,
texture_format, GL_UNSIGNED_BYTE, surface->pixels);
}
else {
printf("SDL could not load the image: %s\n", SDL_GetError());
SDL_Quit();
exit(1);
}
if (surface) {
SDL_FreeSurface(surface);
}
return texture;
}
感謝。
這並不壞......嘗試運行一些其他3d應用程序,並在渲染時查看CPU使用情況。 – AJG85
我運行一些基本的3D應用程序,並使用20%的CPU,15%的CPU,最多30%的CPU,但這就是爲什麼我擔心我的應用程序是2D的,它還沒有完成,這意味着它將使用更多中央處理器。所以這是正常的? –
不成熟的優化是魔鬼。設計,編碼,測試和配置文件,以確定您的代碼在您的項目完成時可以優化哪些部分。 – AJG85