Я ищу идеи относительно оптимальной / минимальной структуры для внутреннего цикла рендеринга в Dart 2 для 2-мерной игры (если эта часть имеет значение).
Разъяснение / объяснение: Каждый фреймворк / язык имеетЭффективный способ: 1) справиться со временем.2) Выполните рендеринг на экран (с помощью памяти, холста, изображения или чего-либо еще).
Например, здесь кто-то ответил на этот вопрос для языка C # .Будучи новичком во Flutter / Dart, моя первая попытка (ниже) не работает, и на данный момент я не могу сказать, где проблема.
Я искал все выше и ниже, но не нашел помощиэто, так что, если вы можете помочь, у вас есть моя вечная благодарность.
На Reddit есть сообщение 'byu / inu-no-Policemen' (немного старое).Я использовал это, чтобы начать.Я подозреваю, что это приводит к разрушению сборщика мусора или утечке памяти.
Это то, что у меня есть до сих пор, но оно довольно быстро падает (по крайней мере, в отладчике):
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);
}
}