Pracuję z elementem canvas o wysokości 600
do 1000
pikseli i szerokości kilkudziesięciu lub setek tysięcy pikseli. Jednak po określonej liczbie pikseli (oczywiście nieznanej) płótno nie wyświetla już kształtów, które narysowałem za pomocą JS.
Czy ktoś wie, czy istnieje limit?
Przetestowano zarówno w przeglądarce Chrome 12, jak i Firefox 4.
javascript
html
canvas
seriousdev
źródło
źródło
tens OR hundreds of thousands
...Odpowiedzi:
Zaktualizowano 10/13/2014
Wszystkie testowane przeglądarki mają ograniczenia dotyczące wysokości / szerokości elementów canvas, ale wiele przeglądarek ogranicza również łączną powierzchnię elementu canvas. Limity są następujące dla przeglądarek, które mogę przetestować:
Chrom:
Maksymalna wysokość / szerokość: 32767 pikseli
Maksymalny obszar: 268 435 456 pikseli (np. 16 384 x 16 384)
Firefox:
Maksymalna wysokość / szerokość: 32767 pikseli
Maksymalny obszar: 472 907 776 pikseli (np. 22 528 x 20 992)
TO ZNACZY:
Maksymalna wysokość / szerokość: 8192 piksele
Maksymalny obszar: nie dotyczy
IE Mobile:
Maksymalna wysokość / szerokość: 4096 pikseli
Maksymalny obszar: nie dotyczy
Inny:
W tej chwili nie mogę testować innych przeglądarek. Dodatkowe ograniczenia można znaleźć w innych odpowiedziach na tej stronie.
Przekroczenie maksymalnej długości / szerokości / obszaru w większości przeglądarek sprawia, że płótno nie nadaje się do użytku. (Zignoruje wszelkie polecenia rysowania, nawet w obszarze użytkowym). IE i IE Mobile będą honorować wszystkie polecenia rysowania w przestrzeni użytkowej.
źródło
<canvas>
elementów i automatycznie stosowało instrukcje rysowania do odpowiedniego kontekstu.Wystąpiły błędy braku pamięci w przeglądarce Firefox przy wysokości płótna większej niż 8000, Chrome wydaje się radzić sobie znacznie wyżej, przynajmniej do 32000.
EDYCJA: Po wykonaniu kilku kolejnych testów znalazłem bardzo dziwne błędy w przeglądarce Firefox 16.0.2.
Po pierwsze, wydaje mi się, że zachowuje się inaczej z płótna w pamięci (utworzonego w javascript), w przeciwieństwie do płótna zadeklarowanego w formacie HTML.
Po drugie, jeśli nie masz odpowiedniego tagu HTML i meta zestawu znaków, kanwa może być ograniczona do 8196, w przeciwnym razie możesz przejść do 32767.
Po trzecie, jeśli uzyskasz kontekst 2D płótna, a następnie zmienisz rozmiar płótna, możesz być również ograniczony do 8196. Proste ustawienie rozmiaru płótna przed przechwyceniem kontekstu 2d pozwala uzyskać do 32767 bez błędów pamięci.
Nie udało mi się konsekwentnie wyłapać błędów pamięci, czasami jest to tylko ładowanie pierwszej strony, a potem działają kolejne zmiany wysokości. To jest plik html, który testowałem za pomocą http://pastebin.com/zK8nZxdE .
źródło
Maksymalny rozmiar obszaru roboczego w systemie iOS (szerokość x wysokość):
testowany w marcu 2014 r.
źródło
Aby trochę rozwinąć odpowiedź @FredericCharette: zgodnie z przewodnikiem po safari w sekcji „Poznaj limity zasobów iOS”:
Dlatego każda zmiana rozmiaru wynosząca 5242880 (5 x 1024 x 1024) pikseli będzie działać na urządzeniach z dużą pamięcią, w przeciwnym razie będzie to 3145728 pikseli.
Przykład dla płótna o rozdzielczości 5 megapikseli (szerokość x wysokość):
i tak dalej..
Największe płótna KWADRATOWE to („MiB” = 1024x1024 bajtów):
źródło
Aktualizacja na rok 2018:
W miarę upływu czasu ograniczenia płótna uległy zmianie. Niestety, to, co się nie zmieniło, to fakt, że przeglądarki nadal nie dostarczają informacji o ograniczeniach rozmiaru kanwy za pośrednictwem interfejsu API Canvas.
Dla tych, którzy chcą programowo określić maksymalny rozmiar obszaru roboczego przeglądarki lub przetestować obsługę niestandardowych wymiarów kanwy, wypróbuj rozmiar płótna .
Z dokumentów:
Łącze do wersji demonstracyjnej i wyniki testów są dostępne w pliku README , a także w sekcji znanych problemów, która dotyczy wydajności i maszyn wirtualnych.
Pełna jawność, jestem autorem biblioteki. Stworzyłem go w 2014 roku i niedawno ponownie wróciłem do kodu nowego projektu związanego z płótnem. Byłem zaskoczony, gdy zauważyłem ten sam brak dostępnych narzędzi do wykrywania ograniczeń rozmiaru płótna w 2018 roku, więc zaktualizowałem kod, opublikowałem go i mam nadzieję, że pomoże to innym napotkać podobne problemy.
źródło
Zgodnie ze specyfikacjami w3 , interfejs szerokość / wysokość jest bez znaku długości - więc od 0 do 4 294 967 295 (jeśli dobrze pamiętam tę liczbę - może być kilka).
EDYCJA: Dziwne, jest napisane unsigned long, ale test pokazuje tylko normalną wartość long, jako max: 2147483647. Jsfiddle - 47 działa, ale do 48 i wraca do domyślnych.
źródło
Mimo że płótno pozwoli Ci ustawić wysokość = 2147483647, po rozpoczęciu rysowania nic się nie stanie
Rysowanie dzieje się tylko wtedy, gdy przywracam wysokość do 32767
źródło
iOS ma różne ograniczenia.
Korzystając z symulatora iOS 7 udało mi się zademonstrować, że limit to 5MB:
ale jeśli zwiększę rozmiar obszaru roboczego o jeden rząd pikseli:
źródło
Na PC
- nie sądzę, że jest jakieś ograniczenie, ale tak, możesz wydostać się z wyjątku pamięci.
Na urządzeniach mobilnych -
Oto ograniczenia kanwy dla urządzeń mobilnych: -
Maksymalny rozmiar elementu Canvas to 3 megapiksele dla urządzeń z mniej niż 256 MB RAM i 5 megapikseli dla urządzeń z co najmniej 256 MB RAM.
Na przykład - jeśli chcesz obsługiwać starszy sprzęt Apple, rozmiar twojego płótna nie może przekraczać 2048 × 1464.
Mam nadzieję, że te zasoby pomogą ci się wyciągnąć.
źródło
Ograniczenia przeglądarki Safari (wszystkie platformy) są znacznie niższe.
Znane ograniczenia iOS / Safari
Na przykład miałem bufor płótna o wymiarach 6400 x 6400 pikseli z narysowanymi na nim danymi. Śledząc / eksportując zawartość i testując na innych przeglądarkach, mogłem zobaczyć, że wszystko jest w porządku. Ale w Safari pomijałoby rysowanie tego konkretnego bufora w moim głównym kontekście.
źródło
Próbowałem programowo określić limit: ustawienie rozmiaru płótna zaczynając od 35000, zmniejszanie o 100, aż zostanie znaleziony prawidłowy rozmiar. Na każdym kroku zapisuj prawy dolny piksel, a następnie go odczytuj. Działa - z ostrożnością.
Prędkość jest do zaakceptowania, jeśli zarówno szerokość lub wysokość jest ustawiany na pewną wartość w niskich (na przykład 10-200). Ten sposób:
get_max_canvas_size('height', 20)
.Ale jeśli zostanie wywołany bez szerokości lub wysokości
get_max_canvas_size()
, utworzone płótno jest tak duże, że odczytanie koloru POJEDYNCZEGO piksela jest bardzo powolne, aw IE powoduje poważne zawieszenie.Gdyby ten podobny test można było przeprowadzić bez odczytywania wartości piksela, prędkość byłaby akceptowalna.
Oczywiście najłatwiejszym sposobem wykrycia maksymalnego rozmiaru byłby natywny sposób zapytania o maksymalną szerokość i wysokość. Ale płótno to „standard życia”, więc może kiedyś nadejdzie.
http://jsfiddle.net/timo2012/tcg6363r/2/ ( Uwaga ! Twoja przeglądarka może się zawiesić!)
źródło
Kiedy używasz kanw WebGL, przeglądarki (w tym te desktopowe) nakładają dodatkowe ograniczenia na rozmiar bazowego bufora. Nawet jeśli płótno jest duże, np. 16 000 x 16 000, większość przeglądarek wyrenderuje mniejszy (powiedzmy 4096 x 4096) obraz i przeskaluje go w górę. Może to powodować brzydkie piksele itp.
Napisałem kod, aby określić ten maksymalny rozmiar za pomocą wyszukiwania wykładniczego, jeśli ktoś kiedykolwiek tego potrzebuje.
determineMaxCanvasSize()
to funkcja, która Cię interesuje.Również w jsfiddle https://jsfiddle.net/1sh47wfk/1/
źródło
Możesz go podzielić na kawałki iw javascript automatycznie dodać tyle mniejszych płócien, ile potrzeba, i narysować elementy na odpowiednim płótnie. Możesz w końcu zabraknąć pamięci, ale przekroczysz limit pojedynczego płótna.
źródło
Nie wiem, jak wykryć maksymalny możliwy rozmiar bez itteracji, ale możesz wykryć, czy dany rozmiar płótna działa, wypełniając piksel, a następnie odczytując kolor. Jeśli płótno nie zostało wyrenderowane, kolor, który otrzymasz, nie będzie pasował. W
kod częściowy:
źródło