2011-08-15 29 views
6

OpenGL lưu trữ kết cấu trong bao lâu?Android: OpenGL lưu trữ kết cấu trong bao lâu?

Bộ nhớ kết cấu có được tái chế khi bạn rời khỏi hoạt động không?

Ví dụ nếu tôi có đoạn mã sau:

mGL.glGenTextures(1, mTextures, 0); 
     mGL.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[0]); // A bound texture is 
                  // an active texture 

     //mGL.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmap.getWidth(),bitmap.getHeight(), 0, GL10.GL_RGBA, GL10.GL_FLOAT, textures); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0,GL10.GL_RGBA, bitmap, 0); 

     // create nearest filtered texture 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, 
       GL10.GL_LINEAR); // This is where the scaling algorithms are 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, 
       GL10.GL_LINEAR); // This is where the scaling algorithms are 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, 
       GL10.GL_CLAMP_TO_EDGE); 
     mGL.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, 
       GL10.GL_CLAMP_TO_EDGE); 
     GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

     //bitmap.recycle(); 
     Log.v("GLSurfaceView", "Loading Texture Finished"); 
     return mTextures[0]; 

gì thay đổi này sẽ làm mất hiệu lực giá trị trả về?

Tôi không muốn tải lại tất cả họa tiết của mình khi tôi trở lại hoạt động (nói rằng người đó có cuộc gọi điện thoại) vì nó thực sự làm chậm mọi thứ.

Cập nhật:

Tìm thấy thông tin này trong tài liệu Renderer, trong đó khẳng định câu trả lời đưa ra dưới đây bởi @svdree:

EGL Context Mất Có những tình huống mà vẽ bối cảnh EGL sẽ bị mất. Điều này thường xảy ra khi thiết bị tỉnh dậy sau khi đi ngủ. Khi bối cảnh EGL bị mất, tất cả tài nguyên OpenGL (chẳng hạn như kết cấu) được liên kết với ngữ cảnh đó sẽ tự động bị xóa. Để hiển thị chính xác, trình kết xuất phải tạo lại bất kỳ tài nguyên bị mất nào mà nó vẫn cần. Phương thức onSurfaceCreated (GL10, EGLConfig) là một nơi thuận tiện để thực hiện điều này.

đó có nghĩa là các kết cấu có liên quan đến bối cảnh EGL

Kể từ khi đăng câu hỏi này, tôi đã cố gắng để giải quyết vấn đề bằng cách hoạt động của tôi kế thừa từ một hoạt động cơ sở mà có một tham chiếu đến một GLRenderer tùy chỉnh. Về cơ bản, tôi có thể vượt qua OpenGLSurface View forward (tức là làm cho nó khởi tạo nó trong một hoạt động và sử dụng nó trong lần tiếp theo), nhưng một khi nó trải qua quy trình tắt máy của nó, nó không khởi động lại.

Tôi cũng nhận thấy rằng làm cho hoạt động của bạn trong suốt duy trì ngữ cảnh openGL bên dưới hoạt động minh bạch (có ý nghĩa, nhưng chỉ giúp cho các menu và như vậy). Tuy nhiên, tôi cho rằng có thể luôn có mọi hoạt động sau khi hoạt động openGL chỉ trong suốt một chút, do đó bảo toàn họa tiết trong nền trên tất cả các hoạt động của bạn (đây có thể là những gì tôi sẽ làm)

Trả lời

1

Khi bạn rời đi một hoạt động, bối cảnh OpenGL của bạn sẽ bị mất, có nghĩa là tất cả các kết cấu của bạn, các đối tượng đệm đỉnh vv sẽ cần phải được tạo lại. Điều này thường được thực hiện theo phương pháp onSurfaceCreated() của lớp GLSurfaceView.Renderer.

+0

tôi có thể chuyển ngữ cảnh sang hoạt động mới hay bằng cách nào đó để lưu nó. Tôi lo lắng về trường hợp ai đó nhận cuộc gọi và sau đó quay trở lại ứng dụng của tôi và tất cả các họa tiết phải tải lại. – tjb

+0

Mất ngữ cảnh, không thể lưu được. "Mất" một ngữ cảnh thường chỉ ra rằng hệ thống có cái gì đó khác để làm, hoặc một lỗi xảy ra, và yêu cầu bạn tạo lại tất cả các nguồn tài nguyên video. – ssube

+0

Đây là mẫu thiết kế phổ biến trong Android; bất cứ khi nào một hoạt động khác đến trước, bạn cần giải phóng tài nguyên của mình để hoạt động khác có thể sử dụng chúng (thực sự hữu ích trên các hệ thống có tài nguyên hạn chế). Đây là chức năng tích hợp trong GLSurfaceView. Tôi nghi ngờ bạn có thể làm việc xung quanh điều này bằng cách viết phiên bản GLSurfaceView của riêng bạn, nhưng tôi sẽ không khuyên bạn nên làm như vậy. Bên cạnh đó, nếu bạn ưu tiên cho những thứ thực sự có thể nhìn thấy khi tải lại tài nguyên của bạn, điều này không phải là chậm. – svdree

0

onPause() gửi hầu hết các trình xử lý OpenGL v.v. Chúc may mắn ở vùng đất OpenGL!

Các vấn đề liên quan