【发布时间】:2018-12-18 21:44:51
【问题描述】:
我正在寻找有关 Dart 2 中内部渲染循环的最佳/最小结构的想法,用于 2d 游戏(如果这部分很重要的话)。
澄清/说明:每种框架/语言都有一种有效的方法来: 1)处理时间。 2) 渲染到屏幕上(通过内存、画布、图像或其他方式)。
例如,here is someone that answered this for the C# language。作为 Flutter / Dart 的新手,我的第一次尝试(如下)失败了,截至目前,我无法确定问题出在哪里。
我在这方面找遍了上下,没有找到任何帮助,所以如果你能提供帮助,我将永远感激你。
“byu/inu-no-policemen”(有点旧)在 Reddit 上有一个帖子。我用这个开始。我怀疑它正在破坏垃圾收集器或泄漏内存。
这是我目前所拥有的,但它很快就崩溃了(至少在调试器中):
import 'dart:ui';
import 'dart:typed_data';
import 'dart:math' as math;
import 'dart:async';
main() async {
var deviceTransform = new Float64List(16)
..[0] = 1.0 // window.devicePixelRatio
..[5] = 1.0 // window.devicePixelRatio
..[10] = 1.0
..[15] = 1.0;
var previous = Duration.zero;
var initialSize = await Future<Size>(() {
if (window.physicalSize.isEmpty) {
var completer = Completer<Size>();
window.onMetricsChanged = () {
if (!window.physicalSize.isEmpty) {
completer.complete(window.physicalSize);
}
};
return completer.future;
}
return window.physicalSize;
});
var world = World(initialSize.width / 2, initialSize.height / 2);
window.onBeginFrame = (now) {
// we rebuild the screenRect here since it can change
var screenRect = Rect.fromLTWH(0.0, 0.0, window.physicalSize.width, window.physicalSize.height);
var recorder = PictureRecorder();
var canvas = Canvas(recorder, screenRect);
var delta = previous == Duration.zero ? Duration.zero : now - previous;
previous = now;
var t = delta.inMicroseconds / Duration.microsecondsPerSecond;
world.update(t);
world.render(t, canvas);
var builder = new SceneBuilder()
..pushTransform(deviceTransform)
..addPicture(Offset.zero, recorder.endRecording())
..pop();
window.render(builder.build());
window.scheduleFrame();
};
window.scheduleFrame();
window.onPointerDataPacket = (packet) {
var p = packet.data.first;
world.input(p.physicalX, p.physicalY);
};
}
class World {
static var _objectColor = Paint()..color = Color(0xa0a0a0ff);
static var _s = 200.0;
static var _obejectRect = Rect.fromLTWH(-_s / 2, -_s / 2, _s, _s);
static var _rotationsPerSecond = 0.25;
var _turn = 0.0;
double _x;
double _y;
World(this._x, this._y);
void input(double x, double y) { _x = x; _y = y; }
void update(double t) { _turn += t * _rotationsPerSecond; }
void render(double t, Canvas canvas) {
var tau = math.pi * 2;
canvas.translate(_x, _y);
canvas.rotate(tau * _turn);
canvas.drawRect(_obejectRect, _objectColor);
}
}
【问题讨论】:
-
真的不清楚你在问什么。如果您看到崩溃,我建议您提交一个错误。
-
@IanHickson 我添加了更多解释。如果您仍然不清楚,请详细说明。
标签: optimization dart flutter game-engine skia