Я оставлю это здесь для всех остальных, по-видимому, это проблема браузера и графической карты.
mrdoob: графическая карта - только одна из причин, по которой контекст не может быть создан [112 ] blockquote>
https://github.com/mrdoob/three.js/issues/4927
Похоже, почему, если у кого-то еще нет других идей. .. Проблема продолжается и не устранена, было бы интересно узнать, почему это происходит и почему открытие инструментов разработчика и обновление решают проблему для меня.
Представьте 3-ю модель... Сиденья, который имеет ссылку и на место и на человека. Затем можно создать экземпляр той модели каждый раз, когда кто-то садится, добавьте некоторые проверки для предотвращения двух человек, сидящих на том же месте, и возможно даже добавьте некоторые тайм-ауты (нахождение на месте слишком долго, при потере его).
Проблемой является Ваша модель, определяется с круговой зависимостью. Существует два способа избежать этого.
Первый точно не следует, "Говорят, не Спрашивайте" явно, но это становится ближе к точке. Мы пытаемся узнать, можем ли мы сесть, затем сказать стулу, что мы сидим в нем.
void Person.SitDown(Seat seat) {
if (seat.AcceptsPlayer(this)) {
seat.SeatPerson(this);
this.Status = Status.Sitting;
}
}
void Seat.SeatPerson(Person person) {
this.Seated = person;
}
Лучший способ сделать это (который следует, "Говорят, не Спрашивайте" более явно), могло бы быть следующим. Мы пытаемся председательствовать. Если стул отклоняет нас, мы знаем.
void Person.SitDown(Seat seat) {
if (seat.SeatPerson(this)) {
this.Status = Status.Sitting;
}
else
{
//Couldn't sit down!
}
}
bool Seat.SeatPerson(Person person) {
if (this.IsAccepted(person) && this.Seated == null) {
this.Seated = person;
return true;
}
else
{
return false;
}
}
Используйте обратный вызов так, чтобы каждый класс мог поддержать состояние, за которое это ответственно.
public class Seat
{
public void SeatPerson(Person person, Action successAction)
{
if (IsAccepted(person))
{
this.Seated = person;
successAction();
}
}
}
public class Person
{
public void Sit(Seat seat)
{
seat.SeatPerson(this, this.SitComplete);
}
public void SitComplete()
{
this.Status = Sitting;
}
}
Здесь существует все еще циклическая зависимость.
Место несет ответственность проверить, что человек, пытающийся находиться, допустим, чтобы сделать так. Место несет ссылку на человека, после того как они находились. Человек только знает, что метод пытается сидеть на месте.
Условно, за successAction нельзя держаться дольше, чем вызов SeatPerson. Это гарантирует, что Место не может поставить под угрозу состояние Человека.
позвольте человеку попытаться сесть на место и обновление, это - состояние в зависимости от успеха операции:
Просто назовите myPerson. TrySeat (targetseat), который возвращает true если процесс нахождения, за которым следуют.
//inside Person class
public bool TrySeat(Seat seat)
{
if (seat.TrySeat(this))
{
Status = Sitting;
return true;
}
else
{
return false;
}
}
//inside Seat class
internal bool TrySeat(Person person)
{
if (CanSeat(person))
{
Seated = person;
return true;
}
else
{
return false;
}
}