2013-02-17 14 views
6

Widzę dziwne zachowanie po zastosowaniu kilku przekształceń elementów zawierających obrazy tła w przeglądarce Chrome.Obraz tła Chrome "Bleeds" Krawędzie z transformacją skali CSS Zastosowane

Próbuję zbudować grę z tłem na całym ekranie i skalowaną postacią, która porusza się po tym tle. Postać ma wiele klatek animacji i pokazuję każdą ramkę przesuwając pozycję x lub y w tle w podobny sposób do popularnych technik sprinterowania CSS.

Problem polega na tym, że widzę górną krawędź lub lewą krawędź sąsiednich klatek na obrazie mojej postaci. Teraz dzieje się to tylko w pewnych skalach, ale jest wyraźnie widoczne i rozprasza. Do celów demonstracyjnych używam obrazu o rozmiarze 364x1328 z dwiema ramkami. Górna ramka zawiera czarne pudełko bez czerwieni w granicach 364x664. Dolna ramka jest solidnie czerwona. Górna ramka z granicami wybrany jest pokazany w moim edytorze zdjęć po lewej i po wyjściu z Chrome jest wklejany po prawej:

Frame boundaries on the left (364x664), output from Chrome on the right

na wyjściu z Chrome, można wyraźnie zobaczyć czerwoną granicę w Dolny. Biorąc pod uwagę, że mój obraz tła jest zawarty w pudełku 364x664, oczekuję, że będą widoczne tylko piksele widoczne w tym polu. Innymi słowy, chciałbym zobaczyć, co widzę w scale(1), ale pomniejszyć. Wygląda na to, że Chrome z jakiegoś powodu zmienia resampling obrazu tła.

Aby demonstrując proste, podaję JS Fiddle: http://jsfiddle.net/CL5Gh/

<!DOCTYPE html> 
<html> 
<head> 
<style> 

#b 
{ 
    -webkit-transform: scale(0.4775); 
    -webkit-transform-origin: 0 0; 
} 

#d 
{ 
    height: 664px; 
    width: 364px; 
    background-image: url(data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%01l%00%00%050%02%03%00%00%00%1A%F2%87%B5%00%00%00%2CtEXtCreation%20Time%00Sun%2017%20Feb%202013%2022%3A08%3A49%20%2B1000%FC%E8%C07%00%00%00%07tIME%07%DD%02%11%0B%1B%0B%C2%A0%3B8%00%00%00%09pHYs%00%00%1E%C1%00%00%1E%C1%01%C3iTS%00%00%00%04gAMA%00%00%B1%8F%0B%FCa%05%00%00%00%09PLTE%00%00%00%00%00%00%FF%00%00%3D%FB%DD-%00%00%00%01tRNS%00%40%E6%D8f%00%00%01%A4IDATx%DA%ED%CC1%0D%000%08%000%9EI%C4%24*11%C8%92%B5%02%1A%01%00%00%00%00%00%FC%E4%E45n%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%ED%06%00%00%00%00%00%DESs%DCn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%DB%EDv%BB%DDn%B7%7B%F3n%80%3C%CA%A7%B6%23%99%BC%00%00%00%00IEND%AEB%60%82); 
    -webkit-transform: scale(0.4375); 
} 

</style> 
</head> 
<body> 
    <div id="b"> 
    <div id="d"> 
    </div> 
    </div> 
</body> 
</html> 

Teraz nie jestem pewien, czy to karta graficzna lub maszyna zależny w jakiś sposób. W skrzypcach zobaczysz dwie transformacje skali. To emuluje to, co dzieje się w mojej grze. Pierwszym z nich jest skalowanie tła, a drugie skalowanie głównej postaci.

Byłbym wdzięczny za każdą pomoc. Rozważałem dopełnienie każdej klatki z 50px (ile to wystarczy?), Aby wyeliminować problem, ale to wydaje się strasznie hackowate i chciałbym uzyskać prawdziwą odpowiedź.

+0

mam spotkać ten sam problem. Wygląda na to, że jest to błąd przeglądarki Chrome, ponieważ najnowsze przeglądarki Safari i Firefox sprawiają, że obraz jest idealnie czysty i ostry. – gondo

Odpowiedz

0

Wygląda na to, że transformacje CSS mogą interpolować w pozycjach subpikseli, więc jeśli pozycja twojego elementu nie pasuje do pikseli, zobaczysz "efekt dubstepu" (patrz http://paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/).

Jako, że scale nie można emulować za pomocą CSS2 (w przeciwieństwie do translate w artykule) obawiam się, że nie ma rozwiązania.

Jeśli konkretna zasada CSS nie istnieje lub nie będzie istnieć, szukam jej.

EDIT: -webkit-backface-visibility: hidden; rade na chromie, nie wiem dlaczego ...

+0

Dzięki! Działa to, chociaż w pewien sposób zmienia algorytm zmiany rozmiaru. Krawędzie wydają się mniej płynne i nie wiem dlaczego. –

+0

Ups, myślę, że mówiłem zbyt szybko. Chociaż powoduje to, że obraz jest ostrzejszy, wciąż są pewne przypadki, w których dostaję krwawienia z zewnątrz kadru. Myślę, że to, czego naprawdę pragnę, to coś, co naśladuje -moz-image-rect, aby podzielić obraz. –