2013-02-20 20 views
7

Tôi có một trang đang sử dụng nhiều ngữ cảnh webgl, một ngữ cảnh cho mỗi canvas. canvases có thể được tải lại, thay đổi kích thước, v.v. mỗi lần tạo ngữ cảnh mới. Nó hoạt động cho một số tải lại, nhưng cuối cùng khi tôi cố gắng tạo ra một bối cảnh mới, nó trả về một giá trị null. Tôi cho rằng tôi hết bộ nhớ.Xóa ngữ cảnh WebGL

Tôi muốn có thể xóa các ngữ cảnh mà tôi không còn sử dụng để tôi có thể khôi phục bộ nhớ và sử dụng nó cho các ngữ cảnh mới của tôi. Có cách nào để làm điều này không? Hoặc là có cách nào tốt hơn để xử lý nhiều canvas?

Cảm ơn.

+0

Cuộc gọi getContext() trả về giá trị rỗng, vì vậy lỗi xảy ra khi tôi cố gắng đặt chế độ xem lỗi do đối tượng là rỗng. – user2089247

+0

Vâng, bạn nên kiểm tra xem ngữ cảnh của bạn có hợp lệ không trước khi thực hiện _anything_ khác sau khi bạn gọi đến 'getContext()' – Aesthete

+0

Không thành công khi ngữ cảnh ~ 200 được tạo. 199 đầu tiên là đẹp và tuyệt vời. Mã là khá đơn giản. – user2089247

Trả lời

5

Đây là một lỗi từ lâu trong Chrome và WebKit

http://code.google.com/p/chromium/issues/detail?id=124238

Không có cách nào để "xóa" một bối cảnh trong WebGL. Các bối cảnh bị xóa bởi bộ sưu tập rác bất cứ khi nào hệ thống xung quanh nó. Tất cả các tài nguyên sẽ được giải phóng tại thời điểm đó nhưng tốt nhất là bạn nên xóa tài nguyên của chính mình thay vì chờ trình duyệt xóa chúng.

Như tôi đã nói đây là lỗi. Nó cuối cùng sẽ được sửa nhưng tôi không có ETA.

Tôi khuyên bạn không nên xóa canvas. Giữ chúng xung quanh và tái sử dụng chúng.

Một đề xuất khác sẽ cho chúng tôi biết lý do bạn cần 200 canvas. Có lẽ vấn đề bạn đang cố gắng giải quyết sẽ được giải quyết tốt hơn theo một cách khác.

2

Tôi sẽ giả sử, cho đến khi bạn giải phóng tất cả các tài nguyên được đính kèm với ngữ cảnh của bạn, nội dung nào đó sẽ vẫn giữ tham chiếu đến nó và do đó nó sẽ vẫn tồn tại.

Một số điều cần thử:

  • Here is some debug gl code. Có một chức năng đó để thiết lập lại một bối cảnh để nó trạng thái ban đầu. Hãy thử điều đó trước khi xóa canvas nó thuộc về.

  • Đó là có thể rằng một số hệ thống sự kiện có thể giữ tham chiếu đến ngữ cảnh của bạn, giữ chúng trong trạng thái zombie.

  • Bạn có xóa canvas của mình khỏi DOM không? Tôi chắc chắn có giới hạn về tài nguyên mà trang có thể duy trì trong một trường hợp.

SO đã phàn nàn rằng chuỗi nhận xét của chúng tôi đã lâu hơn một chút. Hãy thử những điều này đầu tiên và cho tôi biết nếu nó giúp.

+0

Mã gỡ lỗi đã giúp. Mọi thứ tốt hơn nhiều với việc theo dõi các ngữ cảnh và đôi khi làm sạch tất cả chúng bằng WebGLDebugUtils.resetToInitialS tate (gl) ;, sau đó xóa canvases, sau đó xóa các ngữ cảnh. – user2089247

+1

Liên kết đó bị hỏng, nhưng mã cũng được lưu trữ tại https://code.google.com/p/webglsamples/source/browse/khronos/webgl-debug.js?name=211f7fbdc9&r=211f7fbdc9752db2540432c91f6ec266879d88d4#267 – orlade