Просмотр полной версии : Что лучше: дробные или целые значения координат?
Здравствуйте. Меня всегда интересовало, что быстрее сделать флешу: располагать объект каждый раз по дробным координатам или сначала отсекать дробную часть и располагать объект по целым? Объект представляет собой, скажем, падающую звезду.
gloomyBrain
17.03.2010, 02:42
А без разницы, если объект в векторной графике. При рендеринге векторной графики на один логический пиксель (пиксель экрана) приходится 400 "внутренних" пикселей (твипов).
По поводу быстрее не знаю, но удобнее использовать целые координаты.
При рендеринге векторной графики на один логический пиксель (пиксель экрана) приходится 400 "внутренних" пикселей (твипов).Откуда такая информация?
Твип вообще-то равен 1/20 пикселя.
gloomyBrain
17.03.2010, 11:11
Откуда такая информация?
swf_file_format_spec_v10.pdf (http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v10.pdf)
For example, a rectangle 800 twips wide by 400 twips high is rendered as 40 by 20 logical pixels
800 x 400 = 320000 твипов
40 x 20 = 800 пикселей
320000 / 800 = 400 (твипов на пиксель)
PS
Как бы вы разделили квадрат на 20 квадратных частей?
Без разницы для векторного. А для растра?
gloomyBrain
17.03.2010, 12:28
А для растра - хм... ну тоже без разницы =)
Просто если вы делаете
var myBitmap:Bitmap;
// ...
myBitmap.pixelSnapping = PixelSnapping.ALWAYS;
то размещение в нецелых координатах просто теряет смысл. В данном случае рендеринг будет заключаться в прямом "перекидывании" пикселей на экран, без какого-либо сглаживания.
Это чревато ускорением работы FP. То же самое можно сказать и про cashAsBitmap - однажды отрендеренное в растр не будет каждый кадр обрабатываться векторным рендером, а просто будет "перекидываться" на экран. Правда, памяти займет по 4 байта на пиксель.
Ой, что-то я отвлекся... =)
В общем и целом, особой разницы нет - дробные координаты или целочисленные. Как и сказал iNils - проще использовать целые, ибо к чему Вам субпиксельная точность?
Zebestov
17.03.2010, 12:46
800 x 400 = 320000 твипов
40 x 20 = 800 пикселей
320000 / 800 = 400 (твипов на пиксель)
это что за занимательная арифметика такая 0о
т.е. на основании подсчета метров в квадратном километре (http://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%B8%D0%BB%D0%BE%D0%BC%D0%B5%D1%82%D1%80) ты станешь утверждать, что в километре миллион метров?
все правильно etc подбил =) а ты просто подсчитал количество квадратных твипов на квадратный пиксель... все, моск паламалсо.
iflamberg
17.03.2010, 13:00
Если не использовать pixelSnapping, то обязательно используйте целые координаты, иначе будете ловить вот такие баги (http://iflamberg.net/ru/blog/2009-12-06/pixel_precision).
Спасибо большое. Я раньше отбрасывал дробную часть - а это лишняя операция, кушающая какую-то часть процессора, если нет разницы, так?
Добавлено через 1 минуту
2 iflamberg
Это да, но с точки зрения красивости на экране
gloomyBrain
17.03.2010, 13:28
@Zebestov
т.е. на основании подсчета метров в квадратном километре ты станешь утверждать, что в километре миллион метров
Вы удивитесь, но - да! В одном квадратном километре миллион квадратных метров
Пиксель по определению квадратный. То есть у него всегда 2 измерения. Аналогия с метрами немного не подходит, представьте, что мы говорим об акрах (или гектарах (или сотках)) - то есть о самостоятельной единице площади.
Да, стану утверждать, что длина одного пикселя в 20 раз больше длины одного твипа. Да, стану утверждать, что ширина одного пикселя в 20 больше ширины одного твипа.
Да, стану утверждать, что площадь одного пикселя в 400 раз (а не в 20) больше площади одного твипа.
И, да, буду утверждать, что "1/20 пикселя" - это отношение сторон твипа и пикселя, но никак не фактический размер, про который я писал.
Пример доведения мысли до абсурда.
Zebestov
17.03.2010, 14:17
)) ну это лирика. безусловно пиксель — это, упрощенно говоря, "квадратик". но использовать его в качестве меры площади не приходилось ни мне, ни другим разработчикам никогда. за исключением обсуждения алгоритмов сглаживания растровой графики, например, или чего-то подобного.
когда ты отвечаешь человеку, что он может позиционировать спрайт с точностью до 1/400 пикселя, ты заблуждаешься сам и вводишь в заблуждение коллегу.
придется ждать когда кто-то на форуме спросит: "а кто знает сколько твипов в картинке WWW на HHH пикселей!?" — вот тут твой звездный час =)
gloomyBrain
17.03.2010, 14:58
когда ты отвечаешь человеку, что он может позиционировать спрайт с точностью до 1/400 пикселя, ты заблуждаешься сам и вводишь в заблуждение коллегу.
package {
import flash.display.Sprite;
import flash.events.Event;
/**
* ...
* @author gloomyBrain
*/
public class Main extends Sprite {
public static const stepSize:Number = 1 / 400; // == 0.0025 pixels == 1/20 twips
public var stepCount:int;
public var myShape:MyShape;
public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
this.stepCount = 0;
this.myShape = new MyShape();
this.addChild(this.myShape);
this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(evt:Event):void {
this.twipCount++;
this.myShape.x += stepSize * this.stepCount;
}
}
}
:D
Да абсурд, не спорю я =) Но можно
А изначально я ответил на реплику, оспаривающую (как мне показалось) факт того, что на 1 логический пиксель приходится /* внутри помещается */ 400 твипов. Если эта реплика ничего не оспаривает, то и мысль до абсурда я доводить не хотел.
Извините, если кого задел.
feelgood66
17.03.2010, 23:47
если двигать растр применяя какието вычисления аля физические законы.. то плавности движения целыми числами не добьетесь. Я делаю так: пока что-то творится - используются дробные величины, по факту завершения процесса - выставляю по целочисленным, округнелнным координатам. (иногда бывает некоторое "дергание", но его правда замечает только сам flash разработчик, потому что знает куда смотреть ) )
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.