do not reallocate the texture data on every update; use glTexSubImage2D instead
This commit is contained in:
@@ -251,11 +251,13 @@ void SpriteAtlas::update(const Sprite &sprite) {
|
||||
}
|
||||
|
||||
void SpriteAtlas::bind(bool linear) {
|
||||
bool first = false;
|
||||
if (!texture) {
|
||||
glGenTextures(1, &texture);
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
first = true;
|
||||
} else {
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
}
|
||||
@@ -270,17 +272,31 @@ void SpriteAtlas::bind(bool linear) {
|
||||
if (dirty) {
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
allocate();
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, // GLenum target
|
||||
0, // GLint level
|
||||
GL_RGBA, // GLint internalformat
|
||||
width * pixelRatio, // GLsizei width
|
||||
height * pixelRatio, // GLsizei height
|
||||
0, // GLint border
|
||||
GL_RGBA, // GLenum format
|
||||
GL_UNSIGNED_BYTE, // GLenum type
|
||||
data // const GLvoid * data
|
||||
);
|
||||
|
||||
if (first) {
|
||||
glTexImage2D(
|
||||
GL_TEXTURE_2D, // GLenum target
|
||||
0, // GLint level
|
||||
GL_RGBA, // GLint internalformat
|
||||
width * pixelRatio, // GLsizei width
|
||||
height * pixelRatio, // GLsizei height
|
||||
0, // GLint border
|
||||
GL_RGBA, // GLenum format
|
||||
GL_UNSIGNED_BYTE, // GLenum type
|
||||
data // const GLvoid * data
|
||||
);
|
||||
} else {
|
||||
glTexSubImage2D(GL_TEXTURE_2D, // GLenum target
|
||||
0, // GLint level
|
||||
0, // GLint xoffset
|
||||
0, // GLint yoffset
|
||||
width * pixelRatio, // GLsizei width
|
||||
height * pixelRatio, // GLsizei height
|
||||
GL_RGBA, // GLenum format
|
||||
GL_UNSIGNED_BYTE, // GLenum type
|
||||
data // const GLvoid *pixels
|
||||
);
|
||||
}
|
||||
|
||||
#if defined(DEBUG)
|
||||
// platform::show_color_debug_image("Sprite Atlas", data, width, height, width * pixelRatio, height * pixelRatio);
|
||||
@@ -291,6 +307,10 @@ void SpriteAtlas::bind(bool linear) {
|
||||
|
||||
SpriteAtlas::~SpriteAtlas() {
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
|
||||
glDeleteTextures(1, &texture);
|
||||
texture = 0;
|
||||
|
||||
if (data) {
|
||||
free(data);
|
||||
data = nullptr;
|
||||
|
||||
Reference in New Issue
Block a user